如何在DLL中使用WTL?

如何在DLL中使用WTL?,dll,atl,bho,wtl,Dll,Atl,Bho,Wtl,我正试图在进程内COM服务器DLL(IE BHO)中使用WTL,但正在与_模块进行斗争 我的DLL需要CMyModule从CAtlDllModuleT派生: 不管我用哪种方式,我(毫不奇怪)都会遇到编译错误CMyModule源于CAppModuleborks on\u Module.DllUnregisterServer()等CMyModule源于CAtlDllModuleT源于\u Module.GetMessageLoop() 关于WTL应该如何在DLL中工作,有什么好的参考资料吗?谷歌发现

我正试图在进程内COM服务器DLL(IE BHO)中使用WTL,但正在与_模块进行斗争

我的DLL需要
CMyModule
CAtlDllModuleT
派生:

不管我用哪种方式,我(毫不奇怪)都会遇到编译错误
CMyModule
源于
CAppModule
borks on
\u Module.DllUnregisterServer()
CMyModule
源于
CAtlDllModuleT
源于
\u Module.GetMessageLoop()


关于WTL应该如何在DLL中工作,有什么好的参考资料吗?谷歌发现了很多问题,但答案很少。

你考虑过多重继承的选择吗?尝试从CAtlDllModule和CAppModule继承,因为两者都需要。

您考虑过多重继承的选项吗?尝试从CAtlDllModule和CAppModule继承,因为两者都需要。

我有一个在DLL中使用WTL的项目。我看了一下我的标题是如何设置的,看起来我也解决了同样的问题

我的模块设置与您从CAtlDllModuleT继承的示例代码类似,只是全局模块变量的名称是_AtlModule而不是_module。例如:

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

CMyModule _AtlModule;

一定有更好的办法,但这确实有效

我有一个在DLL中使用WTL的项目。我看了一下我的标题是如何设置的,看起来我也解决了同样的问题

我的模块设置与您从CAtlDllModuleT继承的示例代码类似,只是全局模块变量的名称是_AtlModule而不是_module。例如:

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

CMyModule _AtlModule;

一定有更好的办法,但这确实有效

我在Office插件中使用WTL;以下内容适合我。(在stdafx.h的底部)


我在Office插件中使用WTL;以下内容适合我。(在stdafx.h的底部)


我已经试过了,但现在已经尝试了一点。让我走了这么远,但一件事导致另一件事。似乎CAtlBaseModule的多次继承给我的信息太少(例如_模块缺少GetMessageLoop)。使用CAppModule继承会带来太多的问题(例如,对DLLMain的访问不明确)。我已经尝试过了,但现在已经尝试了一些。让我走了这么远,但一件事导致另一件事。似乎CAtlBaseModule的多次继承给我的信息太少(例如_模块缺少GetMessageLoop)。使用CAppModule继承会提供太多(例如,对DLLMain的访问不明确)。
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
    DECLARE_LIBID(LIBID_MyLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};

CMyModule _AtlModule;
// WTL includes
#define _Module (*_pModule)
#include <atlapp.h>
#include <atlctrls.h>
#include <atldlgs.h>
#undef _Module
__declspec(selectany) CComModule* _pModule = NULL;
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 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;
}