【问题标题】:How to call an unmanaged C++ DLL With CString Reference如何使用 CString 引用调用非托管 C++ DLL
【发布时间】:2012-04-26 16:37:34
【问题描述】:

使用 VS2010 我正在围绕一个在其公共接口中使用 MFC CStrings 的非托管 C++ DLL 构建一个 C++/CLI 包装 DLL。非托管 C++ DLL 包含一个我需要访问的类。我的问题是这个类包含使用CString引用的方法,例如:

BOOL GetUnits(eSysOfUnits sysUnit, CString &Unit, Cstring &Format);

在我的 C++/CLI 包装器中,我试图像这样访问它

BOOL GetUmUnits(eSysU sysunit, String^ %cunit, String^ %format)
{
   GetUnits(sysunit, marshal_as<CString>(cunit), marshal_as<CString>(format));
}

这给了我一个编译器错误说明

C2665: msclr::interop::marshal_as : 3 个重载都不能转换所有参数类型

GetUmUnits 将通过 C# 表单访问。 cunit 和 format 需要由非托管代码更新。

我做错了什么不可能吗?

【问题讨论】:

  • 我实际上做了一个转换,所以 CString cs(cuint) 和安全格式然后调用 GetUnits(sysunit, cs, cs2) 这使用 marshal_as 将它转换回 String^。有用。所以我想我回答了我自己的问题。但我想知道它是否安全?

标签: c# c++ mfc command-line-interface


【解决方案1】:

您的包装器必须将托管的String^ 转换为实际的CString 对象并直接传递它。编组器不知道如何创建 CString 对象。

在不同版本的 MFC 中有不同版本的 CString,因此您必须链接到与非托管 DLL 构建一个相同的 MFC 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2023-03-24
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2013-12-04
    • 2011-03-04
    相关资源
    最近更新 更多