用IDispatch的方法创建Doc文件,使用了AutoWrap函数(不知道谁写的)。
怎么新建一个?网上所找到的都是打开已经存在的一个word文档,我想在制定路径下新建一个,怎么做?比较着急,总是查不到应该怎么给参数,怎么才能直接新建一个word文档,弄了两天没弄出来,毛了!求高人指点。如果叙述不清楚,留意一下言,我再给解释。急!

解决方案 »

  1.   

    本帖最后由 Mackz 于 2008-07-27 06:09:51 编辑
      

  2.   

    因为你“不知道谁写的”,所以我也“不知道具体情况”。你直接用#import方式导入Word类库看行不行。
      

  3.   

    我贴一下我的代码吧现在我已经能够生成一个word文档了,但是生成的word文档的大小有问题,正常生成的文档大小只有十来k,而我这样做生成的文档却有20k,请帮我看看怎么改一下呢?    
    // 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(DISPATCH_METHOD, NULL, pBookMark, L"SaveAs", 1, filename); 
            SysFreeString(filename.bstrVal); 
        }
    下面是AutoWrap函数HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) 
    {
        // Begin variable-argument list...
        va_list er;
        va_start(er, 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(er, 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(er);    delete [] pArgs;    return hr;
    }