Нарушение прав доступа при возврате значения, вызывающего функцию C ++ dll из C # - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сделать вызов из C # в функцию c ++ в DLL.Одним из аргументов этой функции является указатель на переменную короткого типа.

Я не делаю какой-либо причудливой структуры данных или переменных неизвестного размера.Просто короткое значение.

Когда функция DLL c ++ пытается изменить значение этой переменной, она выдает «Неуправляемое исключение 0xC0000005: Нарушение прав доступа».

Я не могу изменить источник DLL(он используется в других проектах, и я не могу его коснуться, хотя у меня есть исходный код для его отладки)

Код функции DLL c ++ (обратите внимание, что "// эта строка вызываетисключение "строка комментария в коде)

// declaration
virtual TestFunction(short __RPC_FAR *sRet) = 0;

// definition
STDMETHODIMP CABTest::TestFunction(short *sReturnValue)
{
    //some
    //calculations
    //here
    *sReturnValue = 1; //this line provoques the exception
    return 0;
}

C # код, вызывающий библиотеку DLL

[DllImport("test.dll", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern short TestFunction(ref short sReturn);

short sMyValue = 0;
TestFunction(ref sMyValue);

Я бы ожидал, что sMyValue будет иметь значение 1, поскольку ссылка IПередача - прямой короткий тип (не причудливая структура данных), но я получаю только сбой приложения (исключение выше).

Что я могу сделать в коде C #, чтобы избежать этой проблемы?Все, что я видел при поиске похожих вопросов, требовало переписать функции C ++ (изменив «short * sReturnValue» на «short ** sReturnValue», но я не могу коснуться исходного исходного кода DLL.

Я думаю, что напишуwrapper.dll, который вызывает test.dll, но мне было интересно, есть ли прямое и более быстрое решение.

1 Ответ

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

Я создал экземпляр, как подсказывает @PaulMcKenzie, и он работает нормально.Я ошибочно думал, что могу просто взять DLL и использовать необходимые функции вычисления, но, думаю, я не смог.Просто оставьте этот ответ другим, которые могут совершить ту же ошибку.

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