如何在 DLL 中使用 WTL?

发布于 2024-07-15 23:33:30 字数 1009 浏览 9 评论 0原文

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

我的 DLL 需要从 CAtlDllModuleT 派生的 CMyModule

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

无论我采用哪种方式,我(不出所料)都会遇到编译错误。 从 CAppModule 派生的 CMyModule_Module.DllUnregisterServer() 等上运行。从 CAtlDllModuleT派生的 CMyModule >_Module.GetMessageLoop() 之类的代码感到厌烦。

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

I'm trying to use WTL within an in-process COM server DLL (an IE BHO), but am struggling with _Module.

My DLL needs CMyModule derived from 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();
}

But this conflicts with most WTL examples, which require something like this within stdafx.h:

extern CAppModule _Module; // WTL version of CComModule

No matter which way I do it, I (unsurprisingly) get compile errors. CMyModule derived from CAppModule borks on _Module.DllUnregisterServer(), etc. CMyModule derived from CAtlDllModuleT<> borks on code like _Module.GetMessageLoop().

Any good references on how WTL is supposed to work within a DLL? Google finds lots of questions, with few answers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝海 2024-07-22 23:33:30

我有一个在 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;

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

I have a project that uses WTL in a DLL. I looked at how my headers are set up and it looks like I hacked around this same problem...

I have my module set up like your sample code inheriting from CAtlDllModuleT<> except the name of the global module variable is _AtlModule rather than _Module. For example:

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

CMyModule _AtlModule;

So, all of the DllMain.cpp entry points use _AtlModule. Then in the stdafx.h file it looks like this:

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

That _pModule thing is defined in atlbase.h like:

__declspec(selectany) CComModule* _pModule = NULL;

There must be a better way, but this does work.

海未深 2024-07-22 23:33:30

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

Have you considered the option of multiple inheritance? Try inheriting from both CAtlDllModule and CAppModule since you need both.

爱*していゐ 2024-07-22 23:33:30

我在 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;
}

I use WTL in an Office add-in; the following works for me. (At the bottom of 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;

And then the DLL main use _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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文