我想在我的 COM 服务器入口点的 cpp 中有一个静态全局 std::unordered_map。
相关头代码:
typedef unordered_map<HWND,IMyInterface*> MyMapType;
相关机构:
static MyMapType MyMap;
void MyFunction(HWND hWnd, IMyInterface* pObj){
MyMap[hWnd] = pObj;
}
HINSTANCE g_hInstModule = NULL;
BOOL WINAPI DllMain ( __in HINSTANCE hInstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved )
{
if( fdwReason == DLL_PROCESS_ATTACH )
{
g_hInstModule = hInstDLL;
return true;
}
else if( fdwReason == DLL_PROCESS_DETACH )
{
return true;
}
return false;
}
MyCoClass::MyCoClass()
{
DRM_Refcount = 1;
}
HRESULT STDMETHODCALLTYPE MyCoClass::InitMyCoClass()
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
//replace with make window code
MyFunction(hWnd,ISomeInterface);
return S_OK;
}
我能让它工作的唯一方法是创建一个 map_type 指针并在堆上创建一个 map_type 实例并用全局指针指向它。 :/
为什么?
最佳答案
您需要修改 DllMain 以显式初始化 C 运行时:http://support.microsoft.com/kb/814472
搜索“修改基于 COM 的 DLL”
具有构造函数的静态对象通常通过 CRT 入口点进行初始化,对于 .exes 然后调用程序的主函数。对于 DLL,您必须自己动手。
关于c++ - 全局 std::unordered_map com 服务器初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2982387/