您的位置:首页 > 产品设计 > UI/UE

关于VC 控制WORD (ole 的方法 )

2010-06-17 11:46 381 查看
// Initialize COM
    CoInitialize(NULL);

    // Get CLSID for Word.Application
    CLSID clsid;
    HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
    if(FAILED(hr)) {
        ::MessageBox(NULL, _T("CLSIDFromProgID() failed"), _T("Error"), 0x10010);
        return -1;
    }

    // Start Word and get IDispatch
    IDispatch *pWordApp;
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
        IID_IDispatch, (void **)&pWordApp);
    if(FAILED(hr)) {
        ::MessageBox(NULL, _T("Word not registered properly"), _T("Error"), 0x10010);
        return -2;
    }

    // Make Word Unvisible
    VARIANT x;
    x.vt = VT_I4;
    x.lVal = 0;
    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pWordApp, L"Visible", 1, x);

    // Get Documents collection
    IDispatch *pDocs;
    {
        VARIANT result;
        VariantInit(&result);
        AutoWrap(DISPATCH_PROPERTYGET, &result, pWordApp, L"Documents", 0);

        pDocs = result.pdispVal;
    }

    // Get Documents BookMark
    IDispatch *pBookMark;
    {
        VARIANT result;
        VariantInit(&result);
        AutoWrap(DISPATCH_METHOD, &result, pDocs, L"Add",0);
        pBookMark = result.pdispVal;
    }

    // Save File, BookMark.SaveAs()
    {
        TCHAR * szFileName = new TCHAR[MAX_PATH];
        ZeroMemory(szFileName,MAX_PATH*sizeof(TCHAR));

        获得文件名,保存在szFileName

        BOOL bExist = PathFileExists(szFileName);

        while (bExist == TRUE)
        {
            如果文件已经存在,换一个文件名;
            bExist = PathFileExists(szFileName);
            i++;
        }

        VARIANT filename;
        filename.vt = VT_BSTR;
        filename.bstrVal = SysAllocString(szFileName);

        AutoWrap(DISPA
aa3c
TCH_METHOD, NULL, pBookMark, L"SaveAs", 1, filename);
        SysFreeString(filename.bstrVal);
    }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);

    if(!pDisp) {
        MessageBox(NULL, _T("NULL IDispatch passed to AutoWrap()"), _T("Error"), 0x10010);
        _exit(0);
    }

    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    char buf[200];
    char szName[200];

    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

    // Get DISPID for name passed...
    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);
        MessageBox(NULL, (LPCTSTR)buf, _T("AutoWrap()"), 0x10010);
        _exit(0);
        return hr;
    }

    // Allocate memory for arguments...
    VARIANT *pArgs = new VARIANT[cArgs+1];
    // Extract arguments...
    for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

    // Handle special-case for property-puts!
    if(autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

    // Make the call!
    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);
        MessageBox(NULL, (LPCTSTR)buf, _T("AutoWrap()"), 0x10010);
        _exit(0);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);

    delete [] pArgs;

    return hr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息