1

我正在尝试在进程内 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源自CAppModuleborks on_Module.DllUnregisterServer()等。CMyModule源自CAtlDllModuleT<>borks on 代码,例如_Module.GetMessageLoop().

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

4

3 回答 3

1

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

我的模块设置类似于从 CAtlDllModuleT<> 继承的示例代码,但全局模块变量的名称是 _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;

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

于 2009-06-01T22:13:01.920 回答
0

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

于 2009-03-25T19:36:23.417 回答
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;
}
于 2010-11-28T14:46:50.133 回答