关于GetActiveOleObject(ClassName)方法的问题,各位请帮帮忙!(50分)

  • 主题发起人 主题发起人 xuepiaofei
  • 开始时间 开始时间
X

xuepiaofei

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi写了一个调用Word的程序,
起头需要使用GetActiveOleObject判断系统中是否已经启动了Word。
但是当系统中没有启动Word的时候,调用时就会出现“非法调用”的错误!
在Delphi的随机帮助中是这样解释的:
function GetActiveOleObject(const ClassName: string): IDispatch;
这个函数的返回类型是IDispatch,是个接口类型;
那么如何判断是否返回了一个有效的值呢?
 
用try except 捕获异常吧。
 
谢谢xeen!
不过我的目的不是捕捉异常,因为我的目的是连接Word操作。
如果系统中已经启动了Word,那么用mWordObj:=GetActiveOleObject('Word.Application');就可以直接对Word进行操作了;
如果系统中没有启动,就得用mWordObj:=CreateOleObject('Word.Application');来创建Word对象;
现在问题是,如果系统中没有启动Word的话,用GetActiveOleObject(……)就要出错,
您看怎么解决这个问题?


 
我觉得你应该先判断是否启动了WORD,然后再去连接!
 
try
mWordObj:=GetActiveOleObject('Word.Application');
except
mWordObj:=CreateOleObject('Word.Application');
end;
 
myword: Variant;
begin
try
myword := GetActiveOleObject('Word.Application');
except
myword := CreateOleObject('Word.Application');
end;
 
我想问一下,你们如何知道调用Word是用'Word.Application'
我如果想调用其他的软件,应该如何查找这个字段。
 
如果有人回答,我可以再给他50分
 
因为有两个OleCheck所以才会报错。解决方案见下边(代码并不简洁只是为了说明问题)
var
MyWord: Variant;
ClassID: TCLSID;
Unknown: IUnknown;
pDisp: IDispatch;
begin
ClassID := ProgIDToClassID(Word.Application);
if GetActiveObject(ClassID, nil, Unknown)=S_OK then
begin
OleCheck(Unknown.QueryInterface(IDispatch, pDisp));
MyWord:= pDisp;
end
else
begin
...
mWordObj:=CreateOleObject('Word.Application');
...
end;


end;
//----------------------原来的解决方案
function GetActiveOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
Unknown: IUnknown;
begin
ClassID := ProgIDToClassID(ClassName);
OleCheck(GetActiveObject(ClassID, nil, Unknown));
OleCheck(Unknown.QueryInterface(IDispatch, Result));
end;
 
多人接受答案了。
 
后退
顶部