SHELLEXECUTEINFO info;
// Initializing struct
info.cbSize = sizeof(info);
info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
info.hwnd = NULL;
info.lpVerb = _T("open");
info.lpParameters = sParameters_p;
info.lpDirectory = _T("");
info.nShow = SW_SHOW;
info.hInstApp = NULL;
info.lpFile = sFileName_p;
// Problem here :
info.hInstApp = AfxGetInstanceHandle();
ShellExecuteEx(&info);
我是否可以使用Windows API中的函数来获取进程的HINSTANCE,以便我可以避免使用AfxGetInstanceHandle();
GetModuleHandle(NULL);
是否有效?它返回一个HMODULE而不是一个HINSTANCE。
答案 0 :(得分:6)
是的,GetModuleHandle(NULL)
有效。传递NULL
会导致它返回调用进程的句柄(这是您的EXE文件)。
关于HMODULE
与HINSTANCE
问题,HMODULE
和HINSTANCE
used to be different way back in 16-bit Windows,但它们现在是相同的,可以互换使用。
但请注意,您没有正确使用此字段。您必须使用NULL初始化它。
然后在进程启动并且ShellExecuteEx()返回后,该字段将包含已启动进程的旧版Windows 3.x启动错误代码。旧的HINSTANCE值,但仅在进程无法启动时。请注意,hProcess
字段将设置为您启动的流程的流程句柄。当你完成使用它时,必须在该句柄上调用CloseHandle()。如果不这样做会导致永久性手柄泄漏。
确保这是您打算做的。如果您实际上并不想获取句柄,则省略SEE_MASK_NOCLOSEPROCESS选项。