gpt4 book ai didi

C# PInvoke 传递无符号字符 *

转载 作者:行者123 更新时间:2023-11-28 04:29:57 25 4
gpt4 key购买 nike

我正在尝试在 C++ 中创建一个简单的 dll,并使用 PInvoke 从 C# 中调用它。我想传入一个字节数组,对其进行一些操作,然后发回另一个字节数组。我想我会传入框架和大小,然后创建一个非托管的 unsigned char*。我会把它传回一个 out IntPtr 并返回大小。然后我会用另一个函数释放那个内存。一切正常,除了我无法让 out 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,将 sizeof(unsigned char) * inSize 替换为 inSize 是惯用的.

关于C# PInvoke 传递无符号字符 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210049/

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