在C++DLL和C#GUI之间传递数据时出现不一致的结果
本文关键字:不一致 结果 数据 C++DLL C#GUI 之间 | 更新日期: 2023-09-27 17:59:00
尽管我在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。
但是一个返回两次的函数返回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
[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);