Преобразование вызова PInvoke в C ++ / CLI - PullRequest
0 голосов
/ 01 февраля 2019

Моя C ++ DLL имеет функцию:

void allocate(double *&arr_not_allocated, UINT &arrayCount);

Обычно я перехожу на C ++ из C # с помощью:

allocate(out IntPtr arr_not_allocated, ref uint arrayCount)

Мне просто интересно, что будет эквивалентным вызовом в C ++ с использованиемC ++ / CLI вместо вышеупомянутого C #?

Следует также отметить, что у меня нет желания хранить выделенный массив в управляемой памяти (только в неуправляемой), поэтому мне все равно маршалу какие-либо структуры на управляемой стороне.Я просто хочу вернуть собственный указатель из C ++ и, возможно, в будущем передать адрес неуправляемого массива обратно в C ++.Вот почему в прошлом я использовал IntPtr с P / Invoke.

Спасибо!

1 Ответ

0 голосов
/ 02 февраля 2019

В C ++ передача по ссылке полностью прозрачна на сайте вызывающей стороны.Он не различает параметры по ссылкам, используемые для ввода, вывода или обоих.Но он также не разрешает объявления переменных внутри вызова функции, поэтому вы должны объявить их заранее.Окончательный код довольно прост:

double* arr_not_allocated;
UINT arrayCount = whatever;
allocate(arr_not_allocated, arrayCount);
/* now both arrayCount and arr_not_allocated have been updated by the function */

Если у вас нет библиотеки импорта, вам, возможно, придется использовать LoadLibrary() и передать полученный дескриптор на GetProcAddress.Результат GetProcAddress приведен к правильному типу указателя на функцию, то есть typedef void (*allocate_fnptr)(double*&, UINT&);

Я не включил соглашение о вызовах, потому что ваш вопрос не указал его.Но вам может потребоваться добавить __cdecl или __stdcall в тип указателя на функцию.

...