在C ++ DLL和C#GUI之间传递数据时的结果不一致

时间:2011-06-14 04:55:05

标签: c# c++ dll

我仍然是C#的初学者,尽管我对C ++有着丰富的经验。我当前的项目要求我在C ++ DLL和C#GUI之间来回传递数据。我主要通过阅读stackoverflow上的响应来学习如何做到这一点。不幸的是,我遇到了一个让我陷入困境的问题。 DLL使用g ++(gcc版本4.2.1 mingw32-2)编译,我使用Visual Studio 2010来构建GUI。

我的问题是我可以从一些DLL函数而不是其他函数中获取数据到C#。令人抓狂的是它似乎不一致,因为有些功能有效,有些则无效。为了向您展示我的意思,我在下面提供了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)返回null。

相反,返回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 );

有关正在发生的事情的任何想法?

谢谢和问候, 麦克

1 个答案:

答案 0 :(得分:1)

[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);