1

我已经创建了一个采用双指针(BYTE**)的 COM 方法。在 COM 内部,我正在分配内存并对其进行初始化。

签名是;

HRESULT Canny([in] BSTR szLogoPath, [out] BYTE** pBuffer, [out] USHORT* iBufLen);

问题是当我从 C# 项目调用它时 COM 崩溃,而当我从 WIN32 项目调用它时它工作正常。

此外,在 C# 项目中,上述方法显示为;(BYTE** 显示为 IntPtr)

public virtual void Canny(string szLogoPath,IntPtr pBuffer, out ushort iBufLen);

我的 C# 代码是

LogoFinderClass libCOM = new LogoFinderClass();
unsafe  {
    byte* buf = null;
    IntPtr interopPtr = new IntPtr(&buf); 
    libCOM.Canny(@"..\Logo.bmp", interopPtr, out bufLen);
}

在 C++ 中,我将内存分配为;

::Canny(BSTR szLogoPath, BYTE** pBuffer, USHORT* iBufLen) {
    *pBuffer = new BYTE[1024]; 
    .. 
}

从 C# 调用时,COM 在分配内存时崩溃。

4

1 回答 1

3

你不需要unsafe这里。您确实需要在 C# 结束时更改函数的声明。缓冲区参数需要声明为:

ref IntPtr pBuffer

然后,一旦你调用了这个函数,用 . 读出缓冲区的内容Marshal.Copy

我不是从 C# 消费 COM 的出口,但第一个参数不应该有[MarshalAs(UnmanagedType.BStr)]吗?

另外,如果您使用CoTaskMemAlloc而不是new,您可以让调用者释放缓冲区,而不必导出释放器。我相信您确实导出了释放器?

于 2013-10-31T16:12:12.843 回答