如何使用COM从C ++调用VB.net DLL

时间:2014-04-14 17:14:50

标签: c++ vb.net dll com

我最近被分配用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框架内执行时,它们都可以在它们之间被引用和共享,但我不相信已投入任何努力在使用COM接口测试这些DLL时。

这是我第一次涉足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?

1 个答案:

答案 0 :(得分: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