关于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;
}
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;
}
相关文章推荐
- delphi中关于使用CreateOleObject方法控制word的一些心得。将word放入到pannel中
- 关于用程序控制Word,Excel等文件的调用,编辑,替换等问题
- 关于多线程常用方法以及对锁的控制(详解)
- VC++中四种进程或线程同步互斥的控制方法
- 关于实施RUP软件过程控制的方法和标准[只是一个个人总结]
- 用VC向Word中插入图片的方法
- 关于VC++中,两种自定义消息的发送与接收的方法实现进行说明
- 关于js操作word和excel的若干方法汇总
- VC++中四种进程或线程同步互斥的控制方法
- 关于vc++ runtime error解决方法汇总
- 关于VC获取当前程序运行路径的几种方法
- 关于C#动态调用VC Dll的方法(转)
- VC多线程中控制界面控件的几种方法
- 关于css控制页面链接的方法
- 关于在线预览word,excel,ppt,pdf的需求处理方法。
- 关于chm文件的制作与vc调用chm文件方法
- Struts2关于Action的系统训练5关于使用通配符来控制action方法的使用
- OLE方式控制WORD生成一个文档,包括自动生成表格
- 关于vc2005编译asm文件出错的一个处理方法
- 关于radio按钮在vc下使用的两种方法