繁体   English   中英

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

[英]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) * inSizeinSize

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM