1
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。

4

1 回答 1

6

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

至于HMODULEvs.HINSTANCE问题,HMODULE过去HINSTANCE 在 16 位 Windows 中是不同的方式,但它们现在是相同的,可以互换使用。


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

然后进程启动并且 ShellExecuteEx() 返回后,该字段将包含已启动进程的旧版 Windows 3.x 启动错误代码。旧的 HINSTANCE 值,但前提是进程无法启动。请注意,该hProcess字段将设置为您启动的进程的进程句柄。使用完毕后,您必须在该句柄上调用 CloseHandle()。否则将导致手柄永久性泄漏。

请确保这是您打算做的。如果您实际上对获取句柄不感兴趣,则省略 SEE_MASK_NOCLOSEPROCESS 选项。

于 2013-08-08T08:03:31.470 回答