【发布时间】:2013-12-06 08:34:44
【问题描述】:
你们能帮我解决以下问题吗? 我有一个 C++ 函数 dll,它将被另一个 C# 应用程序调用。 我需要的功能之一如下:
struct DataStruct
{
unsigned char* data;
int len;
};
DLLAPI int API_ReadFile(const wchar_t* filename, DataStruct** outData);
我用 C# 编写了以下代码:
class CS_DataStruct
{
public byte[] data;
public int len;
}
[DllImport("ReadFile.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private static extern int API_ReadFile([MarshalAs(UnmanagedType.LPWStr)]string filename, ref CS_DataStruct data);
不幸的是,上面的代码不起作用......我猜这是由于 C++ func 需要一个指向 DataStruct 的指针,而我只是传递了一个 CS_DataStruct 的引用。
我可以知道如何将指向指针的指针传递给 C++ 函数吗?如果不可能,是否有任何解决方法? (C++ API 是固定的,所以不能把 API 改成指针)
编辑: DataStruct 的内存将由 c++ 函数分配。在此之前,我不知道数据数组应该有多大。 (感谢下面的cmets)
【问题讨论】:
-
传递指向指针的指针意味着本机函数分配一些内存并传回指向它的指针。我看不出这在托管代码中如何适用。
-
也许你应该进一步澄清。 C++ 代码会为数据分配内存吗?谁将负责释放内存?您可能还想查阅有关阵列编组的 Microsoft 文档:msdn.microsoft.com/en-us/library/z6cfh6e6%28v=vs.110%29.aspx。我也认为你应该在 C# 中使用 struct 而不是 class。 struct 是值类型,而 class 是引用类型。
-
如何解除分配?而且我仍然看不到 DataStruct** 的原因。即使仅在 C++ 中,我也会假设调用者将在本地定义一个 DataStruct 并传递它的指针。无需让 API_ReadFile 为结构分配内存。
-
等等,这不是 DataStruct 的数组吗?如果是这样,您可能别无选择,只能使用
unsafe代码或 C++/CLI。您可以访问 API_ReadFile 的源代码吗?还是在 C++ 中使用的示例代码? -
@Yongwei Wu,该库还提供了免费DataStruct的API,抱歉没有在问题中提及。我认为如果最后一个参数更改为“DataStruct*& outData”会更清楚。但无论如何,这就是 API,我无法更改