我正在使用一个用C#C语言编写的非托管DLL.我有兴趣使用dll中的以下函数:
static void StorePath(const std::string& path,wchar_t *out_path,int *out_path_length){ wcslcpy(out_path,c_str_w(path),*out_path_length); *out_path_length = path.size(); } int WINAPI browseForDirectory( int allow_portable,int allow_online,wchar_t *t_directory,int *e_directory_length,wchar_t *m_directory,int *m_directory_length){ . . . //initializing new forms and checking product keys StorePath(form->SelectedEDirectory().TopDir(),e_directory,e_directory_length); StorePath(form->SelectedMDirectory(),m_directory,m_directory_length); }
头文件:
#if defined(_WIN32) && !BUILD_WITHOUT_DLLS &&!defined(ECLIPSE_CBUILDER_WORKAROUNDS) # if BUILDING_EXPORT_LIBRARY # define EXPORT_DLL __declspec(dllexport) # else # define EXPORT_DLL __declspec(dllimport) # endif #else # define EXPORT_DLL #endif extern "C" { int WINAPI browseForDirectory( int allow_portable,int *m_directory_length) }
然后,我尝试通过执行以下操作在我自己的托管C#类库中调用此函数:
[DllImport("MyDLL.dll",CharSet = CharSet.Ansi)] public static extern int browseForDirectory(Int32 allowOnline,Int32 allowPortable,[MarshalAs(UnmanagedType.LPStr)] StringBuilder eDirectory,ref Int32 eDirLength,[MarshalAs(UnmanagedType.LPStr)] StringBuilder mDirectory,ref Int32 mDirLength);
最后,我试图通过调用它来在C#应用程序中使用它:
var eDir = new StringBuilder(260); var mDir = new StringBuilder(260); var eDirLength = eDir.Length; var mDirLength = mDir.Length; try { var result = Viewer.browseForDirectory(1,1,eDir,ref eDirLength,mDir,ref mDirLength); } catch(Exception ex) { MessageBox.Show(ex.ToString()); }
但是,我收到了堆损坏,但现在我的应用程序因为STATUS_STACK_BUFFER_OVERRUN而退出 – 这是关于嵌入式断点的.更改C代码不是一种选择.我有适当的参考和装配.
我究竟做错了什么?
解决方法
我能看到的问题是你的字符集不匹配.非托管代码将文本返回为UTF-16,但您的p / invoke指定ANSI编码文本.将p / invoke更改为:
[DllImport("MyDLL.dll",CharSet = CharSet.Unicode)] public static extern int browseForDirectory( int allowOnline,int allowPortable,StringBuilder eDirectory,ref int eDirLength,StringBuilder mDirectory,ref int mDirLength );
我假设c_str_w()采用8位编码字符串并返回指向以null结尾的wchar_t数组的指针.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。