Как сопоставить C ++ LPSTR с C# - PullRequest
0 голосов
/ 05 августа 2020

Я на самом деле изучаю C # / WPF и написал библиотеку на C ++. И у меня есть функция с выходным параметром типа LPSTR, тест хорошо работает на C ++, и я действительно получаю нужное значение с нужным размером. Но в C# после импорта dll и установки формата unicode / ansi у меня либо пустое значение, либо неверное значение.

Проект C ++ построен в myfunction.dll win32.

C ++ экспорт

/*
* getting the right value in outString 
* c++ test
* 
*/

API_DLLEXPORT long GetSomeString (LPSTR outString ,long * outNbChar);
for (long iChar = 0; iChar < *outNbofchar; ++iChar)
{
    outsLibClass[iChar] = (char)finder.GetFileName()[iChar];
}
outsLibClass[*outNbofchar] = '\0';
break; 

C# импорт

[DllImport("myfunction.dll",  CharSet = CharSet.Unicode)]
public static extern Int32 GetSomeString (StringBuilder outString, ref Int32 outNbChar);

StringBuilder out = new StringBuilder(256) ;
Int32 nbchar = new Int32() ;

int result = GetSomeString (out, ref nbchar ) ;

Console.WriteLine(out.ToString());

// I get the right nbchar

Но я не получаю правильный результат outstring:

㠴0휐ࠦ휠ࠦ鏺瓑휬ࠦ찞瑻쳁촀

И, конечно, я попробуйте также установить CharSet на Ansi, но результат был пуст.

Так что, если бы кто-нибудь мог мне помочь, это было бы большим удовольствием.

1 Ответ

0 голосов
/ 05 августа 2020

Спасибо за ссылку @john в комментариях, я разрешаю это: я делал копию и не ссылался на адрес outString.


// Replace LPSTR by LPSTR 
API_DLLEXPORT long GetSomeString (LPSTR * outString ,long * outNbChar);

и в c#

[DllImport("myfunction.dll",  CharSet = CharSet.Unicode)]
public static extern Int32 GetSomeString ([MarshalAs(UnmanagedType.LPStr)] ref string outString,
                                          ref Int64 outNbChar);
...