用Windows API函数替换对AfxGetInstanceHandle()的调用

时间:2013-08-08 07:59:24

标签: c++ c windows process mfc

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。

1 个答案:

答案 0 :(得分:6)

是的,GetModuleHandle(NULL)有效。传递NULL会导致它返回调用进程的句柄(这是您的EXE文件)。

关于HMODULEHINSTANCE问题,HMODULEHINSTANCE used to be different way back in 16-bit Windows,但它们现在是相同的,可以互换使用。


但请注意,您没有正确使用此字段。您必须使用NULL初始化它。

然后进程启动并且ShellExecuteEx()返回后,该字段将包含已启动进程的旧版Windows 3.x启动错误代码。旧的HINSTANCE值,但仅在进程无法启动时。请注意,hProcess字段将设置为您启动的流程的流程句柄。当你完成使用它时,必须在该句柄上调用CloseHandle()。如果不这样做会导致永久性手柄泄漏。

确保这是您打算做的。如果您实际上并不想获取句柄,则省略SEE_MASK_NOCLOSEPROCESS选项。