gpt4 book ai didi

从 VB.net 调用 DLL 导致堆异常

转载 作者:可可西里 更新时间:2023-11-01 10:12:41 25 4
gpt4 key购买 nike

我用 gcc 做了一个 DLL,它只包含以下函数:

#include <windows.h>

BSTR __declspec(dllexport) testfunc(void)
{
return SysAllocString(L"Hello");
}

基于this answer末尾的代码.构建命令是 gcc -shared -o testfunc.dll main.c -Os -s -loleaut32 .

在使用 VS 2017 Community 的 Visual Basic 中,我的代码是:

Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic
Imports System
Imports System.Text

Module Module1
<DllImport("testfunc.dll", CallingConvention:=CallingConvention.Cdecl
)>
Private Function testfunc() As String
End Function

Sub Main()
Dim Ret = testfunc()
Console.WriteLine(Ret)
End Sub
End Module

但是,执行该程序会在从 testfunc 返回时引发异常.执行永远不会到达 Console.WriteLine线。异常(exception)情况是:

The program '[15188] ConsoleApp1.exe' has exited with code -1073740940 (0xc0000374).

表示堆损坏。我做错了什么?


我尝试过但没有帮助的事情:

  • 改为__stdcall并用 Declare Auto Function testfunc Lib "testfunc.dll" Alias "testfunc@0" () As String 声明函数而不是 <DllImport...>

正确工作的事情:

  • 将函数更改为返回整数;但是我当然无法访问我的字符串。

注意:我知道我可以尝试通过 ByRef StringBuilder 来“返回”字符串我链接的线程上建议的参数,但这在客户端似乎需要做很多工作,我想让它对客户端尽可能简单,即看看我是否能让这种方法起作用。

最佳答案

为了在托管代码和非托管代码之间传递数据,必须对其进行适当的混搭。由于运行时无法知道您的 testfunc() 返回什么,您必须通过提供它的声明来告诉它,您所做的是

<DllImport("testfunc.dll")>
Private Function testfunc() As String

但返回类型是 String 的信息是不明确的,因为有多种字符串表示方式。使用 MarshalAs - 告诉运行时如何处理返回值的属性:

<DllImport("testfunc.dll")>
Private Function testfunc() As <MarshalAs(UnmanagedType.BStr)> String

阅读更多关于 Interop Marshaling 的信息和 Passing strings between managed and unmanaged code .

关于从 VB.net 调用 DLL 导致堆异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52489909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com