【问题标题】:How to call VB.net DLLs from C++ using COM [closed]如何使用 COM 从 C++ 调用 VB.net DLL [关闭]
【发布时间】:2014-05-28 18:34:08
【问题描述】:

我最近被指派用 C++ 编写一些代码,这些代码调用用 VB.net 编写的 DLL。 VB.net DLL 实际上是由我公司的另一个小组编写的。由于公司内部的地盘之争,他们不会让我看到他们的代码,但是当我提出问题时他们会做出回应。编写 VB.net 代码的团队在地球的另一端,我问他们的每一个问题都需要一天的时间。处于有趣的位置,但政治似乎无法克服。

VB.net 和 C++ 代码上的所有工作都是使用 Microsoft Visual Studio 2010 完成的。我已经使用 regasm 注册了 DLL。我可以看到所有类和接口的 GUID。我使用 oleview 查看生成的类型库文件的内容,并验证这些项目是否显示在我机器上的注册表中。

VB.net DLL 已被证明可以工作,当它们在 VB.net 框架内执行时,它们都可以在其中被引用和共享,但我认为没有投入任何精力进行测试这些 DLL 使用 COM 接口。

这是我第一次涉足 COM。从我一直在做的阅读来看,COM 似乎是相对较旧的技术,但它是迄今为止我发现的唯一途径,它允许我混合语言。如果有人有更好的建议,我会全力以赴。我还是想追这个,因为我觉得我真的很接近了。

我已经设法使用 CoInitialize 和 CoCreateinstance 调用这些 DLL 中的方法。早些时候,我发现有些类被标记为不可创建,或者接口不是公共的。我告诉 VB.net 开发人员。他们做了一些更改,并给我发送了另一组 DLL,我能够访问以前未公开的接口。

我正在调用这些 VB.net DLL,代码成功返回,但似乎对我尝试初始化的硬件没有任何影响。我知道这些 VB.net DLL 依赖于其他深几层的 VB.net DLL。我怀疑我正在设法调用顶级 DLL,但是一旦它调用另一个 DLL,我不确定会发生什么,而且我没有可见性。我比较确定对其他 DLL 的调用不支持 COM。

我正在寻找一些关于如何调试或深入挖掘的建议。有一次,当调用任何其他这些其他 DLL 时,我遇到了错误,也就是说:

"Driver class 'foo' could not be created.  Ensure class name and DLL version are    correct."

在彼此之间调用的所有 VB.net DLL 都会弹出此错误。我将所有 DLL 复制到与可执行文件相同的位置,这些错误就消失了。

我做了一些研究,表明在这种情况下需要仔细管理堆栈状态,但我不确定 VB 代码中需要做什么(如果有的话)。

VB.net DLL 是否需要做任何事情来处理这个问题?当我从 C++ 调用 VB.net DLL 时,VB.net DLL 是否可以在引擎盖下相互跳跃,或者整个解决方案是否需要重新架构?我可以向 VB.net 开发人员发送什么样的请求 这将允许我从 C++ 调用顶级例程,进而允许 VB.net DLL 在彼此之间调用?

巧合的是,以前有一个项目,本质上非常相似,这一切都有效,但有一个显着差异 - 所有 VB.net 代码都包含在一个 DLL 中。我认为我的问题可能与 VB.net DLL 无法相互调用有关,但我无法找到任何回答此特定问题的网站。这是允许的吗?当顶层调用通过 COM 来时,是否需要修改 VB.net DLL 以允许调用其他 DLL?

【问题讨论】:

  • 尽管信息量明显丰富,但您基本上要问什么尚不清楚。但我认为它相对简单。这些 DLL 是否公开 COM 类?如果是这样,请使用 COM。他们公开 .NET 类吗?如果是这样,请使用 .NET。
  • 对不起,如果我没能清楚地表达我的问题。菲利普的回答抓住了我想问的本质。我调用的 DLL 是用 VB.net、AFAIK 编写的,但它们是使用 CoInitialize 和 CoCreateInstance(它们是 COM)来访问的。这是否意味着我正在混合使用 COM 访问 .net DLL?

标签: c++ vb.net dll com


【解决方案1】:

我建议首先使用 VB.Net 从 .Net 探索 VB.Net dll。您还可以使用 C++/CLI 或 C#(就语法而言,它与 C++ 相差不到一百万英里)。

确定 API 调用具有预期行为后,请尝试通过 COM 或 mixed (native and managed) 程序集进行调用。

我将所有 DLL 复制到与可执行文件相同的位置,这些错误消失了。

AFAIK 是一个 .Net DLL 还是多个 .Net DLL 在您通过 COM 调用时应该没有区别,只要它们位于同一文件夹中或在 GAC 中注册。

堆栈状态需要小心管理

从 C++ 调用 COM 对象时,在编组值时需要小心,例如参见 How to: Marshal COM Strings Using C++ Interop。根据您需要进行多少编组,它很快就会变得非常丑陋,您可能会发现使用.Net language 会更好。

【讨论】:

  • 感谢您的回复。至少这让我更有信心,一旦我进入 DLL,就不会有任何问题。根据您的建议,DLL 应该能够相互调用。
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多