gpt4 book ai didi

c++ - 使用 P/Invoke 从 MFC DLL 函数读取 VB.NET 中的结构化数据

转载 作者:行者123 更新时间:2023-11-28 02:54:47 28 4
gpt4 key购买 nike

我在 MFC DLL 中有以下结构:

struct retornoSAP
{
enum tipoRetorno
{
Ok,
Falha,
AbrirArquivo, // mStrData válido
InserirArquivo, // mStrData válido
retornoMap, // mLstData válido
retornoTable, // mLstTable válido
retornoString, // mStrData válido
};

tipoRetorno mTipo;
CString mStrData;
CMapStringToString mLstData;
retTable* mLstTable;
CMapStringToString mLstVars;

retornoSAP( tipoRetorno pTipo )
{
mTipo = pTipo;
mLstTable = NULL;
}
~retornoSAP()
{
if ( mLstTable ) CISap::release( mLstTable );
}
};

retTable定义为:

typedef vector<CMapStringToString*> retTable;

此结构用于存储从 SAP API 读取的数据,我有很多返回“retornoSAP”值的函数。

碰巧我必须使用 P/Invoke (DllImport) 从 VB.NET 调用这些函数。我已经阅读了一些关于将非托管类型编码为 .NET 的 Material (例如 http://blogs.msdn.com/b/dsvc/archive/2009/02/18/marshalling-complicated-structures-using-pinvoke.aspx ),并且可能很容易编码其中包含一些基本类型的结构,但我想知道是否有可能编码 CMapStringToString 或,更糟糕的是,CMapStringToString 的 vector 。

我的问题是是否值得花一些时间尝试将此结构转换为 .NET 类型(在这种情况下,我可以在哪里找到一些好的文档)?

如果不是,我想知道在 C++ 中使用 XML 解析器是否是个好主意,将我的所有数据写入 XML 结构,然后将该 XML 结构作为 BSTR 字符串返回,这样我就可以读取 BSTR 返回值在我的 .NET 应用程序中很容易对其进行赋值,并将其解析回 XML 结构。在那种情况下,我会在 MFC DLL 和 .NET 应用程序之间传递一些大字符串...

最佳答案

您不能真正使用 P/INVOKE 处理 MFC 类。我认为您可以选择以下两个选项之一:

  1. 完全不接触 MFC dll:用 CLI C++ 创建一个 dll .学习语言有些功夫,不过是一个thunk dll,你不需要全部学习。通过这种方式,您可以向 .NET 世界公开一些 ref classes 并从其方法调用 MFC dll。从 ref 类内部,您可以读取原始 MFC 结构并填充一些对 .NET 更友好的其他结构。
  2. 修改 MFC dll,使用 extern "C" 装饰公开一些入口点,以避免名称重整,并将内部结构转换为更易于管理的内容,如您所想的字符串,将是一个不太优雅但尖端的解决方案;)

这两种解决方案都有一些性能开销,但我猜第一种会更好,而且有时它是唯一一种防止修改原始 MFC dll 的方法,有时这是可取的。第二个可能更简单,但传递魔术字符串会涉及一些解析,导致性能泄漏、可能的错误,因此您需要更多测试、更多成本等等。

解决方案 1 的另一个缺点是您需要为 C++/CLI 可再发行组件进行额外部署。

我没有提到因为你可能已经知道,但是如果你的 objective-c ++ dll 是 32 位编译的,那么做这种互操作需要在 x86 模式下编译的 .NET 代码。

关于c++ - 使用 P/Invoke 从 MFC DLL 函数读取 VB.NET 中的结构化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258963/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com