如何将数据从非托管应用程序传递到 C# COM DLL

Posted

技术标签:

【中文标题】如何将数据从非托管应用程序传递到 C# COM DLL【英文标题】:How to pass data to C# COM DLL from unmanaged application 【发布时间】:2011-05-20 17:52:28 【问题描述】:

С# COM DLL 接口:

public interface IShowDialog

   void showMessage(byte[] array);

并在非托管 C++ 应用程序中调用它:

SAFEARRAY *array;

array = SafeArrayCreateVector(VT_BSTR, 0, 1);

long lidx = 0;

SafeArrayPutElement( array, &lidx, SysAllocString(L"test") );

hr = dlg->showMessage(array);

结果:0x80131533 - COR_E_SAFEARRAYTYPEMISMATCH

【问题讨论】:

【参考方案1】:

COM 接口需要使用 SAFEARRAY 的本机代码调用,其内容是 VT_I1 实例。您改为提供 VT_BSTR 值并因此收到错误。

您需要将字符串值转换为VT_I1 值并将它们放入数组中。

编辑

C++ 中的正确名称是VT_I1 而不是VT_BYTE

http://msdn.microsoft.com/en-us/library/cc235118(v=PROT.10).aspx

【讨论】:

+1 同意传入的 safearray 类型应该与声明的类型匹配,但我想说 IShowDialog::showMessage 应该接受一个字符串(COM BSTR),而不是一个字节 []

以上是关于如何将数据从非托管应用程序传递到 C# COM DLL的主要内容,如果未能解决你的问题,请参考以下文章

将 HBITMAP 句柄从非托管代码传递到托管代码以创建 System.Drawing.Bitmap 的安全性

当结构仅在运行时已知时,将结构从 c++ 传递到 c#

使用 COM 互操作从非托管 C++ 访问 c# 属性

如何从非托管 C++ 代码获取结构化列表值到 C#?

从非托管 c++ 调用托管 c# 函数

从非托管 c++ 调用托管 c# 函数