C#PInvoke传递未签名的字符*

时间:2018-11-08 14:42:33

标签: c# c++ pinvoke

我试图用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);

1 个答案:

答案 0 :(得分:1)

您的最终参数为:

unsigned char* outData

这是一个按值传递的指针。调用者看不到对地址的任何修改,因为该地址是通过值传递的。

您需要返回分配给调用方的内存地址。所以你需要:

unsigned char** outData

然后,在C ++代码中的函数实现中,将对outData的引用替换为*outData

通过定义sizeof(unsigned char) == 1,将sizeof(unsigned char) * inSize替换为inSize是惯用的。