GetActiveOleObject出现“需要手动连接标记”错误(200分)

  • 主题发起人 主题发起人 猛禽
  • 开始时间 开始时间

猛禽

Unregistered / Unconfirmed
GUEST, unregistred user!
当WORD在运行的时候,可以通过GetActiveOleObject('MSWord.Application')来取得当前
活动的WORD。
但我自己写的一个非常简单的AUTOMATION却不行,DELPHI所带的OLEAUTO的DEMO也不行,
用CreateOleObject( 'Memo.MemoApp' )是可以创建一个此DEMO的新实例,但用
GetActiveOleObject就是不行,用API GetActiveObject也一样出错。错误信息就是:

需要手动连接标记

这是为什么?

另,我在CSDN也问了:
http://www.csdn.net/expert/topic/484/484869.xml?temp=.2960474
http://www.csdn.net/expert/topic/636/636635.xml?temp=.1314508
共有120分,解决者全得。
 
GetActiveOLEObject 只是检查注册的Auto对象列表 (看看 GetRunningObjectTable),如
果你的运行Auto实例没有注册,才会出现这个错误,至于如何注册你的 OLE 实例,需要在
你的OLE object启动以后使用类似下面的代码,具体请自己试验解决

var
factory : IClassFactory2
reg: integer;

implementation

CoGetClassObject(ProgIDToClassID('Memo.MemoApp'),
CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
nil,
IClassFactory,
factory);

CoRegisterClassObject(ProgIDToClassID('Memo.MemoApp'),
factory,
CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE,
reg);

CoLockObjectExternal
 
多谢 DragonPC_??? 兄关注,不过我试了一下,如果在MEMOEDIT的ONCREATE中加入
CoGetClassObject来取得类工厂的话会造成死循环地创建应用程序实例,运行一大堆的
MEMOEDIT,我看了DAX的一些代码后改用ComClassManager.GetFactoryFromClassID来取得
类工厂,但如果用CoRegisterClassObject还是会出现“需要手工连接标记”,改用
RegisterActiveObject则会出现“一般性拒绝访问错误”
 
试试这个
procedure TMainForm.FormCreate(Sender: TObject);
var
factory: TComObjectFactory;
reg: integer;
begin
factory := ComClassManager.GetFactoryFromClassID(ProgIDToClassID('Memo.MemoApp'));
factory.RegisterClassObject;
end;

或者看看亲爱的Binh Ly对Delphi 的ComObj、ComSvrs的Bug的修改

http://groups.google.com/groups?hl=en&selm=7422a8%24op711%40forums.borland.com&rnum=8
 
终于解决了,都是WIN2000的“一般性拒绝访问错误”误导的,WIN2000总是出这类
牛头不对马嘴的提示,其实是“接口不支持”错误。

实现方法如下:
在MainForm的OnCreate里增加一个Automation实例即可,
FNewMemoApp := TMemoApp.Create;
RegisterActiveObject( FNewMemoApp...);
一切OK

多谢DragonPC_???的提示。
 
接受答案了.
 
请猛禽大虾看看
这个BCB6中使用ActiveX元件的问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1565114
谢谢
 
后退
顶部