操作平台: win2k代码:
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szPath[]=TEXT("c:\\windows\\PBRUSH.EXE");//创建一个新进程:
CreateProcess(NULL,szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//等待子进程终结:
DWORD dw=WaitForSingleObject(pi.hProcess,INFINITE);
switch(dw){
case WAIT_OBJECT_0:
MessageBox(NULL,"right 1","",0);
break;
case WAIT_TIMEOUT:
MessageBox(NULL,"right 2","",0);
break;
case WAIT_FAILED:
MessageBox(NULL,"right 3","",0);
break;
}结果是:子进程一创建,立刻就弹出MessageBox 1,即使更改等待的时间值,
也没任何效果. 按理该是子进程结束,才会MessageBox 1,请大虾看看,
在线等待..
up送分.
STARTUPINFO si={sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szPath[]=TEXT("c:\\windows\\PBRUSH.EXE");//创建一个新进程:
CreateProcess(NULL,szPath,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);//等待子进程终结:
DWORD dw=WaitForSingleObject(pi.hProcess,INFINITE);
switch(dw){
case WAIT_OBJECT_0:
MessageBox(NULL,"right 1","",0);
break;
case WAIT_TIMEOUT:
MessageBox(NULL,"right 2","",0);
break;
case WAIT_FAILED:
MessageBox(NULL,"right 3","",0);
break;
}结果是:子进程一创建,立刻就弹出MessageBox 1,即使更改等待的时间值,
也没任何效果. 按理该是子进程结束,才会MessageBox 1,请大虾看看,
在线等待..
up送分.
这意思是当等到 pi.hProcess有信号是才返回WAIT_OBJECT_0 你现在创建进程当然 pi.hProcess马上就是有信号了,所以会出现这样的结果.
{
BYTE szBuf[240];
LONG ret;
DWORD dwLen, dwType;
HKEY hsub; memset(path, 0, size);
ret = RegOpenKeyEx(
HKEY_CLASSES_ROOT,
//以下注册键注册了mspaint的服务
//ProgID -> Paint.Picture
"CLSID\\{D3E34B21-9D75-101A-8C3D-00AA001A1652}\\LocalServer32",
0,
KEY_READ | KEY_QUERY_VALUE,
&hsub); if(ret == ERROR_SUCCESS)
{
dwLen = sizeof(szBuf);
dwType = REG_SZ;
ret = RegQueryValueEx(hsub, NULL, NULL, &dwType, szBuf, &dwLen);
if(ret == ERROR_SUCCESS)
{
strncpy(path, (char *)szBuf, size);
path[size - 1] = 0;
return TRUE;
}
} return FALSE;
}/************************************************************************
函数:StartMspaint
作用:启动画笔编辑指定文件image,在画笔退出前等待dwMilliseconds毫秒。
参数:
image 传递的位图文件名称,不可为NULL
dwMilliseconds 等待时间,单位和WaitForSingleObject对应的时间单位一
样,都是毫秒。
返回值:
启动成功 TRUE
启动失败 FALSE
************************************************************************/
BOOL StartMspaint(const char *image, DWORD dwMilliseconds)
{
char szMspaint[_MAX_PATH], szCmd[_MAX_PATH * 2];
PROCESS_INFORMATION pi;
STARTUPINFO si;
RegMspaintPath(szMspaint, sizeof(szMspaint));
_snprintf(szCmd, sizeof(szCmd), "%s \"%s\"", szMspaint, image);
szCmd[sizeof(szCmd) -1] = 0;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.wShowWindow = SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
BOOL fRet=CreateProcess(NULL,
szCmd,
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, //|CREATE_SUSPENDED,
NULL,
NULL,
&si,
&pi); if(! fRet)
{//创建失败,显示错误信息
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL );
AfxMessageBox( (LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf ); return FALSE;
}
else
{
// ResumeThread(pi.hThread ); if(LoadMapint("mpaint.dll"))
{
PROC_WINDOWS proc_windows; memset(&proc_windows, 0, sizeof(proc_windows));
proc_windows.pid = pi.dwProcessId;
EnumWindows(ListMsPaintWindow, (LPARAM)&proc_windows); if(hookmsg)
{
hookmsg(pi.dwProcessId, proc_windows.tid);
}
} WaitForSingleObject(pi.hProcess , dwMilliseconds);
} return TRUE;
}我当时需要往mspaint.exe里面加载一个dll,修改一些界面,以上是我启动mspaint的代码,好像在win9x下面也是没有问题的,我不知道你是不是也是在win2k下面运行win9x的pbrush.exe,这样好像是有问题,用我的代码看看,有问题再告诉我。
to:chenm001(CM)
呵呵,偶的理解没错.to: oldworm(oldworm) 大虾,感谢. 的确,我把 "c:\\windows\\PBRUSH.EXE"
改成:"D:\\winnt\\NOTEPAD.EXE" 没有问题,如所预期的结果.
可就疑惑了:换了其它的exe文件,也成. PBRUSH.exe是怎么会事?
ExitProcess
GetCommandLineA
GetModuleHandleA
GetStartupInfoA
ShellExecuteA
原来这个程序仅仅执行ShellExecute(..., "mspaint.exe", ...);
就立即退出,结果WaitForSingleObject立即得到信号。
ExitProcess
GetCommandLineA
GetModuleHandleA
GetStartupInfoA
ShellExecuteA
原来这个程序仅仅执行ShellExecute(..., "mspaint.exe", ...);
就立即退出,结果WaitForSingleObject立即得到信号.
Dependencies是依赖的意思,就是导入了那些函数(API)