gpt4 book ai didi

C# 调用 C++ DLL 传递指针到指针参数

转载 作者:可可西里 更新时间:2023-11-01 17:51:04 29 4
gpt4 key购买 nike

你们能帮我解决以下问题吗?我有一个 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++ 函数分配。在此之前,我不知道数据数组应该有多大。(感谢下面的评论)

最佳答案

我使用了以下测试实现:

int API_ReadFile(const wchar_t* filename, DataStruct** outData)
{
*outData = new DataStruct();
(*outData)->data = (unsigned char*)_strdup("hello");
(*outData)->len = 5;
return 0;
}

void API_Free(DataStruct** pp)
{
free((*pp)->data);
delete *pp;
*pp = NULL;
}

访问这些函数的 C# 代码如下:

[StructLayout(LayoutKind.Sequential)]
struct DataStruct
{
public IntPtr data;
public int len;
};

[DllImport("ReadFile.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
unsafe private static extern int API_ReadFile([MarshalAs(UnmanagedType.LPWStr)]string filename, DataStruct** outData);

[DllImport("ReadFile.dll", CallingConvention = CallingConvention.Cdecl)]
unsafe private static extern void API_Free(DataStruct** handle);

unsafe static int ReadFile(string filename, out byte[] buffer)
{
DataStruct* outData;
int result = API_ReadFile(filename, &outData);
buffer = new byte[outData->len];
Marshal.Copy((IntPtr)outData->data, buffer, 0, outData->len);
API_Free(&outData);
return result;
}

static void Main(string[] args)
{
byte[] buffer;
ReadFile("test.txt", out buffer);
foreach (byte ch in buffer)
{
Console.Write("{0} ", ch);
}
Console.Write("\n");
}

数据现在已经安全地传输到buffer,应该不会有内存泄漏。我希望它能有所帮助。

关于C# 调用 C++ DLL 传递指针到指针参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20419415/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com