【问题标题】:Calling a Visual Basic DLL in C++, Part 2在 C++ 中调用 Visual Basic DLL,第 2 部分
【发布时间】:2011-06-14 03:52:54
【问题描述】:

这个问题是对上一个问题 (here) 的跟进。

我从第三方供应商处获得了一个用 Visual Basic 创建的 DLL(Sensor DLL.dll)。这个 DLL 包含与传感器通信的函数,我需要从我正在编写的 Visual C++ 程序中调用这些函数。厂商不会提供头文件,我不懂Visual Basic。

我对每个函数都有少量文档。例如,有人告诉我 DLL 中的一个函数 (Get_Data) 采用以下形式:

Public Function Get_Data(ByVal Handle As String) As String

这将返回一个值介于 -16777216 和 +16777215 之间的字符串。就是这样。

在上一个问题中,用户 Hans Passant 给出了这个有用的回复:

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

接下来,视图 + 对象浏览器。您应该在列表中看到生成的互操作库。打开节点看看里面有什么。您编写普通托管代码(如 gcnew)来创建 COM 对象并调用接口方法。您确实需要一些关于可用方法的最少文档来猜测应该如何调用它们。

按照这个建议,我确实在对象浏览器中看到了 DLL 中的函数列表,包括 Get_Data(System::String),但是我对使用 COM 对象感到困惑,这超出了我的经验。

我尝试简单地调用Get_Data(Handle);,其中Handle 是BSTR,因为我已将引用添加到我的项目中,但它未被识别。我也试过先打电话给CoInitialize,但是没有用。

谁能具体告诉我我现在需要写什么来调用该函数?谢谢!

【问题讨论】:

  • 如果原件是typedef PVOID Handle;,那么你应该传入System.IntPtr。除此之外,我只能重复汉斯所说的:您没有提供足够的信息让我们提供帮助。你甚至没有说出实际的错误信息是什么。

标签: com vb6 c++-cli


【解决方案1】:

如果我正确理解您的情况,您至少有一个在 VB6 .dll 中实现的 COM 对象。要使用此对象,您必须在调用 GetData 方法之前创建 COM 对象的实例。 CoInitialize 只会初始化 COM 系统。您还必须使用像 CoCreateInstance 这样的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多