服务中调用CreatProcessAsUser创建进程失败返回错误码6,无效的handle,请问这个问题怎么解决
PROCESSENTRY32 pe;
// explorer.exe的进程ID
DWORD pid = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapshot, &pe))
return 0;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if (Process32Next(hSnapshot, &pe) == FALSE)
break;
if (wcscmp(pe.szExeFile, L"cmd.exe") == 0)
{
pid = pe.th32ProcessID;
break;
}
} while (1);
CloseHandle(hSnapshot);
/* 以全部权限打开explorer.exe 进程 */
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
/* 创建启动信息结构体 */
STARTUPINFOEXA si;
/* 初始化结构体 */
ZeroMemory(&si, sizeof(si));
/* 设置结构体成员 */
si.StartupInfo.cb = sizeof(si);
SIZE_T lpsize = 0;
/* 用微软规定的特定的函数初始化结构体 */
InitializeProcThreadAttributeList(NULL, 1, 0, &lpsize);//首先要获取到需要初始化的大小
char * temp = new char[lpsize];
/* 转换指针到正确类型 */
LPPROC_THREAD_ATTRIBUTE_LIST AttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)temp;
/* 真正为结构体初始化属性参数 */
InitializeProcThreadAttributeList(AttributeList, 1, 0, &lpsize);//设置AttributeList结构体属性个数以及初始化它的大小
/* 用已构造的属性结构体更新属性表 */
if (!UpdateProcThreadAttribute(AttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &handle, sizeof(HANDLE), NULL, NULL))
{
//更新AttrubuteList 属性,添加PROC_THREAD_ATTRIBUTE_PARENT_PROCESS属性
printf("UpdateProcThreadAttribute failed ! (%d).\n", GetLastError());
}
/* 移交指针,这里已更换了父进程的属性表是 explorer.exe */
si.lpAttributeList = AttributeList;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
//当调用下面的api 且createFlags的参数是EXTENDED_STARTUPINFO_PRESENT时,lpStartupInfo就需要有扩展的信息,也就是这条属性:PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
if (CreateProcessAsUserA(NULL, 0, "C:\\Users\\Administrator\\Desktop\\Play.exe", 0, 0, 0, EXTENDED_STARTUPINFO_PRESENT, 0, 0, (LPSTARTUPINFOA)&si, &pi))
{
printf("CreateProcessAsUserA success ! \n");
}
else
{
printf("CreateProcessAsUserA failed ! (%d). \n ", GetLastError());
}
/* 处理后事 */
DeleteProcThreadAttributeList(AttributeList);
delete tmp;
CloseHandle(handle);
不是CreatProcessAsUser的问题,而是调用OpenProcess的时候就已经是返回的空指针了
有两种方式,一种是将if (wcscmp(pe.szExeFile, L"cmd.exe") == 0)
改为if (wcscmp(pe.szExeFile, L"explorer.exe") == 0)
即可
另一种是启动一个cmd进程,按下win+R
输入cmd
回车,然后再运行程序也可以
如有帮助,请采纳,谢谢。