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