首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在DLL中使用WTL?

如何在DLL中使用WTL?
EN

Stack Overflow用户
提问于 2009-03-25 19:29:47
回答 3查看 4K关注 0票数 1

我正在尝试在进程内COM服务器DLL (一个IE BHO)中使用WTL,但在使用_Module时遇到了困难。

我的DLL需要从CAtlDllModuleT<>派生的CMyModule

代码语言:javascript
复制
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中包含以下内容

代码语言:javascript
复制
extern CAppModule _Module; // WTL version of CComModule

不管我用哪种方式做,我(毫不奇怪)都会遇到编译错误。从CAppModule派生的CMyModule_Module.DllUnregisterServer()上阻塞,等等。从CAtlDllModuleT<>派生的CMyModule在像_Module.GetMessageLoop()这样的代码上阻塞。

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

EN

回答 3

Stack Overflow用户

发布于 2009-06-01 22:13:02

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

我的模块设置与您的示例代码一样,继承自CAtlDllModuleT<>,只是全局模块变量的名称是_AtlModule而不是_Module。例如:

代码语言:javascript
复制
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
    DECLARE_LIBID(LIBID_MyLib)
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};

CMyModule _AtlModule;

因此,所有DllMain.cpp入口点都使用_AtlModule。然后在stdafx.h文件中如下所示:

代码语言:javascript
复制
// WTL includes
#define _Module (*_pModule)
#include <atlapp.h>
#include <atlctrls.h>
#include <atldlgs.h>
#undef _Module

_pModule在atlbase.h中定义如下:

代码语言:javascript
复制
__declspec(selectany) CComModule* _pModule = NULL;

一定有更好的方法,但这是可行的。

票数 1
EN

Stack Overflow用户

发布于 2009-03-25 19:36:23

你有没有考虑过多重继承的选择?尝试同时从CAtlDllModule和CAppModule继承,因为这两个都需要。

票数 0
EN

Stack Overflow用户

发布于 2010-11-28 22:46:50

我在Office外接程序中使用WTL;以下方法对我有效。(在stdafx.h的底部)

代码语言:javascript
复制
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;

然后,动态链接库主要使用_AtlModule

代码语言:javascript
复制
// 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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/683079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档