shellexecuteEx 得不到 进程句柄, 有其他方法么?

winkkle 2004-10-26 08:42:25
给它任何文件的名字,它都能识别出来并打开它,使用ShellExecute/ShellExecuteEx是较好的方法。现在我想得到打开的程序或实例的句柄, 得不到。 察看msdn-ShellExecuteEx,
hProcess
Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft® Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL.
确实不行。
请问有没有其他的方式可以得到句柄呢? 找了一天没有找到合适的方法



...全文
390 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pepsi1980 2004-10-28
  • 打赏
  • 举报
回复
什么都可以打开。
xxedge 2004-10-27
  • 打赏
  • 举报
回复
对于不是可执行程序的文件,也可以打开么?例如想打开一个abc.doc文件,用CreateProcess可以么?
实际上调用的是Word呀。
Kudeet 2004-10-26
  • 打赏
  • 举报
回复
help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/security/security/starting_an_interactive_client_process.htm
dropingleaf 2004-10-26
  • 打赏
  • 举报
回复
学到不少
oyljerry 2004-10-26
  • 打赏
  • 举报
回复
使用CreateProcess命令

⑴ 函数原型:

BOOL CreateProcess(

LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttributes,

LPSECURITY_ATTRIBUTES lpThreadAttributes,

BOOL bInheritHandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInformation

);

⑵ 参数:

lpApplicationName:指向一个以空结尾的串,他指定了要执行的模块

lpCommandLine:指向一个以空结尾的串,该串定义了要执行的命令行。

lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。

lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。

bInheritHandles,:表明新进程是否从调用进程继承句柄。

dwCreationFlags:定义控制优先类和进程创建的附加标志。

lpEnvironment:指向一个新进程的环境块。

lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。

lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。

lpProcessInformation:指向PROCESS_INFORMATION结构,该结构接受关于新进程的表示信息。

⑶ 返回值:

若函数调用成功,则返回值不为0;若函数调用失败,返回值为0。

ShellExecute和WinExec命令用于简单的作业。如果要完全控制一个新进程,就必须调用CreateProcess。

在上述参数中,参数lpStartupInfo是STARTUPINFO结构。可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入和输出。新程序通常可以忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明要设置的数据段。有时,不想设置任何信息,也必须传递一个有效的指针给空结构(确定设置大小到cb,及设置dwFlags成员为0)。参数lpProcessInformation返回进程和线程句柄,还包括进程和线程ID。这些句柄拥有在参数lpProcessAttributes和lpThreadAttributes中规定的访问。

要注意,针对CreateProcess的一些参数对控制台应用程序是特定的,而其它参数则对各种应用程序有用。大多数情况下,并不一定要填入STARTUPINFO结构,但无论如何必须提供它。其返回值是布尔型的,而真正感兴趣的返回值发生于作为参数传送的结构中(PROCESS_INFORMATION)。CreateProcess返回该结构中的进程ID及其句柄,以及初始线程ID及其句柄。可以将ID发送到其它进程,或使用句柄来控制新进程。
kingzai 2004-10-26
  • 打赏
  • 举报
回复
STARTUPINFO startInfo;
PROCESS_INFORMATION pidInfo;

//
// child process
//
startInfo.cb = sizeof(STARTUPINFO);
startInfo.lpReserved = NULL;
startInfo.lpTitle = buf;
startInfo.lpDesktop = NULL;
startInfo.dwX = 0;
startInfo.dwY = 0;
startInfo.dwXSize = 0;
startInfo.dwYSize = 0;
startInfo.dwXCountChars = 0;
startInfo.dwYCountChars = 0;
startInfo.dwFlags = STARTF_USESTDHANDLES;
startInfo.wShowWindow = 0; //SW_SHOWDEFAULT;
startInfo.lpReserved2 = NULL;
startInfo.cbReserved2 = 0;
startInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);

b = CreateProcess(
progname,
buf,
NULL,
NULL,
TRUE,
0,//CREATE_NEW_CONSOLE,
NULL,
NULL,
&startInfo,
&pidInfo);

if(!b) {
printf("Creation of child process failed: err=%d\n", errno);
printf("applname=<%s>, buf=<%s>\n",applname,buf);
return;
}
t1 = pidInfo.hProcess;
ipgk 2004-10-26
  • 打赏
  • 举报
回复
CreateProcess,好像是这个,自己看MSDN。
winkkle 2004-10-26
  • 打赏
  • 举报
回复
前提是能够识别文件名并打开...

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧