[英]C# PInvoke pass out unsigned char*
我试图在C ++中创建一个简单的dll,并使用PInvoke从C#调用它。 我想传递一个字节数组,对其进行一些操作,然后发送回另一个字节数组。 我想我会传入框架和大小,然后创建一个不受管理的无符号char *。 我会将其传回IntPtr并返回大小。 然后,我将使用另一个功能释放该内存。 一切正常,除非我无法使IntPtr正常工作。 我总是回到0。 我在qt中创建了C ++ dll。 这是我到目前为止的代码。
#pragma once
#ifdef TOOLS_EXPORTS
#define TOOLS_API __declspec(dllexport)
#else
#define TOOLS_API __declspec(dllimport)
#endif
class Tools
{
public:
int TOOLS_API TestFunction(const unsigned char *inData, int inSize, unsigned char *outData);
};
#include "Tools.h"
int Tools::TestFunction(const unsigned char *inData, int inSize, unsigned char* outData)
{
outData = (unsigned char*)malloc(sizeof(unsigned char) * inSize);
memcpy(outData, inData, sizeof(unsigned char) * inSize);
return inSize;
}
[DllImport("Tools.dll", EntryPoint = "?TestFunction@Tools@@QAEHPBEHPAE@Z", CallingConvention = CallingConvention.StdCall)]
public static extern int TestFunction(byte[] inData, int inSize, out IntPtr outData);
IntPtr outData;
int test = TestFunction(data, data.Length, out outData);
您的最终参数为:
unsigned char* outData
这是一个按值传递的指针。 调用者看不到对地址的任何修改,因为地址是通过值传递的。
您需要返回分配给调用方的内存地址。 因此,您需要:
unsigned char** outData
然后,在C ++代码中实现函数时, outData
引用替换为*outData
。
根据定义sizeof(unsigned char) == 1
,用inSize
替换sizeof(unsigned char) * inSize
是inSize
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.