首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从c++调用vb.net-comvisible dll中的函数

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

Stack Overflow用户
提问于 2015-10-27 20:34:37
回答 1查看 144关注 0票数 0

我已经用vb.net (VS2012)编写了一个动态链接库,其中的类和函数是可见的。如下所示:

代码语言:javascript
复制
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

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

从VBScript调用函数工作得很好,如下所示:

代码语言:javascript
复制
Dim objCom
Dim iCounter

set objCom = CreateObject("VBNetDLL.InterFc")

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

此外,从VisualBasic (VB6)调用函数也运行得很好:

代码语言:javascript
复制
Dim objCom

Set objCom = CreateObject("VBNetDLL.InterFc")

Msgbox objCom.TestFkt(3 * 7)

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

我终生无法工作的是,在C++ (VS 2012)中调用这些相同的函数。我尝试了很多东西,都是从

代码语言:javascript
复制
#import <VBNetDLL.tlb>
using namespace VBNetDLL;

首先奇怪的是,Intellisense将VBNetDLL::InterFC显示为"struct",而不是类。在我尝试的东西中有:

代码语言:javascript
复制
InterFc *objControl = new InterFc;

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

代码语言:javascript
复制
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->TestFkt“告诉我”使用未定义的类型'VBNetDLL::InterFc'",“'->TestFkt‘的左边必须指向class /struct/ to /generic类型”,以及“不允许指向不完整的类类型的指针”。

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

EN

回答 1

Stack Overflow用户

发布于 2015-10-28 15:59:57

代码语言:javascript
复制
  CoInitialize(NULL); 

  _InterFcPtr pInterFC(__uuidof(InterFc));

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

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

不管怎样,谢谢你。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33368140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档