【发布时间】:2015-08-01 16:16:57
【问题描述】:
我已导入 dll。所有其他部分都可以工作,但是导入方法的字符串返回值给出了这个:
***.exe 中 0x7748EA5F (ntdll.dll) 处的未处理异常:0xC0000374:堆已损坏(参数:0x774C4270)。
它仍然返回字符串,但我担心这会在以后导致其他一些难以调试的错误。根据我的测试,感觉它可能是任何东西,这就是造成这种情况的原因。
这是我的导入代码:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
private delegate String GetStringDelegate(int handle, int index);
private static GetStringDelegate getString { get; set; }
var addressOfGetString = NativeMethods.GetProcAddress(_handle, "GetString");
getString = (GetStringDelegate)Marshal.GetDelegateForFunctionPointer(addressOfGetString, typeof(GetStringDelegate));
用法
getString(Handle, 1);
这可行,但会导致错误。在调试时,只需按“继续”即可对其进行处理并显示结果。结果是正确的。
这是在delphi dll中完成的
function GetString(Hnd,Index : Integer) : PChar; stdcall;
begin
Result:=TControl(Hnd).Stack.GetString(Index);
end;
对于整数、双精度数、布尔值和 dll 中的所有其他内容,我都有相同类型的代码,没有错误。所以我认为它会造成某种溢出或错误大小的内存分配。
注意:如果我创建控制台应用程序,它只会失败,不会因错误而中断,如果我在没有调试器( ctrl+f5 )的情况下运行控制台,它可以工作,仍然没有错误。当我从表单应用程序调用它时会产生堆错误。
TL;DR;此代码有效,但显示堆错误,而返回整数、布尔值等则完美。
【问题讨论】:
-
PCHAR在最新版本的 Delphy 中是 Unicode,所以[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]应该是[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)] -
@xanatos 除非,通常情况下,用户仍在 D2007 或更早版本
-
@DavidHeffernan 我写过“最新版本”
-
如果我把它改成unicode,字符串是一些中文字母。
-
@Katu 这表明该文本确实是 ANSI 并且
CharSet.Ansi适合此 DLL