一个进程中CreateProcess创建另外一个进程执行exe文件。此时在创建进程suspend exe进程(无代码),是否可行? 如题,请教高人帮忙,谢谢!一个进程中CreateProcess创建另外一个进程执行exe文件。此时在创建进程suspend exe进程(无代码),是否可行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CreateProcess里面的dwCreationFlags参数有个就是CREATE_SUSPENDED BOOL CreateProcess( LPCTSTR lpApplicationName, // name of executable module LPTSTR lpCommandLine, // command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD BOOL bInheritHandles, // handle inheritance option DWORD dwCreationFlags, // creation flags LPVOID lpEnvironment, // new environment block LPCTSTR lpCurrentDirectory, // current directory name LPSTARTUPINFO lpStartupInfo, // startup information LPPROCESS_INFORMATION lpProcessInformation // process information);我的意思是用上述函数开进程以后,UI界面接受到suspend消息后,我要通过什么函数或者方法来停止用CreateProcess开启的进程,因为此时进程已经在跑了。如果能给点参考代码,感激不尽啊。先谢谢各位朋友了。 我刚做过的一个程序,可以正常运行,你看看吧。希望对你有帮助。CString strFilePath1 =_T("picture1.exe"); PROCESS_INFORMATION pt; //STARTUPINFO si; //PC版这个参数不加,会导致创建进程出错,wce不用,直接为NULL memset(&pt, 0, sizeof(pt));// 将pt所指向的某一块内存中的每个字节的内容全部设置为0指定的ASCII值, //块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 if(!CreateProcess(strFilePath1, NULL, NULL, NULL, FALSE,CREATE_NEW_CONSOLE , NULL, NULL,/* &si*/NULL, &pt)) { AfxMessageBox(_T("CreateProcess err!")); DWORD err = GetLastError(); AfxMessageBox(CString(_T("err = %d"), err)); return; } WaitForSingleObject(pt.hProcess, INFINITE); CloseHandle(pt.hProcess); CloseHandle(pt.hThread); 谢谢 kasdmn目前我这个进程是能开,但是想知道能在进程运行时候暂停这个进程的方法。看了好多网站,一直没有找到。难道真的像zzdmfk 说的,开了进程,要再去暂停他就不行了?我是这么理解的,有句柄,应该有什么方法去pending一个进程?关键是我没有这个exe的代码!郁闷~~~~~这个帖子在顶一下,看看是否有解。 要想暂停一个运行的进程,你必须暂停它的所有线程才行:首先要提升当前进程的权限为DEBUG, 以便它能查询别的进程的所有线程:bool EnableDebugPriv() { BOOL bResult = TRUE; HANDLE hToken; TOKEN_PRIVILEGES TokenPrivileges; if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0) { printf("OpenProcessToken Error: %d\n",GetLastError()); bResult = FALSE; } TokenPrivileges.PrivilegeCount = 1; TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ; LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid); AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL); if(GetLastError() != ERROR_SUCCESS) { bResult = FALSE; } CloseHandle(hToken); return bResult;}然后挂起目标进程中所有线程bool SuspendProcess(DWORD dwProcessID,HANDLE hProcess,FILE* pFile){ HANDLE hSnapshot; bool bExist; bool bResult=true; HANDLE hThread; THREADENTRY32 ThreadEntry32; hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID); if(hSnapshot != INVALID_HANDLE_VALUE) { ThreadEntry32.dwSize = sizeof(THREADENTRY32); bExist = Thread32First(hSnapshot,&ThreadEntry32); while(bExist = Thread32Next(hSnapshot,&ThreadEntry32)) { if(ThreadEntry32.th32OwnerProcessID == dwProcessID) { hThread = OpenThread(THREAD_SUSPEND_RESUME,FALSE,ThreadEntry32.th32ThreadID); if(hThread != NULL) { fprintf(pFile,"Thread ID:%d\n",ThreadEntry32.th32ThreadID); SuspendThread(hThread); CloseHandle(hThread); } else { bResult = false; printf("Get next thread info failed\n"); break; } } } CloseHandle(hSnapshot); } else { bResult = false; printf("Get thread snap shot failed\n"); } return bResult;} SuspendProcess中第一个参数是目标进程的ID,第二参数是目标进程的句柄 ADO方式连接数据库失败 操作剪切板的问题 帮忙看看代码错在那里 在DLL中提供网络服务 IE和VB中响应OCX事件造成IE和VB程序退出的问题 怎样使单文档多视图程序中的视图的大小随着主框架窗口大小的改变而改变? (散分,庆贺)我有女儿啦!!!!!!! 奇怪的问题 “形参和实参不相等”。。。。? Visual Studio.NET 2003与SP1冲突? 谁能告诉我 InstallShield打包问题? 视频中出现绿色条纹的干扰!高手请进
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
我的意思是用上述函数开进程以后,UI界面接受到suspend消息后,我要通过什么函数或者方法来停止用CreateProcess开启的进程,因为此时进程已经在跑了。
如果能给点参考代码,感激不尽啊。先谢谢各位朋友了。
PROCESS_INFORMATION pt;
//STARTUPINFO si; //PC版这个参数不加,会导致创建进程出错,wce不用,直接为NULL memset(&pt, 0, sizeof(pt));// 将pt所指向的某一块内存中的每个字节的内容全部设置为0指定的ASCII值,
//块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 if(!CreateProcess(strFilePath1, NULL, NULL, NULL, FALSE,CREATE_NEW_CONSOLE , NULL, NULL,/* &si*/NULL, &pt))
{
AfxMessageBox(_T("CreateProcess err!"));
DWORD err = GetLastError();
AfxMessageBox(CString(_T("err = %d"), err));
return;
}
WaitForSingleObject(pt.hProcess, INFINITE);
CloseHandle(pt.hProcess);
CloseHandle(pt.hThread);
看了好多网站,一直没有找到。难道真的像zzdmfk 说的,开了进程,要再去暂停他就不行了?我是这么理解的,有句柄,应该有什么方法去pending一个进程?关键是我没有这个exe的代码!郁闷~~~~~
这个帖子在顶一下,看看是否有解。
首先要提升当前进程的权限为DEBUG, 以便它能查询别的进程的所有线程:
bool EnableDebugPriv()
{
BOOL bResult = TRUE;
HANDLE hToken;
TOKEN_PRIVILEGES TokenPrivileges; if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
{
printf("OpenProcessToken Error: %d\n",GetLastError());
bResult = FALSE;
}
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ;
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
if(GetLastError() != ERROR_SUCCESS)
{
bResult = FALSE;
}
CloseHandle(hToken);
return bResult;}
然后挂起目标进程中所有线程
bool SuspendProcess(DWORD dwProcessID,HANDLE hProcess,FILE* pFile)
{
HANDLE hSnapshot;
bool bExist;
bool bResult=true;
HANDLE hThread;
THREADENTRY32 ThreadEntry32;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
if(hSnapshot != INVALID_HANDLE_VALUE)
{
ThreadEntry32.dwSize = sizeof(THREADENTRY32);
bExist = Thread32First(hSnapshot,&ThreadEntry32);
while(bExist = Thread32Next(hSnapshot,&ThreadEntry32))
{
if(ThreadEntry32.th32OwnerProcessID == dwProcessID)
{
hThread = OpenThread(THREAD_SUSPEND_RESUME,FALSE,ThreadEntry32.th32ThreadID);
if(hThread != NULL)
{
fprintf(pFile,"Thread ID:%d\n",ThreadEntry32.th32ThreadID);
SuspendThread(hThread);
CloseHandle(hThread);
}
else
{ bResult = false;
printf("Get next thread info failed\n");
break;
} }
}
CloseHandle(hSnapshot);
}
else
{
bResult = false;
printf("Get thread snap shot failed\n");
}
return bResult;
}