社区
Office开发/ VBA
帖子详情
请教:VC编程操作Word,如何支持各种版本Word?
snake1122
2004-04-06 11:30:48
不同操作系统,安装的路径不一样,还有不同版本Word所使用的库不一样,这些问题干如何处理呢?做过的大侠给个思路!
这样行不行,
#if defined( word97)
#import "...\office97\...\*.olb" //没有97,那位仁兄给个路径和名称
#elif defined (word2000)
#import ""
...
#endif
大家讨论,
分不够再加!
...全文
143
5
打赏
收藏
请教:VC编程操作Word,如何支持各种版本Word?
不同操作系统,安装的路径不一样,还有不同版本Word所使用的库不一样,这些问题干如何处理呢?做过的大侠给个思路! 这样行不行, #if defined( word97) #import "...\office97\...\*.olb" //没有97,那位仁兄给个路径和名称 #elif defined (word2000) #import "" ... #endif 大家讨论, 分不够再加!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
1HelloWorld
2004-04-09
打赏
举报
回复
// 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;
}
//cai begin
/*
COleVariant varFilePath(strFilePath);
COleVariant varstrNull("");
COleVariant varZero((short)0);
COleVariant varTrue(short(1),VT_BOOL);
COleVariant varFalse(short(0),VT_BOOL);
m_Docs.AttachDispatch(m_App.GetDocuments());//スォDocumentsタ犖ヤマ_DocsコヘIdispatchスモソレケリチェニエ」サ
m_Docs.Open(varFilePath,varFalse,varFalse,varFalse,
varstrNull,varstrNull,varFalse,varstrNull,
varstrNull,varTrue,varTrue,varTrue);
//エェWordホトオオ」サ
m_Sel.AttachDispatch(m_App.GetSelection());//スォSelectionタ犖ヤマ_SelコヘIdispatchスモソレケリチェニエ」サ
m_Sel.WholeStory ();//ム。ヤトオオヨミオトネォイソトレネン」サ
m_Sel.Copy();//スォハセンソスアエオスシ・
this->GetEditCtrl( ).Paste ();//スォハセンユウフスウフミト"ハモ"ヨミ」サ
m_Docs.ReleaseDispatch();//カマソェケリチェ」サ
m_Sel.ReleaseDispatch();
*/
IDispatch *pBookMark;
{
VARIANT result;
VariantInit(&result);
//VARIANT x,y;
//x.vt = VT_I4;
//x.lVal = 0;
//x.vt=VT_ERROR;
//x.lVal=DISP_E_PARAMNOTFOUND;
// VARIANT used in place of optional-parameters.
VARIANT varOpt;
varOpt.vt = VT_ERROR;
varOpt.scode = (long)DISP_E_PARAMNOTFOUND;
//y.vt = VT_BSTR;
//y.bstrVal = ::SysAllocString(L"d:\\doctest1.doc");
//AutoWrap(DISPATCH_METHOD, &result, pDocs, L"Add", 3,y,x,x);
AutoWrap(DISPATCH_METHOD, &result, pDocs, L"Add", 4,varOpt,varOpt,varOpt,varOpt);
pBookMark = result.pdispVal;
// SysFreeString(x.lVal);
//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, pBookMark, 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"InsertAfter", 1, x);
AutoWrap(DISPATCH_METHOD, &result, pBookMark, L"SaveAs", 1, y);
//pRang = result.pdispVal;
SysFreeString(x.bstrVal);
SysFreeString(y.bstrVal);
}
//cai end
// 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, pBookMark, 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;
}
VCnst
2004-04-07
打赏
举报
回复
to vansoft(Vansoft Workroom) :
在这里支持一下可以吗?
上不了qq和msn.
snake1122
2004-04-06
打赏
举报
回复
to vansoft(Vansoft Workroom) :
谢谢,能详细的讲下如何通过注册表取么?
另外,不是只操作office,所以不用VB.
to gjd111686(数字金刚) :
不能用类向导,这样更没法兼容各种Word版本,我这个是要1个版本在各种Word版本下都可以操作的。
gjd111686
2004-04-06
打赏
举报
回复
你用向导添加olb文件
olb跟路径就没有关系,你用VC已经将olb文件导为类了.
vansoft
2004-04-06
打赏
举报
回复
通过注册表取Office的安装路径。
顺便说一句,Office最好用VB来开发。
OFFICE开发、VBA使用,
提供免费或有偿技术支持。
CO.:Vansoft Workroom
MSN:van_flf@hotmail.com
QQ:5537350
Email:vansoft@21cn.com
vansoft@sohu.com
TEL:025-86685867(范)
asp.net知识库
2分法-通用存储过程分页(top max模式)
版本
(性能相对之前的not in
版本
极大提高) 分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 ...
上位机
编程
软件的选择
在作为一种
编程
工具的意义上,我们认为各个软件如:CB(C++Builder)和
VC
(VisualC++)没有什么本质的区别。就像
Word
2000和WPS2000在本质都是字处理软件一样,对于语言就象我们都用中文在
Word
2000和WPS2000写文章表达...
Windows程序设计与C语言的主要区别是什么?
我是一个windows
编程
的新手,在这里
请教
各位一个问题: windows
编程
与c语言的异同:就好比printf函数在C程序中是输出的函数,而在windows
编程
中却无法用此函数输出…… 概括的说就是C是控制台应用程序,就是...
基础
各位兄弟,在SDK
编程
中如果实现窗口分割呢?请问怎么得到一个函数的执行时间,单位毫秒!如何调试asp组件呀。用
vc
++调试编制的组件怎样画一个箭头?高分
请教
如何限制程序运行的方法?求助:通过
编程
DirectX抓屏-----...
VC
常用数据类型使用转换详解
者:程佩君 刚接触
VC
编程
的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。 我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; ...
Office开发/ VBA
5,139
社区成员
17,886
社区内容
发帖
与我相关
我的任务
Office开发/ VBA
其他开发语言 Office开发/ VBA
复制链接
扫一扫
分享
社区描述
其他开发语言 Office开发/ VBA
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章