如何在DLL中使用WTL?

时间:2009-03-25 19:29:47

标签: dll atl bho wtl

我正在尝试在进程内COM服务器DLL(IE BHO)中使用WTL,但我正在努力使用_Module。

我的DLL需要CMyModule来自CAtlDllModuleT<>

class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
    DECLARE_LIBID(LIBID_MyLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};

CMyModule _Module;

extern "C" BOOL WINAPI DllMain(...)
{
    hInstance;
    return _Module.DllMain(dwReason, lpReserved); 
}

...

STDAPI DllUnregisterServer(void)
{
    return _Module.DllUnregisterServer();
}

但这与大多数WTL示例相冲突,这些示例在stdafx.h中需要类似的内容:

extern CAppModule _Module; // WTL version of CComModule

无论我采用哪种方式,我(不出所料)都会遇到编译错误。 CMyModule CAppModule来自_Module.DllUnregisterServer()CMyModule borks CAtlDllModuleT<> _Module.GetMessageLoop()来自{{1}} borks,代码为{{1}}。

关于WTL如何在DLL中工作的任何好的参考?谷歌发现很多问题,答案很少。

3 个答案:

答案 0 :(得分:1)

我有一个在DLL中使用WTL的项目。我查看了我的标题是如何设置的,看起来我已经破解了同样的问题......

我的模块设置类似于继承自CAtlDllModuleT的样本代码&lt;&gt;除了全局模块变量的名称是_AtlModule而不是_Module。例如:

class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
    DECLARE_LIBID(LIBID_MyLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};

CMyModule _AtlModule;

因此,所有DllMain.cpp入口点都使用_AtlModule。然后在stdafx.h文件中它看起来像这样:

// WTL includes
#define _Module (*_pModule)
#include <atlapp.h>
#include <atlctrls.h>
#include <atldlgs.h>
#undef _Module

_pModule事件在atlbase.h中定义,如:

__declspec(selectany) CComModule* _pModule = NULL;

必须有更好的方法,但这确实有效。

答案 1 :(得分:0)

您是否考虑过多重继承选项?尝试继承CAtlDllModule和CAppModule,因为你需要两者。

答案 2 :(得分:0)

我在Office插件中使用WTL;以下为我工作。 (在stdafx.h的底部)

class DECLSPEC_UUID("XXXX-...") MyLib;

using namespace ATL;

/*
 * Application module
 */
class CAddInModule : public CAtlDllModuleT< CAddInModule >
{
public:
    CAddInModule() : m_hInstance(NULL)
    {
    }

    DECLARE_LIBID(__uuidof(MyLib))

    HINSTANCE GetResourceInstance()
    {
        return m_hInstance;
    }
    void SetResourceInstance(HINSTANCE hInstance)
    {
        m_hInstance = hInstance;
    }

private:

    HINSTANCE m_hInstance;
};

extern CAddInModule _AtlModule;

然后DLL主要使用_AtlModule

// DLL Entry Point
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    _AtlModule.SetResourceInstance(hInstance);
    return _AtlModule.DllMain(dwReason, lpReserved); 
}


// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
    return _AtlModule.DllCanUnloadNow();
}


// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}


// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
    // registers object, typelib and all interfaces in typelib
    HRESULT hr = _AtlModule.DllRegisterServer();
    return hr;
}


// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
    HRESULT hr = _AtlModule.DllUnregisterServer();
    return hr;
}