比如建立一个工程 TESTVB, 添加一个类模块名为 VBObj, 其中定义了两个函数:Public Sub Test1() MsgBox "This is a Test" End SubPublic Function Test2(ByVal var1 As Long, ByVal var2 As Long) As Long Test2 = var1 + var2 End Function编译产生 TestVB.Dll , 你可以用 OLE/COM Object Viewer 察看对应的 idl 定义,在测试程序中这样使用: #include <windows.h> #include <iostream> using namespace std;#import "F:/LLBak/VBProj/TESTVB.dll" no_namespacevoid main() { ::CoInitialize( NULL ); _VBObjPtr obj( TEXT("TESTVB.VBObj") ); obj->Test1(); cout << obj->Test2( 100 , 200 ) << endl; obj.Release(); ::CoUninitialize(); }
注意 VB 和 VC 中数据类型的对应,VB缺省的参数定义为 ByRef 的,也就是传递地址,如:Public Function Fun( a As Long ) As String 对应的 idl 标示为:HRESULT Fun( long* a , [ out ,retval ]BSTR * strRet );如果你的VB模块要在 VC中使用,你应该尽量的避免使用 VARIANT 数据类型,虽然在VB中用起来很方便
MsgBox "This is a Test"
End SubPublic Function Test2(ByVal var1 As Long, ByVal var2 As Long) As Long
Test2 = var1 + var2
End Function编译产生 TestVB.Dll , 你可以用 OLE/COM Object Viewer 察看对应的 idl 定义,在测试程序中这样使用:
#include <windows.h>
#include <iostream>
using namespace std;#import "F:/LLBak/VBProj/TESTVB.dll" no_namespacevoid main()
{
::CoInitialize( NULL ); _VBObjPtr obj( TEXT("TESTVB.VBObj") ); obj->Test1();
cout << obj->Test2( 100 , 200 ) << endl;
obj.Release(); ::CoUninitialize();
}