Проблема с Marshalling char * в c # - PullRequest
1 голос
/ 24 апреля 2010

У меня проблема с вызовом этой функции из c ++ DLL в c #

INT32 WINAPI PM_COM_GetText(INT32 TextId, char* pBuf, INT32 BufSize);

Он записывает текст в буфер для заданного идентификатора текста. Я пытаюсь вызвать его с помощью следующего кода C #, но я постоянно получаю нарушение прав доступа и не понимаю почему:

public string GetText(Int32 TextId)
{
  Int32 BufSize = 256;
  StringBuilder Str = new StringBuilder(BufSize);
  PM_COM_GetText(TextId, Str, BufSize);
  return Str.ToString();
}

[DllImport("ComDll.dll", CharSet = CharSet.Ansi)]
private static extern Int32 PM_COM_GetText(Int32 TextId, StringBuilder Str, Int32 BufSize);

Я не вижу, что не так, мне кажется, что многие другие фрагменты кода, которые я нашел в Интернете.

Есть идеи? Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 11 мая 2012

Попробуйте сделать StringBuilder параметр byte[] и использовать

Encoding.UTF8.GetBytes("yourstring")
0 голосов
/ 26 апреля 2010

Да, строитель строк выглядит странно. Может быть, char [] ??? Вы также должны проверить, действительно ли это не Uints.

Такого рода, если у вещей (использующих int, когда вы должны использовать uint, скажем так) не возникнет проблем в C ++, но возникнет исключение в .net 2

0 голосов
/ 26 апреля 2010

Возможно, попробуйте использовать out StringBuilder Str или out string Str

0 голосов
/ 24 апреля 2010

StringBuilder Str в объявлении DllImport выглядит странно для меня. Я бы посоветовал попытаться сделать его простым string.

...