CreateProcess() c++ file not found

后端 未结 4 1033
星月不相逢
星月不相逢 2021-01-22 15:18

I\'m trying to use CreateProcess to start a child process, however I keep getting error 2, which, according to the documentation is file not found.

相关标签:
4条回答
  • 2021-01-22 15:23

    The CreateProcess function is very sensitive when it comes to file names, at least in my opinion. When you specify your exe like that you actually specify it according to the current directory which may not be the same as the directory your main exe is in, which explains the file not found. One way around is to simply get your current exe's directory with GetModulePath stip away the exe name from that and there you have the same directory, or simply use an absolute path.

    According to the CreateProcess documentation the first parameter can be NULL :

    The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string.

    At least for me it seemed that if you just specify the command line only it works far better than with the application name, and also within the application name you can't handle the commandline.

    0 讨论(0)
  • 2021-01-22 15:25

    Error 2 is ERROR_FILE_NOT_FOUND. As others have told you, you are relying on a relative path when you need to use an absolute path instead.

    Also, LPCTSTR("test.exe") is not valid code. If UNICODE is defined, CreateFile() maps to CreateFileW(), and LPCTSTR maps to LPCWSTR ie const wchar_t*. You cannot typecast a char* to a wchar_t* and end up with meaningful data. If you want to use TCHAR-sensitive literals, use the TEXT() macro instead, eg:

    if (!CreateProcess(TEXT("full path to\\test.exe"), ...))
    

    Otherwise, forget using TCHAR and just write Ansi-specific or Unicode-specific code instead, depending on your needs:

    if (!CreateProcessA("full path to\\test.exe", ...))
    

    if (!CreateProcessW(L"full path to\\test.exe", ...))
    
    0 讨论(0)
  • 2021-01-22 15:35

    test.exe is never being looked up in the directory that the calling exe lives in. It is being looked up in the current directory which is a per-process path variable. Maybe the current directory is not pointed to where test.exe lives. You should also never rely on that because it can change arbitrarily (for example by using the file dialogs, or when the parent process changes it).

    0 讨论(0)
  • 2021-01-22 15:48

    With QT the MSDN function TEXT() it doesn't work: QTCreator's compiler return:

    'Lvar' undeclared (first use in this function)

    where var is input of Text(), because of QT whose enable UNICODE and because of that:

        #ifdef UNICODE
    /*
     * NOTE: This tests UNICODE, which is different from the _UNICODE define
     *       used to differentiate standard C runtime calls.
     */
    typedef WCHAR TCHAR;
    typedef WCHAR _TCHAR;
    /*
     * __TEXT is a private macro whose specific use is to force the expansion of a
     * macro passed as an argument to the macro TEXT.  DO NOT use this
     * macro within your programs.  It's name and function could change without
     * notice.
     */
    #define __TEXT(q) L##q
    #else
    typedef CHAR TCHAR;
    typedef CHAR _TCHAR;
    #define __TEXT(q) q
    #endif
    
    #endif
    

    in particular this passage:

    #define __TEXT(q) L##q
    

    in winnt.h included by windows.h
    So, to solve this problem, we have to add this:

    DEFINES -= UNICODE
    

    in the .pro file of the QTCreator's project and it will work.

    0 讨论(0)
提交回复
热议问题