从c ++调用vb.net-comvisible dll中的函数

时间:2015-10-27 12:34:37

标签: c++ vb.net

我在vb.net(vs 2012)中编写了一个dll,其中的类和函数是可见的。像这样:

Imports System
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

<ComClass(InterFc.ClassId, InterFc.InterfaceId, InterFc.EventsId)> _
Public Class InterFc

  Public Const ClassId As String = "553CCD79-3067-44DE-B1AD-36A153F5C965"
  Public Const InterfaceId As String = "8C15295C-477B-434F-9FDC-4626D418DA9E"
  Public Const EventsId As String = "C434DF40-3F7B-45EE-B0D8-C85ABED03E88"

'(...)'

  Public Function TestFkt(ByVal intValue As Integer) As Integer

    TestFkt = 5 * intValue

  End Function

  Public Sub New()
    MyBase.New()
  End Sub

'(...)

End Class

首先,我想知道为什么依赖walker中的函数列表为空,但这不是问题。

从VBScript调用函数工作正常,如下所示:

Dim objCom
Dim iCounter

set objCom = CreateObject("VBNetDLL.InterFc")

For iCounter = 1 To 20
  MsgBox objCom.TestFkt(iCounter * 7)
Next

同样从VisualBasic(VB6)调用函数也可以正常工作:

Dim objCom

Set objCom = CreateObject("VBNetDLL.InterFc")

Msgbox objCom.TestFkt(3 * 7)

(好吧,代码看起来一样,但请相信我,一个是VBScript,另一个是Visual Basic ;-))

我无法为我的生活工作,从C ++(VS 2012)调用相同的功能。我尝试过很多东西,都是从

开始的
#import <VBNetDLL.tlb>
using namespace VBNetDLL;

首先,奇怪的是,Intellisense将VBNetDLL :: InterFC显示为“struct”,而不是类。 我试过的事情之一是:

InterFc *objControl = new InterFc;

这给了我“没有合适的默认构造函数”和“不允许不完整的类型”,并且:

CoInitializeEx(0, COINIT_MULTITHREADED); 
CLSID clsid; 
HRESULT hr = CLSIDFromProgID(L"InterFc", &clsid);

InterFc *pWApp;
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL,IID_IUnknown, (void **)&pWApp);

编译得很好,但是尝试“pWApp-&gt; TestFkt”告诉我“使用未定义类型'VBNetDLL :: InterFc'”,“左边的' - &gt; TestFkt'必须指向类/ struct / union / generic键入“和”指向不完整类类型的指针“。

长话短说:如何从C ++中调用这些成员函数,特别是因为从VBScript和VisualBasic6中使用它们似乎很容易?

1 个答案:

答案 0 :(得分:-1)

好吧,对于那些可能会遇到同样问题的人来说,最后我就是这样做的:

  CoInitialize(NULL); 

  _InterFcPtr pInterFC(__uuidof(InterFc));

  int iTestResult = (int)pInterFC->TestFkt(2);

简单地告诉我而不是“阅读F **手册!”不是更容易吗?好吧,也许并不容易,但更好,但是聪明(比其他人更聪明)似乎更重要。

非常感谢。