请教:调用相同的Active DLL,在Form成功,而在Service中失败(100分)

  • 主题发起人 主题发起人 alick
  • 开始时间 开始时间
A

alick

Unregistered / Unconfirmed
GUEST, unregistred user!
Platform: win2000 adv &delphi 5 &MapXtreme
我打算用delphi写一个service,在线程中调用了由MapXtreme提供的Active Dll的函数。编译无错,运行时产生一个EOleError的错误。而对同样函数的调用,在Form中却毫无问题。
MapXtreme提供MapXcourier Active Dll,我用Import type Library引入成TMapXcourier类,在service中,即使手工初始化--MapXcourier1:TMapXcourier;
TMapXcourier.create(self or service1 ) 结果都一样。
我猜Form初始化与service不同,缺少Ole部分,不知那位高人能够指点迷津。
 
没用过这个东西,如果在Form中使用的话,应该是一个ActiveX控件,而不是一个服务程序吧.
如果是AcriveX控件的话,它需要有一个窗体空间作为Parent才能正常工作.在服务端你给除了它的Parent了么?
 
我的意思是,在我的service程序里,用到了,active dll中的函数,但是,运行后出错。
如果,使用同样的调用方法,在一个标准的windows程序中调用同样的active dll里的函数,则不出错。
所以我想问,如果写service,怎样初始化active dll这个对象,也就是,在一个标准的delphi程序里--application.createform(tform,form1)比application.createform(tservice,service1)隐含着多做了那些工作。
本人编程和文字水平均有限,请大家多多指教。
 
要在service程序中显式调用coinitialize,
结束时调用couninitialize。

一般EXE程序的初始化部分--即application.initialze中调用了coinitialize;
而service(DLL)中没有application.initialze,因此要使用OLE,必须自己调用。
 
To:温柔一刀
首先,感谢您的指点。
我创建的是Service application,也是一个exe,在它的project里,有
Application.Initialize;
Application.CreateForm(Tservice, service1);
Application.Run;
我不知缺少那些初始化,或是如何显式调用coinitialize,如能演示,不胜感谢。
 
每一个独立的thread要使用activeX,都要调用coinitialize,
普通exe的Form与application实在同一线程中的,因此没问题,
而tservice实际上创建了一个tservicethread,在不同线程中,
因此必须“手工”调用coinitialize。

在你的service的onexecute/onstart里调用:
coinitialize(nil);

在service结束时(onstop)调用
couninitialize(nil);
 
接受答案了.
 

Similar threads

后退
顶部