用ATL生成一个支持MFC的dll工程,里面没有出现DllMain方法。但我要让这个dll实现线程本地存储,要在DllMain中加一段代码。怎么才能让这个DllMain出现呢?

解决方案 »

  1.   

    我自己写了一个上去,但抱错了
    MyIeBar error LNK2005: _DllMain@12 已经在 MyIeBar.obj 中定义
      

  2.   

    atl把WinMain给藏起来了,就像MFC把winmain藏起来一样。
    你在InitInstance加不行吗?
      

  3.   

    你再加个WinMain那当然不行了,一个程序怎么能有2个WinMain呢!
      

  4.   

    说实话,我对com不太熟,只是会用一点.TLS更是如此.
    看看这个东西
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_thread_local_storage_in_a_dynamic_link_library.asp
    我现在就是要让我的dll在被调用的时候,里面的全局变量不会互相影响.按照MSDN里讲的需要在DllMain中使用TLS,可没了DllMain,我该怎么办?
      

  5.   

    在DllCanUnloadNow()那个函数所在的cpp中加入
    BOOL WINAPI DllMain(
       DWORD dwReason,
       LPVOID /*lpReserved*/
    ) {
    switch ( dwReason )
    {
    case DLL_PROCESS_ATTACH:
    break;
    default:
    break;
    } return TRUE;
    }
      

  6.   

    是我给错了。
    atl中WinMain应该这样声明:
    extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    hInstance;
        return _AtlModule.DllMain(dwReason, lpReserved); 
    }但是atl中用mfc的话,就会有连接错误,因为atl,mfc中都对DllMain有定义。
    我觉得你应该去掉mfc支持。
      

  7.   

    1. 如果你是用Wizard选的ATL工程并且加上了MFC support的,会有一个App类的,和MFC一样,在它的InitInstance()里面加。不会出现两个DllMain,Wizard已经帮你处理好了。
    2. 如果使用tls的话,你的控件最好不要放到MTA中,否则STA线程访问它时因为经过RPC通道,线程ID每次都不一样,导致根本访问不到正确的TLS数据。
      

  8.   

    越来越复杂了。
    我就是想做一个嵌入IE的ToolBar,结果里面的公共变量会互相影响。所以想采用TLS的。
    我接触com的时间不长,很多东西只知道其然,不知其怎么然。我觉得楼上说的很对,可我怎么才能实现呢?帮忙再讲仔细一点。比如怎么实现STA?要不要在里面实现消息循环?如何在InitInstance中实现dll的TLS?
      

  9.   

    1. 一般VC wizard做的默认都是STA。会注册为apartment,另外会调用CoInitialize(0).
    2. TLS的咚咚,如果不是全局变量的话,可以用__declspec(thread),是全局变量的话,用TlsAlloc()那一系列api分配(用__declspec的话如果LoadLibrary加载dll会有问题)
      

  10.   

    明白一些了,我看了一下我的注册部分,也是将ThreadingModel建置为Appartment的.TlsAlloc该怎么用呢?我现在看到的例子都是放到DllMain里面的,可现在DllMain消失了。
    如果放到InitInstance中,就没有DWORD fdwReason,LPVOID lpvReserved这两个参数,怎么判断Attach和Dettach呢?是不是支持MFC的ATL工程部可以使用TLS?
      

  11.   

    1. InitInstance就是Attach, ExitInstance就是Detach
    2. TLS与是否MFC/ATL无关。直接用底层的API
    3. TlsAlloc, TlsSetValue, TlsGetValue等等是放到哪儿都可以的,不一定要在DllMain中。
      

  12.   

    基本上你可以这样。
    InitInstance里TlsAlloc出来一个index,保存到全局变量中
    线程中在需要的时候用TlsSetValue和TlsGetValue进行操作
    ExitInstance里TlsFree