VC++ 6.0实现自动化对象

来源:互联网 发布:锐捷网络怎么样 编辑:程序博客网 时间:2024/05/10 14:32
 一.建立自动化对象--源程序:
1.打开vc,建立一个工程,选择MFC AppWizard(exe),在project name里输入:AutoAppTest
2.下一步,选Dialog based单选框
3.下一步,选Automation复选框
4.点击完成
5.在整个工程中,有三个类和一个接口说明,类分别为:CAutoAppTestApp、CAutoAppTestDlg、CAutoAppTestDlgAutoProxy,接口为:IAutoAppTest。
其中CAutoAppTestDlgAutoProxy类,为自动化对象的代理,我们主要是在这里面做文章。在这个类中,我们要注意AutoAppTest.Application字符串,这是这个自动化Com对象的ID

,我们在客户程序中要用到她。
6.添加方法和属性。这里我只添加一个方法void ShowMsg(LPCTSTR lpShow),打开ClassWizard,在Automation选项卡里,在Class Name的下拉菜单中选择

CAutoAppTestDlgAutoProxy类,点击Add Method...按钮,在External Name 输入ShowMsg,return type选择void类型,Parameter list中的name字段输入lpShow,选择的Type为

LPCTSTR。点击Ok按钮,至此,我们向接口IAutoAppTest添加了我们自己的方法,可以浏览IAutoAppTest口描述文件。
7.点击Edit Code按钮为这个方法写代码。代码如下:
void CAutoAppTestDlgAutoProxy::MsgBox(LPCTSTR lpMsgText)
{
    
    // TODO: Add your dispatch handler code here
    m_pDialog->SetDlgItemText(IDC_EDIT1,lpMsgText);//IDC_EDIT1为CAutoAppTestDlg窗体类中的Edit控件ID
//    AfxMessageBox(lpMsgText);
}

编译,至此一个AutoAppTest.exe形式的自动化对象生成。在生成的应用程序的目录下,我们注意AutoAppTest.tlb文件,这个文件在客户端程序上要用到。


二.建立客户端程序调用自动化对象
1.打开vc,安普通的步骤建立一个exe工程文件。
2.引用Com对象。打开ClassWizard对话框,点击Add Class...按钮,选择From a Tpye library...,选择上面编译程序后生成的AutoAppTest.tlb文件,点击ok,在工程中会生成一

个IAutoAppTest的类。我们只需在整个的工程应用中应用这个类里的方法,就能调用AutoAppTest.exe自动化对象的方法。
3.代码实现:
a.声明变量:IAutoAppTest m_Auto;
b.在应用程序的启动处(CRunTestApp::InitInstance)添加应用程序支持COM的初始化工作
    if (!AfxOleInit())
    {
        AfxMessageBox("AfxOleInit error");
        return FALSE;
    }
c. CRunTestDlg::OnInitDialog()在此处代码加入如下代码:
    COleException e;
    CLSID clsid;
    if (CLSIDFromProgID(OLESTR("AutoAppTest.Application"), &clsid) != NOERROR)
    {
        return FALSE;
    }

    // try to get the active calculator before creating a new one
    LPUNKNOWN lpUnk = NULL;
    LPDISPATCH lpDispatch = NULL;
    HRESULT hr;
    hr = ::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(LPVOID*)&lpUnk);
    if (SUCCEEDED(hr))
    {
        HRESULT hr = lpUnk->QueryInterface(IID_IDispatch,
            (LPVOID*)&lpDispatch);
        lpUnk->Release();
        if (hr == NOERROR)
            m_Auto.AttachDispatch(lpDispatch, TRUE);
    }

    // if not dispatch ptr attached yet, need to create one
    if (m_Auto.m_lpDispatch == NULL &&
        !m_Auto.CreateDispatch(clsid, &e))
    {
        AfxMessageBox("Error");
        return FALSE;
    }

d.void CRunTestDlg::OnOK()
{
    // TODO: Add extra validation here
    TCHAR tcBuffer[1024] = {0};
    GetDlgItemText(IDC_EDIT1,tcBuffer,1024);
    m_Auto.MsgBox(tcBuffer);
    //CDialog::OnOK();
}
原创粉丝点击