Несовместимые результаты при передаче данных между C ++ DLL и C # GUI - PullRequest
6 голосов
/ 14 июня 2011

Я все еще новичок в C #, хотя у меня есть достаточный опыт работы с C ++. Мой текущий проект требует, чтобы я передавал данные назад и вперед между C ++ DLL и C # GUI. В основном я узнал, как это сделать, прочитав ответы здесь на stackoverflow. К сожалению, у меня есть проблема, которая застряла. DLL скомпилирована с использованием g ++ (gcc версии 4.2.1 mingw32-2), и я использую Visual Studio 2010 для создания графического интерфейса.

Моя проблема в том, что я могу получать данные в C # из некоторых функций DLL, а не из других. Сводит с ума то, что это кажется непоследовательным в том, что некоторые функции работают, а некоторые нет. Чтобы показать вам, что я имею в виду, я включил код импорта C # и декларации экспорта C ++ ниже. Я был бы очень признателен за некоторые советы по этому поводу, так как я действительно застрял в том, как это исправить.

Эта функция отлично работает:

[DllImport("mstTools.dll", EntryPoint = "mstLastError", CallingConvention =    CallingConvention.Cdecl)]
private static extern IntPtr LastError();

public static string mstGetLastError()
{
  return Marshal.PtrToStringAnsi(LastError());
}

Это объявлено в заголовке DLL следующим образом:

extern "C" __declspec(dllexport) const char* mstLastError ();

Эта функция не работает и возвращает пустую строку:

[DllImport("mstTools.dll", EntryPoint = "mstGetMetadata", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr GetMetadata([MarshalAs(UnmanagedType.LPStr)]string StgMapName);

public static string mstGetMetadata( string StgMapName )
{
  return Marshal.PtrToStringAnsi(GetMetadata( StgMapName ));
}

Он объявлен в DLL следующим образом:

extern "C" __declspec(dllexport) const char* mstGetMetadata ( char* CStgMapName );

Используя отладчик Visual Studio, я вижу, что импортированная функция DLL (GetMetadata) возвращает ноль.

И наоборот, функции, которые возвращают bool, работают, например:

[DllImport("mstTools.dll", EntryPoint = "mstMapExists", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool mstMapExists([MarshalAs(UnmanagedType.LPStr)]string StgMapName);

Что объявлено в DLL следующим образом:

extern "C" __declspec(dllexport) bool mstMapExists ( char* CStgMapName );

Эта функция работает точно так, как я ожидал, в том смысле, что она возвращает true / false, когда должна.

Но функция, которая возвращает double, возвращает NaN:

[DllImport("mstTools.dll", EntryPoint = "mstGetResolution", CallingConvention =CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.R8)]
public static extern double mstGetResolution([MarshalAs(UnmanagedType.LPStr)]string StgMapName);

который объявлен в DLL как:

extern "C" __declspec(dllexport) double mstGetResolution ( char* CStgName );

Есть идеи о том, что происходит?

Спасибо и всего наилучшего, Mike

1 Ответ

1 голос
/ 14 июня 2011
[DllImport("mstTools.dll", EntryPoint = "mstGetResolution")]
public static extern decimal mstGetResolution([In]string StgMapName);

[DllImport("mstTools.dll", EntryPoint = "mstGetMetadata")]
private static extern IntPtr GetMetadata([In]string StgMapName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...