Winapi:插件中的createWindow

时间:2012-02-06 12:58:23

标签: c++ winapi visual-c++

我正在开发一个插件(由其他应用加载的dll)。有一个特殊的函数应该返回HWND,以便app可以显示一个对话框。问题是我不知道从哪里可以获得hInstance(它不作为参数传递给函数)。

看起来我不理解某些东西,我对所有这些东西都是新手,所以如果问题很愚蠢,请原谅。

UPD :尝试使用getModuleHandle获取hInstance:

void* createLoginDialog() {
    HINSTANCE hIns = (HINSTANCE) GetModuleHandle(L"comapping");
    HWND hWnd = CreateWindow(L"Popup",
                        L"Enter login",
                        WS_POPUP,
                        20,
                        20,
                        20,
                        20,
                        NULL,
                        NULL,
                        hIns,
                        NULL);
    return hWnd;
}

我仍然受到访问冲突。

2 个答案:

答案 0 :(得分:3)

根据CreateWindow的文档,hInstance参数是可选的。这意味着在此处传递NULL是有效的。但是,正如Simon Richter在对这个答案的评论中指出的那样,参数可能只是NULL窗口类在全球注册。

如果您正在编写DLL,您也可以自己定义DllMain入口点函数。 Windows调用此函数,将函数句柄作为第一个句柄传递。您可以在某处记住此句柄,以便在创建窗口时重复使用它。

答案 1 :(得分:3)

获得它的几种方法:

  • 第一个参数传递给您的DllMain()入口点,强制转换为HINSTANCE
  • GetModuleHandle()使用您的DLL名称,强制转换为HINSTANCE
  • VirtualQuery(),传递函数的地址。将返回的MEMORY_BASIC_INFORMATION.BaseAddress转换为HINSTANCE。适用于32位和64位版本的Windows。