调整 MFC dll 以在 C++/CLI 包装器中使用

Posted

技术标签:

【中文标题】调整 MFC dll 以在 C++/CLI 包装器中使用【英文标题】:Adapt MFC dll for using in a C++/CLI wrapper 【发布时间】:2011-07-25 11:30:58 【问题描述】:

我发现必须从CWinApp 派生我的基本MFC 类并为每个导出的方法使用AFX_MANAGE_STATE(AfxGetStaticModuleState())! (如果 MFC 是动态链接的)

我还想在 MFC dll constr 中使用指向外部本机 C++ 对象的指针(我应该使用扩展 dll - 但是如何使用 CLI 呢???)

有没有人做这种包装的好例子?!

谢谢你,

leon22

【问题讨论】:

您的 DLL 中需要哪些特定的 MFC 功能?您可以完全跳过 MFC,或者使用静态链接。 MFC DLL 是否有一些 GUI/资源? @ajay:主要是我需要没有 GUI 的 MFC 的 CString 和 I/O 功能(它是现有代码)!我尝试静态链接 MFC,但出现链接器错误(我在 VS2008 中需要哪些库?)感谢您的帮助! 对于 CString 类,您不需要链接到 MFC(静态或动态) - 只需 #include<atlstr.h> 我得到:nafxcwd.lib(dllmodul.obj):错误 LNK2005:_DllMain@12 已在 LIBCMTD.lib(dllmain.obj) 1>nafxcwd.lib(afxmem.obj) 中定义:错误 LNK2005 :“void * __cdecl operator new(unsigned int)”(??2@YAPAXI@Z) 已在 LIBCMTD.lib(new.obj) 1>nafxcwd.lib(afxmem.obj) 中定义:错误 LNK2005:“void __cdecl operator delete(void *)" (??3@YAXPAX@Z) 已在 LIBCMTD.lib(dbgdel.obj) 1>nafxcwd.lib(afxmem.obj) 中定义:错误 LNK2005:“void __cdecl operator delete[](void * )" (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义,如果我使用 Windows 库(没有 MFC 的静态/动态链接) LIBCMTD.lib 放入“忽略库”链接器设置中 【参考方案1】:

我不确定您的问题或问题是什么。您并不总是需要使用 AFX_MANAGE_STATE 宏,这取决于具体情况。什么是“MFC dll constr”? “我应该使用扩展 dll”是什么意思? (我知道扩展 dll 是什么,但在这种情况下,“应该”是什么意思?)“这种包装”是什么意思?

【讨论】:

我有一个现有的 MFC dll,并使用 LoadLibrary 和 GetProcAddress 将它加载到我的 C++/CLI 包装器中!我需要再次破坏并加载这个 dll,但在第二次运行时我遇到了访问冲突错误!当我构造 mfc 对象(使用 GetProcAddress 加载)时,参数是指向另一个对象的指针(如果您阅读 msdn.microsoft.com/en-us/library/30c674tx(v=vs.80).aspx 我无法在常规 MFC dll -> 扩展 dll 中执行此操作)希望您现在了解我的问题!

以上是关于调整 MFC dll 以在 C++/CLI 包装器中使用的主要内容,如果未能解决你的问题,请参考以下文章

本机 C++ 程序在使用 C++/CLI 和 C# 互操作 DLL 启动时崩溃

包装 MFC 应用程序(目标移动设备)以创建 dll 以在 c#.NET 中使用以进行互操作

C++/CLI 包装器尝试使用 MFC CObject 继承

如何为非托管 c dll 创建 c++\cli 包装器

在调试期间进入 c++/CLI 包装器 dll 和 c# dll,同时在 firebreath 上制作插件

在Visual Studio 2010中将Native / C ++ DLL链接到托管C ++ / CLI包装器