[英]Corrupted heap when calling unmanaged function via DllImport
I am using an unmanaged dll that is written in C/C++ from a C# application. 我正在使用一个用C#应用程序用C / C ++编写的非托管DLL。 I'm interested in using the following function from the 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);
}
Header file: 头文件:
#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 allow_online,
wchar_t *t_directory, int *e_directory_length,
wchar_t *m_directory, int *m_directory_length)
}
Then, I am trying to invoke this function in my own managed, C# class library by doing the following: 然后,我尝试通过执行以下操作在我自己的托管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);
Finally, I'm trying to use it in a C# application by calling it like: 最后,我试图通过调用它来在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());
}
However, I was getting a heap corruption, but now my application is exiting because of a STATUS_STACK_BUFFER_OVERRUN--something about an embedded breakpoint. 但是,我收到了堆损坏,但现在我的应用程序因为STATUS_STACK_BUFFER_OVERRUN而退出 - 这是关于嵌入式断点的。 Changing the C++ code is not an option.
不能更改C ++代码。 I have the proper reference and assemblies.
我有适当的参考和装配。
What am I doing wrong? 我究竟做错了什么?
The problem that I can see is that your character sets do not match. 我能看到的问题是你的字符集不匹配。 The unmanaged code returns the text as UTF-16, but your p/invoke specifies ANSI encoded text.
非托管代码将文本返回为UTF-16,但您的p / invoke指定ANSI编码文本。 Change the p/invoke to:
将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
);
I'm assuming that c_str_w()
takes an 8 bit encoded string and returns a pointer to null-terminated array of wchar_t
. 我假设
c_str_w()
采用8位编码字符串并返回指向以null结尾的wchar_t
数组的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.