user2154631
user2154631

Reputation:

CreateProcess @ Unhandled exception when not using directly a string

I'm trying to use CreateProcess to open a game .exe but I'm having the unhandled exception error. I already figured out the problem and the solution, but I need to get the path for the second parameter of CreateProcess from a file dialog box (that part is done and works). The problem is:

For the second parameter of CreateProcess, I need to declare a variable with the value to it (the 2nd param), but if I "point" it to the variable of the path to the file selected in the file dialog box, it doesn't work anymore.

I'm sorry if this is a really dumb question, but I'm starting in C++.

The code that works is here:

    wchar_t szGameDir[] = L"PATH_TO_EXE";

    if ( CreateProcess (
        NULL,
        szGameDir, NULL, NULL, FALSE,
        CREATE_UNICODE_ENVIRONMENT,
        NULL, NULL,
        &pstStartupInfo, &pstProcInfo ) )

But when I set szGameDir to the value of 'pszGameDir' (path to the EXE selected by the user), it gives the unhandled exception error...

wchar_t* szGameDir = pszGameDir;

if ( CreateProcess (
        NULL,
        szGameDir, NULL, NULL, FALSE,
        CREATE_UNICODE_ENVIRONMENT,
        NULL, NULL,
        &pstStartupInfo, &pstProcInfo ) )

And this is where I initialize 'pszGameDir':

OPENFILENAME DialogBox;
ZeroMemory ( &DialogBox, sizeof(DialogBox) );

DialogBox.lStructSize       = sizeof(OPENFILENAME);
DialogBox.hwndOwner         = NULL;
DialogBox.lpstrFilter       = L"Grand Theft Auto: Vice City (*.exe)\0*.exe\0";
DialogBox.lpstrFile         = (LPTSTR)this->pszGameDir;
DialogBox.nMaxFile          = MAX_PATH;
DialogBox.nMaxFileTitle     = sizeof ( L"gta-vc.exe" );
DialogBox.lpstrTitle        = L"Please, select 'gta-vc.exe'";
DialogBox.Flags             = 0x02000000 | 0x00001000 | 0x00000400 | 0x10000000 | 0x00020000 | 0x00000800 | 0x0000008;
DialogBox.nFileExtension    = (WORD)"exe";
DialogBox.lpstrDefExt       = L"exe";

return GetOpenFileName ( &DialogBox ) != 0 ? 1 : NULL;

Can someone help me? (Yes, I did search already, but honestly I haven't found about this specific thing, I wasn't able to fix it either..)

Upvotes: 1

Views: 549

Answers (1)

tyranid
tyranid

Reputation: 13318

CreateProcess needs the command line parameter to be writeable. Read the description of the argument at MSDN:

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

It has to be writeable, I am afraid.

Upvotes: 1

Related Questions