c++ - 通过 Windows API 函数替换对 AfxGetInstanceHandle() 的调用

标签 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。

最佳答案

是的,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 选项。

关于c++ - 通过 Windows API 函数替换对 AfxGetInstanceHandle() 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18120843/

相关文章:

C 参数定义问题

c - USART 传输 - AVR (atmega169p) 接收到 0 或 null 而不是 char 'a'

C:混淆一个整数

windows - 在 Linux 上忽略 Apache 指令 'ScriptInterpreterSource'

python - 是否有与 Borland C 命令 putpixel 等效的 Matplotlib?

c++ - 如何使用 Win32/MFC API 提取 .iso 文件?

c++ - 如何清空文件中的一行并将其写回原来的位置?

c++ - 为什么在 C++ 的 if 语句中,所有可能的整数 "true"都在 long int 的范围内,而 0 却不是?

c++ - 尽管类型足够大,整数还是溢出?

c++ - 是否可以在没有拷贝的情况下将 std::vector<int> 作为参数传递给获得 std::vector<std::array<int, 3>> 的 fun?