如何解决在C ++ DLL和C#GUI之间传递数据时,结果不一致
|| 尽管我在C ++方面有相当丰富的经验,但我仍然是C#的初学者。我当前的项目要求我在C ++ DLL和C#GUI之间来回传递数据。我主要通过阅读关于stackoverflow的响应来学习如何做到这一点。不幸的是,我遇到了一个问题,使我陷入困境。该DLL是使用g ++(gcc版本4.2.1 mingw32-2)进行编译的,并且我正在使用Visual Studio 2010构建该GUI。 我的问题是我可以从某些DLL函数获取数据,而不能从其他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)返回null。
相反,返回布尔值的函数可以工作,例如:
[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 );
关于正在发生的事情有什么想法吗?
谢谢并恭祝安康,
麦克风
解决方法
[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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。