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);
希望对您有所帮助!
我使用 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);
希望对您有所帮助!