2010-06-05 45 views
2

我想在我的COM服务器的入口点的cpp中有一个静态全局std :: unordered_map。全局std :: unordered_map com服务器初始化问题

相关头代码:

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的一个实例,用全局指针指向它。 :/

为什么?

+0

您的“相关标题代码”不能正确。 'unordered_map'是一个模板。 “我能做到这一点的唯一方法是......”如果你修正了typedef,你用代码写的代码会产生什么错误? – 2010-06-05 22:44:52

+0

嗯,我不知道如何解决格式化*模板* HWND,IMyInterface * end_template *(因为它在那里它只是没有显示在帖子上):/和我得到没有错误,因为它上面编译然后运行,然后在尝试访问地图时出现一些疯狂现象。 – 2010-06-05 22:52:05

+0

Ahhh;我已经修复了你的格式。缩进四行空格会导致它们被渲染为代码;不需要预先或代码标签。 – 2010-06-05 22:56:08

回答

0

您需要修改的DllMain明确初始化C运行时:http://support.microsoft.com/kb/814472

搜索“来修改基于COM的DLL”

静态对象与构造函数通常会得到通过CRT切入点这对于初始化。然后exes调用你的程序的主要功能。使用DLL,你必须亲自完成工作。