我使用CreateProcess()
函数使用“mstsc.exe”启动rdp客户端应用程序。之后,我想终止它,所以我使用TerminateProcess()
函数,但它失败,错误代码为5.如果我用“notepad.exe”替换“mstsc.exe”,则终止函数有效。代码如下:
TCHAR szCommandLine[] = TEXT("mstsc.exe");
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
BOOL bResult = CreateProcess(NULL, szCommandLine, NULL, NULL,
FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
::Sleep(3000);
if (TerminateProcess(pi.hProcess, 0) == 0) {
printf("failed: %d", GetLastError());
}
任何人都可以帮忙解释并解决它吗?
我观察到的是返回的pi
的pid与taksmanager或“Process Explorer”中观察到的进程“mstsc.exe”的ID不同。
答案 0 :(得分:3)
您的主机进程是32位还是在64位Windows上运行?
如果是这样,你正在调用32位mstsc并且它正在产生64位版本,因此产生不同的PID。查看this thread
答案 1 :(得分:2)
在终止其他进程之前,您必须获得该权限。
试试这个:
void UpdatePrivilege(void)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
{
LookupPrivilegeValue(NULL,SE_DEBUG_NAME, &luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
}
}
在调用TerminateProcess之前调用此函数。