Как упорядочить тип «Cstring» в .NET Compact Framework (C #)? - PullRequest
2 голосов
/ 10 мая 2010

Как упорядочить тип «Cstring» в .NET Compact Framework (C #)?

DLLname: Test_Cstring.dll (ОС - WinCE 5.0), исходный код:

extern "C" __declspec(dllexport) int GetStringLen(CString str)
{ 
   return str.GetLength();
}

Я маршал это в .NET Compact Framework (C #), например:

[DllImport("Test_Cstring.dll", EntryPoint = "GetStringLen", SetLastError = true)]
public extern static int GetStringLen(string s);

private void Test_Cstring()
{
   int len=-1;
   len=GetStringLen("abcd");
   MessageBox.Show("Length:"+len.ToString()); //result is -1,so PInvoke is unsuccessful!
}

Метод "GetStringLen" в .NET CF неудачен! Как вывести этот тип "Cstring"? Любая информация об этом будет очень признательна!

Ответы [ 2 ]

2 голосов
/ 10 мая 2010

Вы не можете выполнить маршал CString, так как это не нативный тип - это класс C ++, который упаковывает массив char.

Вы можете использовать маршал от string до char[], так как char[] является нативным типом. У вас должны быть параметры для функции, в которую вы хотите выполнить P / Invoke, в виде базовых типов, таких как int, bool, char или struct, но не классов. Подробнее здесь:

http://msdn.microsoft.com/en-us/library/aa446536.aspx

Чтобы вызвать функции, которые принимают CString в качестве аргумента, вы можете сделать что-то вроде этого:

//Compile with /UNICODE
extern "C" MFCINTEROP_API int GetStringLen(const TCHAR* str) {
  CString s(str);
  return s.GetLength();
  //Or call some other function taking CString as an argument
  //return CallOtherFunction(s);
}

[DllImport("YourDLL.dll", CharSet=CharSet.Unicode)]
public extern static int GetStringLen(string param);        

В приведенной выше функции P / Invoke мы передаем System.String, который может маршалировать до char*/wchar_t*. Затем неуправляемая функция создает экземпляр CString и работает с ним.

По умолчанию System.String маршалируется до char*, поэтому будьте осторожны с тем, какую строку принимает неуправляемая версия. Эта версия использует TCHAR, которая становится wchar_t при компиляции с /UNICODE. Вот почему вам нужно указать CharSet=CharSet.Unicode в атрибуте DllImport.

0 голосов
/ 10 мая 2010

вы должны сделать следующее:

extern "C" __declspec(dllexport) int GetStringLen(LPCTSTR  str)
{ 
   CString s(str);
   return s.GetLength();
}

CString на самом деле является типом MFC, а не собственным типом. Просто возьмите строку и включите ее в нативный метод CString.

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