2015-01-13 4 views
0

У меня есть приложение, в котором пользователь загружает файл на удаленный сервер, тот же сервер для получения этого файла должен запускать это приложение. Я использую метод CreateProcess. Проблема в том, что каталог файлов уже определен в std :: string, и мне трудно передать этот каталог в качестве параметра CreateProcess.CreateProcess execute EXE

Как я могу передать этот каталог в CreateProcess без ошибок?

//the client remotely sends the directory where the file will be saved 
    socket_setup.SEND_BUFFER("\nRemote directory for upload: "); 
    char *dirUP_REMOTE = socket_setup.READ_BUFFER(); 
    std::string DIRETORIO_UP = dirUP_REMOTE; // variable where it stores the remote directory 


     //after uploading this is validation for executing file 
if (!strcmp(STRCMP_EXECUTE, EXECUTE_TIME_YES)) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    std::wstring wdirectory; 
    int slength = (int)directory.length() + 1; 
    int len = MultiByteToWideChar(CP_ACP, 0, directory.c_str(), slength, 0, 0); 
    wdirectory.resize(len); 
    MultiByteToWideChar(CP_ACP, 0, directory.c_str(), slength, &wdirectory[0], len); 
    if (!CreateProcess(NULL, wdirectory.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)); 
} 
+0

Вы не передавая ни один путь + имя файла в 'CreateProcess()', вы устанавливаете как 'lpApplicationName', так и' lpCommandLine' значение NULL. Один из них должен указать exe-файл, который вы хотите выполнить. Так в чем же проблема? Что вы не знаете, как объединить струны вместе? Вы знаете, как передать 'std :: string' в' CreateProcess() '(через метод' c_str() '). Просто убедитесь, что вы вызываете 'CreateProcessA()', а не 'CreateProcessW()', если вы компилируете свое приложение с включенным UNICODE. –

+2

Вы разрешаете пользователям загружать исполняемый файл на ваш сервер, а затем вы его выполняете? Хлоп !!!! –

+0

'wstring.c_str()' возвращает константную строку, которая не подходит для передачи в качестве командной строки, вы должны выделить буфер, который вы можете изменить и передать, вместо этого. Из документации: 'Unicode-версия этой функции CreateProcessW может изменять содержимое этой строки.' –

ответ

1

Есть две версии CreateProcess: CreateProcessA и CreateProcessW (как и большинство подобных API для Windows). Правильная версия используется в зависимости от того, включен ли Unicode. Здесь вам нужно сначала преобразовать std :: string в std :: wstring, потому что CreateProcess на самом деле является CreateProcessW.

std::wstring wdirectory; 
int slength = (int)directory.length() + 1; 
int len = MultiByteToWideChar(CP_ACP, 0, directory.c_str(), slength, 0, 0); 
wdirectory.resize(len); 
MultiByteToWideChar(CP_ACP, 0, directory.c_str(), slength, &wdirectory[0], len); 
//... 
if (!CreateProcess(NULL,(LPWSTR)wdirectory.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)); 

Вы могли бы также попробовать заменить CreateProcess ручным вызовом CreateProcessA и передавая CString как вы пытались сделать в этом вопросе, но тогда вы не будете поддерживать широкие символы:

if (!CreateProcessA(NULL, directory.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)); 
+1

Я пробовал, но у меня есть следующая ошибка: аргумент типа" const wchar_t * "несовместим с параметром типа "LPWSTR" – Mrdk

+0

@Lulieyt что делать, если вы передаете & wdirectory [0] вместо wdirectory.c_str()? По-видимому, он ожидает неконстантного wchar_t *. Или просто вручную отбрасывайте (LPWSTR), если хотите. – tux3

+0

@Lulieyt, да, вы пробовали с & wdirectory [0] или с литой? – tux3

 Смежные вопросы

  • Нет связанных вопросов^_^