我已经导入了dll。其他部分都可以正常工作,但是导入的方法返回的字符串值给出了以下信息:
未处理的异常0xC0000374:堆已被损坏(参数:0x774C4270)在***.exe中的0x7748EA5F(ntdll.dll)处。
它仍然返回字符串,但我担心这会导致一些难以调试的后续错误。从我测试过的情况来看,感觉可能是任何东西导致这种情况。
这是我的导入代码:
我有一段类似的整数、双精度浮点数和布尔值代码,这个dll能够正常工作且没有错误。因此我认为它可能会产生某种溢出或内存分配错误的大小问题。
注意:如果我创建控制台应用程序,则会在不断开错误的情况下失败。如果我在没有调试器的情况下运行控制台(ctrl + f5),它仍然可以正常工作,但没有错误。当我从表单应用程序调用时,会生成堆错误。
简而言之,这段代码能够正常工作,但返回整数、布尔等时完美无误地显示堆错误。
未处理的异常0xC0000374:堆已被损坏(参数:0x774C4270)在***.exe中的0x7748EA5F(ntdll.dll)处。
它仍然返回字符串,但我担心这会导致一些难以调试的后续错误。从我测试过的情况来看,感觉可能是任何东西导致这种情况。
这是我的导入代码:
[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),它仍然可以正常工作,但没有错误。当我从表单应用程序调用时,会生成堆错误。
简而言之,这段代码能够正常工作,但返回整数、布尔等时完美无误地显示堆错误。
PCHAR
是Unicode,因此[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
应该改为[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
。 - xanatosCharSet.Ansi
是适用于该 DLL 的。 - David Heffernan