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。
最佳答案
是的,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 选项。
关于c++ - 通过 Windows API 函数替换对 AfxGetInstanceHandle() 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18120843/