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

标签 c++ xml vb.net mfc

我在 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/

相关文章:

c++ - 我怎样才能让 fout 在一个不是 main 的函数中工作?

xml - 连接 xml 文件

PHP SimpleXML 按元素类型分组

vb.net - .NET 框架,Windows XP

c++ - Octave C++ API (feval) - 如何将多个参数传递给 feval?

c++ - 为什么要增加指针崩溃指向的数据?

java - Android studio 应用程序不断关闭

.net - 将 .Net 面板控件导出到图像

c# - 从 vb asp 到 C# asp .net 的转换

C++设置dll搜索位置