C # PInvoke выдает беззнаковый символ * - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать простую dll в C ++ и вызвать ее из C #, используя PInvoke. Я хочу передать байтовый массив, выполнить некоторые манипуляции с ним и отправить обратно другой байтовый массив. Я решил передать кадр и размер, а затем создать неуправляемый беззнаковый символ *. Я бы передал это обратно в IntPtr и вернул размер. Потом я освободил бы эту память другой функцией. Все работает хорошо, за исключением того, что я не могу заставить работать IntPtr. Я всегда просто получаю 0 обратно. Я создал свою C ++ DLL в QT. Вот код, который у меня есть.

#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);

1 Ответ

0 голосов
/ 08 ноября 2018

У вас есть последний параметр как:

unsigned char* outData

Это указатель, переданный по значению. Любые изменения адреса не видны вызывающей стороне, поскольку адрес передается по значению.

Вам необходимо вернуть адрес памяти, которую вы выделяете для звонящего. Итак, вам нужно:

unsigned char** outData

Затем при реализации функции в вашем коде C ++ вы заменяете ссылки на outData на *outData.

По определению sizeof(unsigned char) == 1 и было бы логично заменить sizeof(unsigned char) * inSize на inSize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...