360分,自动化大侠眼球转过来,帮忙分析下一段VC操作Word的代码

snake1122 2004-04-08 05:40:09
本代码是更改自msdn上的一段代码,原码为打开word文档,我想创建一个word文档,然后往进写内容,Add方法报错:
代码如下(中间注释地方出错):
// Fotodocword.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <ole2.h>

//
// AutoWrap() - Automation helper function...
//
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, "NULL IDispatch passed to AutoWrap()",
"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/err0x%08lx",
szName, hr);
MessageBox(NULL, buf, "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, buf, "AutoWrap()", 0x10010);
_exit(0);
return hr;
}
// End variable-argument section...
va_end(marker);

delete [] pArgs;

return hr;

}

int main(int argc, char* argv[])
{
// Initialize COM for this thread...
CoInitialize(NULL);

// Get CLSID for Word.Application...
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);
if(FAILED(hr)) {
::MessageBox(NULL, "CLSIDFromProgID() failed", "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, "Word not registered properly",
"Error", 0x10010);
return -2;
}



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

pDocs = result.pdispVal;
}

IDispatch *pBookMark;
{
VARIANT result;
VariantInit(&result);
VARIANT x,y;
 x.vt = VT_I4;
     x.lVal = 0;
y.vt = VT_BSTR;
     y.bstrVal = ::SysAllocString(L"d:\\doctest1.doc");

AutoWrap(DISPATCH_PROPERTYGET, &result, pDocs, L"Add", 3,y,x,x);
//上面这句话执行会弹出:Idispatch ::Invoke(‘’Add”=0000000e)failed w/err 0x800a16e6的错误,请问这是什么错误,应该怎样新创建一个word文档?

pBookMark = result.pdispVal;

SysFreeString(x.bstrVal);
SysFreeString(y.bstrVal);

}

IDispatch *pDoc;
{
VARIANT result;
VariantInit(&result);
VARIANT x;
x.vt = VT_BSTR;
x.bstrVal = ::SysAllocString(L"C:\\Doc1.doc");

AutoWrap(DISPATCH_METHOD, &result, pDocs, L"Open", 1, x);
pDoc = result.pdispVal;
SysFreeString(x.bstrVal);
}

IDispatch *pRang;
{
VARIANT result;
VariantInit(&result);
VARIANT x,y;
x.vt = VT_BSTR;
x.bstrVal = ::SysAllocString(L"0");
y.vt = VT_BSTR;
y.bstrVal = ::SysAllocString(L"0");

AutoWrap(DISPATCH_METHOD, &result, pDoc, L"Range", 2, x, y);
pRang = result.pdispVal;
SysFreeString(x.bstrVal);
SysFreeString(y.bstrVal);
}

{
VARIANT result;
VariantInit(&result);
VARIANT x,y;
x.vt = VT_BSTR;
x.bstrVal = ::SysAllocString(L"just a test!");
y.vt = VT_BSTR;
y.bstrVal = ::SysAllocString(L"d:\\docment1.doc");

AutoWrap(DISPATCH_METHOD, &result, pRang, L"Value", 1, x);
AutoWrap(DISPATCH_METHOD, &result, pDoc, L"SaveAs", 1, y);
//pRang = result.pdispVal;
SysFreeString(x.bstrVal);
SysFreeString(y.bstrVal);
}

//cai end

// Call Documents.Open() to open C:\Doc1.doc
/* IDispatch *pDoc;
{
VARIANT result;
VariantInit(&result);
VARIANT x;
x.vt = VT_BSTR;
x.bstrVal = ::SysAllocString(L"C:\\Doc1.doc");

AutoWrap(DISPATCH_METHOD, &result, pDocs, L"Open", 1, x);
pDoc = result.pdispVal;
SysFreeString(x.bstrVal);
}*/





// Close the document without saving changes and quit Word
{
VARIANT x;
x.vt = VT_BOOL;
x.boolVal = false;
//AutoWrap(DISPATCH_METHOD, NULL, pDoc, L"Close", 1, x);
AutoWrap(DISPATCH_METHOD, NULL, pDoc, L"Close", 1, x);
AutoWrap(DISPATCH_METHOD, NULL, pWordApp, L"Quit", 0);
}

// Cleanup
pBookMark->Release();
pRang->Release();
pDoc->Release();
pDocs->Release();
pWordApp->Release();


// Uninitialize COM for this thread...
CoUninitialize();

return 0;
}


知道如何用这种办法创建word文档的帮忙看下,应该如何调用Add。

解决后请到下面贴字领分:
http://expert.csdn.net/Expert/topic/2930/2930921.xml?temp=2.437991E-02

http://expert.csdn.net/Expert/topic/2934/2934369.xml?temp=.8864405

http://expert.csdn.net/Expert/topic/2920/2920652.xml?temp=.7044336

...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
itmaster 2004-04-09
  • 打赏
  • 举报
回复
我也要一份
看看
itmaser@163.com
snake1122 2004-04-09
  • 打赏
  • 举报
回复
问题已经解决,谢谢各位关心。
gjd111686 2004-04-09
  • 打赏
  • 举报
回复
void CWebOfficeView::EmbedAutomateDoc(void)
{
BeginWaitCursor();
CDC* pDC;
pDC=GetDC();
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
CWebOfficeOleClientItem* pItem=NULL;
TRY
{
CWebOfficeDoc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
pItem=new CWebOfficeOleClientItem(pDoc);
ASSERT_VALID(pItem);
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Word.Document.8",&clsid)))
AfxThrowMemoryException();
if(m_FileName.GetLength()==8)
{
if(!pItem->CreateNewItem(clsid)) //创建Word文档
AfxThrowMemoryException();
}
else
{
if(m_FileName.Find("Http://",0)!=-1)
{
if(!pItem->CreateFromFile(DownTemplate(m_FileName),clsid))
{
AfxThrowMemoryException();
}
}
else
{
if(!pItem->CreateFromFile(DownTemplate(m_FileName),clsid))
{
AfxThrowMemoryException();
}
}
}
ASSERT_VALID(pItem);
pItem->DoVerb(OLEIVERB_SHOW,this);
m_pSelection=pItem;
lpDisp=pItem->GetIDispatch();


pDoc->UpdateAllViews(NULL);
}
CATCH(COleException,e)
{
char strErrorBuf[255];
e->GetErrorMessage(strErrorBuf,255,NULL);
AfxMessageBox(strErrorBuf,MB_ICONINFORMATION);
if (pItem!=NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
}
END_CATCH
EndWaitCursor();
}
snake1122 2004-04-08
  • 打赏
  • 举报
回复
好的,谢谢zjg751206(play程序),马上就发到你邮箱!
zjg751206 2004-04-08
  • 打赏
  • 举报
回复
你把代码发到我邮箱里。我专门编。我编过。
我想要您这些分。
zhoujg@cnhyc.com
不就是创建word文档吗。我作过。但是说不清楚。还是很麻烦的。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧