2013-10-10 3 views
0

Я создаю процесс из своего приложения, используя createprocess() с параметром lpCurrentDirectory, но он не работает. Он дает ошибку «Система не может найти указанный путь». мой код CreateProcess("XYZ\\bin\\run.bat", NULL, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, "XYZ\\bin", &siStartupInfo, &piProcessInfo) ; Я также даю полный путь как lpCurrentDirectory, получая curent-каталог с помощью GetCurrentDir() и добавляя XYZ\\bin в текущий каталог, но он все равно не работает. Я хочу, чтобы мой командный файл запускался из lpCurrentDirectory. Я не понимаю, как createProcess() работает с параметром lpCurrentDirectory. Ожидается ли полный путь или относительный путь?CreateProcess() не работает с lpCurrentDirectory

Я также пробовал это с помощью hardcoding Полный путь, но он отображал ту же ошибку. На самом деле мой оригинальный код, `

char cCurrentPath[FILENAME_MAX]; 

if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath))) 
{ 
    printf("\n error..."); 
} 

string path(cCurrentPath); 
path += "\\XYZ\\bin"; 

wstring_convert<std::codecvt_utf8<wchar_t>> converter;   

wstring wstringData = converter.from_bytes(path); 

TCHAR lpszClientPath[500]= TEXT("XYZ\\bin\\run.bat /y"); 

if(::CreateProcess(NULL, lpszClientPath, NULL, NULL, TRUE, CREATE_NEW_CONSOLE,NULL, wstringData.c_str(), &si, &pi) > 0) 

`.

+0

В документации однозначно указано, что 'lpCurrentDirectory' должен быть полным путем. Вы пробовали жесткое кодирование действительного полного пути в свой код? Также обратите внимание, что вы не можете запускать пакетный файл напрямую, вместо этого вы должны запустить 'cmd/c xyz \\ bin \\ run.bat'. –

+0

Все манипуляции и преобразование строк могут вызвать проблемы. Вы пытались использовать 'MessageBox (NULL, wstringData.c_str(), L" test ", MB_OK)' вместо 'CreateProcess', чтобы увидеть, какую строку вы фактически отправляете в качестве целевого каталога? Вы дважды проверили, что этот целевой каталог действительно существует? Почему вы не используете 'GetCurrentDirectory' для получения текущего каталога в Юникоде? –

+0

NB: вне зависимости от вашей проблемы, код, записанный, будет * не * работать, если путь к каталогу содержит любые символы, отличные от ASCII. –

ответ

0

Пожалуйста, взгляните на this. Вы должны прочитать весь поток, поскольку он повторяет ответы, которые были предоставлены вам в предыдущем потоке.

+0

Спасибо за быстрый ответ, но я думаю, что вы не понимаете моего требования, мое приложение создает для установки драйвера, если я не укажу lpCurrentDirectory, он работает нормально, но когда я укажу его, он не работает. Мой командный файл с использованием команды CD для текущей директории, поэтому мне нужно запустить ее из каталога, содержащего этот пакетный файл, не от того, где выполняется мое фактическое приложение. – minu

0

Этот код работает для меня как в Windows 7, так и в Windows XP.

#include <Windows.h> 

void showcd(wchar_t * caption) 
{ 
    wchar_t buffer[512]; 

    if (GetCurrentDirectory(512, buffer) == 0) 
    { 
     DWORD err = GetLastError(); 
     MessageBox(NULL, L"GetCurrentDirectory failed", caption, MB_OK); 
     ExitProcess(err); 
    } 

    buffer[511] = L'\0'; 
    MessageBox(NULL, buffer, caption, MB_OK); 
} 

void parent(wchar_t * cd) 
{ 
    wchar_t cmd[512]; 
    wchar_t buffer[512]; 

    STARTUPINFO sinfo; 
    PROCESS_INFORMATION pinfo; 

    GetStartupInfo(&sinfo); 

    showcd(L"Parent Process"); 

    if (GetCurrentDirectory(512, buffer) == 0) 
    { 
     DWORD err = GetLastError(); 
     MessageBox(NULL, L"GetCurrentDirectory failed", L"Parent Process", MB_OK); 
     ExitProcess(err); 
    } 

    buffer[511] = L'\0'; 

    wcscat_s(buffer, 512, L"\\"); 
    wcscat_s(buffer, 512, cd); 

    if (GetModuleFileName(NULL, cmd, 512) == 0) 
    { 
     MessageBox(NULL, L"GetModuleFileName failed", L"Parent Process", MB_OK); 
     ExitProcess(GetLastError()); 
    } 

    cmd[511] = L'\0'; 

    if (!CreateProcess(
     cmd, NULL, NULL, NULL, FALSE, 0, NULL, buffer, &sinfo, &pinfo 
     )) 
    { 
     DWORD err = GetLastError(); 
     MessageBox(NULL, L"CreateProcess failed", L"Oops", MB_OK); 
     ExitProcess(err); 
    } 
} 

int CALLBACK WinMain( 
    _In_ HINSTANCE hInstance, 
    _In_ HINSTANCE hPrevInstance, 
    _In_ LPSTR lpCmdLine, 
    _In_ int nCmdShow 
) 
{ 
    wchar_t * cmdline; 
    for (cmdline = GetCommandLine(); *cmdline; cmdline++) 
    { 
     if (*cmdline == L'*') 
     { 
      parent(cmdline + 1); 
      return 0; 
     } 
    } 

    showcd(L"Child Process"); 
    return 0; 
} 

Вы можете проверить это следующим образом:

C:\Documents and Settings\Administrator>dir 
Volume in drive C has no label. 
Volume Serial Number is 6080-CDD5 

Directory of C:\Documents and Settings\Administrator 

13/12/2012 09:56 a.m. <DIR>   . 
13/12/2012 09:56 a.m. <DIR>   .. 
18/05/2012 03:10 p.m. <DIR>   Desktop 
20/06/2008 11:45 a.m. <DIR>   Favorites 
19/10/2010 02:54 p.m. <DIR>   My Documents 
20/06/2008 04:15 a.m. <DIR>   Start Menu 
       1 File(s)    43 bytes 
       6 Dir(s) 29,912,666,112 bytes free 

C:\Documents and Settings\Administrator>\appendtocurrentdirectory.exe *My Documents 
+0

Проблема заключается в том, что отправитель передает файл .bat в CreateProcess. –

+0

@DavidHeffernan: Да, это одна проблема (которая уже была указана), но это не объясняет путь, который не найден. :-) –

0

CreateProcess для исходных процессов, и вы должны пройти исполняемый файл. Вы не можете передать .bat. Вместо этого вам нужно запустить cmd.exe с параметром/C и передать командный файл в качестве аргумента.

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