在VC中调用VB编写的COM组件范例

来源:互联网 发布:交互动画制作软件 编辑:程序博客网 时间:2024/04/28 12:05
VB调用VC的DLL大家应该不陌生,而VC如何调用VB编写的DLL这个问题对于搞VB开发的人来说可能却就是个问题。
为了广大的VB爱好者向VC进军,我就从VB开发者的角度来说说在VC中调用VB编写的COM组件的方法。我举个例子。 
先说说VB开发一个COM组件。 
用VB新建一个ActiveX DLL 工程, 
然后修改工程名称为 MyVB 
再修改默认的类名为 DEMO 
然后再向类中添加一个函数作为测试用,如:Visual Basic CodePrivate Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA"   ( ByVal lpBuffer As String, nSize As Long )  As Long
'取得当前系统登陆的用户名称
Public Function GetMyName (   )   As String
        Dim UserName As String
        UserName   =   String ( 128, " " )  
        GetUserName UserName, 128
        UserName   =   Trim ( UserName )  
        GetMyName   =   Left ( UserName, Len ( UserName )   - 1 )  
End Function

然后保存工程并生成DLL文件,这时已经可以通过VB动态调用这个COM组件了。 
如果在VB里,可以这样调用: 

Visual Basic Code      Dim MyObj As Object
      Set MyObj   =   CreateObject ( "MyVB.DEMO" )  
      MsgBox MyObj.GetMyName
      Set MyObj   =   Nothing

这时可以看出,MyVB 是 COM 组件名称,DEMO 是 COM 组件的类名称, 
而 VC 里调用可以这样做,如: 

Visual C++ Code//下面是指定DLL的位置
#import "C:/我的程序/VC调用COM/MyVB/MyVB.dll"
using namespace MyVB;    //这里是COM组件名称
HRESULT ComInit();
#include 
"stdio.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int       nCmdShow)
{
    ComInit();
    _DEMOPtr MyObj;        
//注意这里,类名虽然是DEMO,但是定义声明应该是“_类名Ptr”来定义对象
    MyObj.CreateInstance("MyVB.DEMO");

    _bstr_t vRsinfo;    
//VB的String在VC里可以用_bstr_t类型,所以就用_bstr_t类型来接返回参数
    vRsinfo = MyObj->GetMyName();    //这里使用对象方法取得当前用户名称

    MessageBox(
0, vRsinfo, "OK", MB_OK);
    
return 0;
}

HRESULT ComInit()
{
    HRESULT hr 
= S_OK; 
    
if FAILED(CoInitialize(NULL)) 
    {
        CoUninitialize();
        hr 
= E_UNEXPECTED;
    }
    
return hr;
}

以上 VC6 代码是建立一个 Win32 应用程序(Win32 Application), 
选择 An empty project,然后再添加并添加一个 C++ Source File, 
在 Windows XP 下测试通过。

原创粉丝点击