Проблема при сортировке стандартной строки C ++ в строку C # - PullRequest
1 голос
/ 22 сентября 2011

Я пишу оболочку для DLL, которая управляет устройством OCR. В DLL есть метод, подпись которого похожа на следующее:

unsigned long aMethod(char **firstParameter, char **secondParameter);

aMethod возвращает строковые указатели на все параметры.

Я написал эту подпись в C# ... она почти функциональна:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)]
static unsafe extern ulong aMethod(ref IntPtr firstParameter, 
    ref IntPtr secondParameter);

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

aMethod(ref firstParameter, ref secondParameter);

Маршаллинг и демаршаллинг, относящийся к строкам, выполняется так:

Marshal.PtrToStringAnsi(firstParameter)
Marshal.PtrToStringAnsi(secondParameter)

Очевидно, этот маршаллинг был выбран на основе соглашений API DLL.

Теперь процесс сортировки имеет проблему. Предположим, что устройство имеет вход с этой строкой "abcdefg". Если я использую DLL из чистого кода C ++, я получаю «abcdefg» в качестве вывода. Но если я использую подпись C #, которую я написал, строка теряет свой первый символ и выглядит как «bcdefg».

Что происходит не так? Как я могу исправить метод C #?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2011

Попробуйте изменить CharSet на CharSet = CharSet.Ansi

0 голосов
/ 22 сентября 2011

Если эти параметры даны вам из приложения, почему бы просто не использовать:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)]
static unsafe extern uint aMethod(out string firstParameter, 
    out string secondParameter);

Если вы хотите, чтобы они шли в обоих направлениях, вы можете использовать ref StringBuilder с заранее назначенным размером(вы также должны использовать это, если функция C ожидает, что вы управляете собственной памятью - вы не сказали).

...