Windows API 中的新进程

New process in Windows API

我使用 WinAPI,我有一个创建新进程的函数:

void new_process() {
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    TCHAR szCommandLine[] = TEXT("NOTEPAD");
    CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

但是当我从 main() 调用这个函数时,它不起作用:

void new_process(TCHAR szCommandLine[]) {
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

int _tmain(int argc, _TCHAR* argv[]) {
    new_process(TEXT("NOTEPAD"));
    return 0;
}

我的错误在哪里?

问题已解释here。 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.

当您将 TEXT("NOTEPAD") 作为参数传递给函数 new_process(TCHAR szCommandLine[]) 时,函数又将其作为 lpCommandLine 参数传递给 CreateProcess() API, 它将尝试修改此位置,如上面从 MSDN 引用的那样。

由于参数 TEXT("NOTEPAD") 是一个 CONSTANT 内存,当 CreateProcess() 试图按照上面引用的方式修改此内存时,将导致内存访问冲突。

所以理想情况下,您应该从 main() 函数中调用函数 new_process(TCHAR szCommandLine[]),如下所示。

TCHAR APP_NAME[] = TEXT("NOTEPAD");   
new_process(APP_NAME);

希望对您有所帮助!