Dll中调用ActiveX控件在释放时出错? (100分)

  • 主题发起人 主题发起人 jxhdy2001
  • 开始时间 开始时间
J

jxhdy2001

Unregistered / Unconfirmed
GUEST, unregistred user!
PLC通信软件有提供一个ActiveX组件,我用Delphi Import type Library 该组件,生成一*_TLB.pas单元,查看里面是三个控件, 然后我把该单元以控件安装后,在线程中创建,进行接口转换,CoMarshalInterThreadInterfaceInStream
CoGetInterfaceAndReleaseStream后
还是是报错,"不支持此接口"的错误。现不知道如何解决

一开始我没有用线程,直接操作程序,调用COM接口没问题。
现在是由另一个程序使用SendMessage与我写的程序通信,产生之错误

2004-03-04:
现改使用DLL中调用ActiveX在释放时出错?
 
线程?

你可能需要先调用CoInitialize(nil),然后才能Create那个Interface。用完后,释放Interface,再调用CoUninitialize。

试试看。
 
试试改成PostMessage
 
To:
pcplayer: 我是使用一个线程来进行通信的,以线程创建是,连接OPCSever,把回一个接口,在进行对接口Marshal时,有调用CoInitialize(nil),但在调用接口方法时,还是报错了。

to: PostMessage: 接收程序不能响应到
 
问题有所进展了,但在释放时有点问题:
我使用DLL调用COM组件,在DLL中封装了一个类, 以接口输出,应用程序在调用这个DL后,DlL在释放时出错,后改用直接在Dll初始化时创建对象,在释放对象时,还是出错?

请问,使用Dll调用COM组件,需要进行接口转换吗?
 
jxhdy2001:
认识一下哈,,你做OPC通讯?
我在成都,前些日子正在参考OPC的技术资料。有些东西多向你请教哈。。!

我的QQ:44738541
 
呵呵,共同学习才对啦!
Yahoo通, jxhdy2001@yahoo.com.cn
我只是最近在做PLC通信用到OPC
 
在你的 Application 的 dpr 文件找到 begin ... end 部分加入

begin
CoInitFlags := COINIT_MULTITHREADED
//加入
...
end;

然后将你的 CoInitialize(nil) 换成CoInitializeEx(nil,COINIT_MULTITHREADED);
应该就可以了吧!
 
老兄:在释放时还是出错了,
Error.jpg
 
首先最好确定这个组件是不是线程安全的。看了你的错误贴图是个典型的内存访问错误,估计和多线程有关系。
我认为先不管问题是不是这里,你在创建套间的时候,最好还是先使用单线模式,这样不管组件是否为线程安全,至少保证不会出错!
如果还出现错误的话,就只好从程序内部去找了。
你提到的应用程序和DLL访问ACTIVEX组件的时候有何区别,这点我以前碰到过类似的情况,这种情况也是和创建套间有关系的,因为DLL不是一个完整的应用程序模式,它不像EXE那样有一个完整的创建和释放过程。当EXE访问它的时候,它本身并不知道EXE之前做过些什么事情。如果这个时候再创建一个套间就可能会出错(不过这点我也未确定,应为按照微软的说法,同个线程里重复创建套间是不会出错的,但实际应用当中却有可能,对于这点可能需要对套间的实现原理进行分析才可以得出结论)
 
Initialization
//CoInitFlags := COINIT_APARTMENTTHREADED;
//CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
CoInitialize(nil);
CommABCObj:= TCommAB.Create

Finalization
CommABCObj.Free
CoUnInitialize;
end.
这段是我DLL实现单中的代码

procedure DownData(FileName, Topic, Element: String);
Begin
CommABCObj.FileName := FileName;
commABCObj.TopicName := Topic;
commaBCObj.ElementName := Element;
COmmaBCObj.DownLoad
end;

procedure AB_UnInitComm;
Begin
COmmaBCObj.UnInitComm
end;

exports
DownData,
AB_UnInitComm;

end.
这是我DLL输出的函数

不知道为何怎么试都是在释放时,内存初错

 
谢谢各位帮助!
 
后退
顶部