gpt4 book ai didi

c++ - 在 C++ 中调用 Visual Basic DLL

转载 作者:行者123 更新时间:2023-11-30 03:09:54 25 4
gpt4 key购买 nike

我从第三方供应商那里获得了一个用 Visual Basic 创建的 DLL (Sensor DLL.dll)。这个 DLL 包含与传感器对话的函数,我需要从我正在编写的 Visual C++ 程序中调用这些函数。厂商不会提供头文件,我也不懂Visual Basic。如果我有一个头文件,这将是一个 15 分钟的项目……相反,一周后我仍在为它苦苦挣扎。请帮忙!

有人告诉我 DLL 中的一个函数 (Get_Data) 的形式是:

Public Function Get_Data(ByVal Handle As String) As String

我尝试了几种方法来调用此 Get_Data 函数但均未成功:

方法1)DllImport属性

#using <mscorlib.dll>
using namespace System::Runtime::InteropServices;

namespace Sensor
{

[DllImport("传感器 DLL.dll", EntryPoint = "Get_Data", CharSet = System::Runtime::InteropServices::CharSet::Unicode)] BSTR Get_Data(BSTR 句柄);

//then I call the function
Sensor::Get_Data(Handle);

这个方法似乎是我得到的最接近 sloution 的方法。它可以编译,但在运行时会出现以下错误:

发生“System.EntryPointNotFoundException”类型的未处理异常

其他信息:无法在 DLL“Sensor DLL.dll”中找到名为“Get_Data”的入口点。

除了 BSTR 之外,我还尝试了各种数据类型组合/排列,包括 BSTR*、wchar_t、int 等。我可能错过了一个,但每种数据类型都会返回相同的错误。

方法2) dllimport 存储类属性

__declspec(dllimport) BSTR Get_Data(BSTR Handle);

//then I call the function
Get_Data(Handle);

这种方法让我感到困惑,因为我没有指定要从中导入的 DLL。我已将 DLL 复制到项目文件夹,并手动将其添加到项目中,希望这意味着可以找到它。当我编译链接器时返回以下错误:

错误 LNK2028:未解析的 token (0A00034F)“wchar_t * __cdecl Get_Data(wchar_t *)”(?Get_Data@@$$FYAPA_WPA_W@Z) 在函数“int __cdecl main(void)”(?main@@$$HYAHXZ)

错误 LNK2019:函数“int __cdecl main(void)”(?主要@@$$HYAHXZ)

我怀疑这可能意味着我应该使用 wchar_t 或 wchar_t* 而不是 BSTR,但是更改为任一数据类型都会导致相同的错误。

方法三)获取进程地址

typedef BSTR (*Get_Data_Ptr)(BSTR Handle);  
HINSTANCE LoadMe;
LoadMe = LoadLibraryA("Sensor DLL.dll");

if (!LoadMe)
std::cout << "\nDLL failed to load!\n";

Get_Data_Ptr LibMainGet_Data;
LibMainGet_Data = (Get_Data_Ptr)GetProcAddress(LoadMe,"Get_Data");

//then I call the function
LibMainGet_Data(Handle);

这将编译,但在运行时会出现以下错误:

发生“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入 protected 内存。这通常表明其他内存已损坏。

当我在 Debug模式下将鼠标悬停在这段代码的各个部分时,似乎与第一种方法一样,它也无法在 DLL 中找到“Get_Data”入口点。

有没有人在您没有自己创建 DLL 并且没有 .idl 文件等的情况下使用 C++ 从 VB DLL 调用函数?有没有人可以分享这样的工作示例?
谢谢!

最佳答案

VB6 DLL 通常是一个 COM 服务器。实际上,您确实拥有一个 .h 文件的等价物,其中嵌入了一个类型库。从 Project + Properties、Common Properties、Framework 和 References 开始。添加新引用按钮,浏览选项卡,选择 DLL。

接下来,查看 + 对象浏览器。您应该会在列表中看到生成的 Interop 库。打开节点,看看那里有什么。您编写正常的托管代码(如 gcnew)来创建 COM 对象并调用接口(interface)方法。您确实需要一些关于可用方法的最低限度的文档来猜测应该如何调用它们。

关于c++ - 在 C++ 中调用 Visual Basic DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3679967/

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