我试图用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);
答案 0 :(得分:1)
您的最终参数为:
unsigned char* outData
这是一个按值传递的指针。调用者看不到对地址的任何修改,因为该地址是通过值传递的。
您需要返回分配给调用方的内存地址。所以你需要:
unsigned char** outData
然后,在C ++代码中的函数实现中,将对outData
的引用替换为*outData
。
通过定义sizeof(unsigned char) == 1
,将sizeof(unsigned char) * inSize
替换为inSize
是惯用的。