当前位置:编程学习 > C/C++ >>

调用COM新建一个空白文档并加入链接

[cpp]  
// AddHyperLinkViaCom.cpp : Defines the entry point for the console application.  
//  
  
#include "stdafx.h"  
  
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp,   
    LPOLESTR ptName, int cArgs...) {  
    va_list marker;  
    va_start(marker, cArgs);  
  
    if(!pDisp) {  
        _exit(0);  
    }  
  
    DISPPARAMS dp = { NULL, NULL, 0, 0 };  
    DISPID dispidNamed = DISPID_PROPERTYPUT;  
    DISPID dispID;  
    HRESULT hr;  
    char buf[200];  
    char szName[200];  
  
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);  
  
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT,   
        &dispID);  
    if(FAILED(hr)) {  
        sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx",  
            szName, hr);  
        printf("%s\n",buf);  
        //_exit(0);  
        return hr;  
    }  
  
    VARIANT *pArgs = new VARIANT[cArgs+1];  
    for(int i=0; i<cArgs; i++) {  
        pArgs[i] = va_arg(marker, VARIANT);  
    }  
  
    dp.cArgs = cArgs;  
    dp.rgvarg = pArgs;  
  
    if(autoType & DISPATCH_PROPERTYPUT) {  
        dp.cNamedArgs = 1;  
        dp.rgdispidNamedArgs = &dispidNamed;  
    }  
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp,   
        pvResult, NULL, NULL);  
    if(FAILED(hr)) {  
        sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx",  
            szName, dispID, hr);  
        printf("%s\n",buf);  
        //_exit(0);  
        return hr;  
    }  
    va_end(marker);  
  
    delete [] pArgs;  
  
    return hr;  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    HRESULT hr;  
    CLSID wdCLSID;  
    IDispatch *wdApp;  
    hr =  OleInitialize(NULL);  
    if(SUCCEEDED(hr)){  
        CLSIDFromProgID(L"Word.Application",&wdCLSID);  
        CoCreateInstance(wdCLSID,NULL,  
        hr = CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,IID_IDispatch,  
        (void **)&wdApp);  
        if(SUCCEEDED(hr)){  
            VARIANT x;  
            x.vt = VT_I4;  
            x.lVal =1;  
            hr = AutoWrap(DISPATCH_PROPERTYPUT,NULL,wdApp,L"Visible",1,x);  
            if(SUCCEEDED(hr)){  
                IDispatch *wdDocuments;  
                VariantInit(&x);  
                hr =  AutoWrap(DISPATCH_PROPERTYGET, &x, wdApp,L"Documents", 0);  
                if(SUCCEEDED(hr)){  
                    wdDocuments = x.pdispVal;  
                    IDispatch * wdDocument;  
                    VariantInit(&x);  
                    VARIANT m;  
                    m.vt = VT_ERROR;  
                    m.lVal = (long)DISP_E_PARAMNOTFOUND;  
                    VARIANT F,T;  
                    F.vt = VT_BOOL;  
                    F.boolVal = false;  
                    T.vt = VT_BOOL;  
                    T.boolVal = true;  
                    //这里用DISPATCH_METHOD不能用DISPATCH_PROPERTYGET  
                    hr = AutoWrap(DISPATCH_METHOD,&x,wdDocuments,L"Add",4,  
                        T,m,F,m);  
                    if(SUCCEEDED(hr)){  
                        wdDocument = x.pdispVal;  
                        IDispatch * wdHyperLinks;  
                        IDispatch * wdRange;  
                        VariantInit(&x);  
                        hr =  AutoWrap(DISPATCH_PROPERTYGET, &x,wdDocument,  
                            L"HyperLinks",0);  
                        if(SUCCEEDED(hr)){  
                            wdHyperLinks = x.pdispVal;                            
                           
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,