вызов c ++ char * из c # проекта System.AccessViolationException - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь вызвать метод библиотеки c ++ из проекта c # без особого успеха. Я всегда получаю одну и ту же ошибку.

System.AccessViolationException: 'Attempted to read or write protected
memory. This is often an indication that other memory is corrupt.'

Подпись метода c ++ выглядит следующим образом

int __stdcall getErrorMessage(int errorId, char *&errorMessage);

Я пробовал все комбинации до сих пор, но, похоже, ничего не работает.

[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage", 
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, ref StringBuilder errorMessage);

[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage",
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, ref IntPtr errorMessage);


[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage",
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, IntPtr errorMessage);

Любая помощь будет по достоинству оценена.

EDIT

Я называю это следующим образом

var ptr = new IntPtr ();

var ret = NativeMethods.getErrorMessage (number, ref ptr);

Также есть еще один вызов, чтобы освободить память, как только это будет сделано

Ответы [ 2 ]

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

Наконец-то это работает, проблема возникает, как упомянул Ханс Пассант, когда мы пытаемся запросить метод с произвольным кодом ошибки.

Рабочий код.

var ptr = new IntPtr();

var ret = NativeMethods.getErrorMessage(code, ref ptr);

        if (ptr != IntPtr.Zero)
        {
            message = Marshal.PtrToStringAnsi(ptr);
            NativeMethods.freePointer(ref ptr);
        }

Спасибо за вашу помощь.

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

После того, как вы получили IntPtr, вы должны преобразовать его в string, используя PtrToStringAuto Или PtrToStringAnsi

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