请精通COM的富翁进来 。别让我对Delphi做com组件失去信心!!!!!(100分)

  • 主题发起人 主题发起人 hotplum
  • 开始时间 开始时间
H

hotplum

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi做了一些Com组件,线程模型为apartment,采用dual接口。Com中有一个
独立的线程,接口函数的调用也在应用程序的一个线程中调用。使用中没有一点问题
就是在应用程序退出时产生一个异常。当然在delphi环境中运行无此异常,所以跟踪
不到。如果把com中的接口函数通过Dll输出在应用程序中调用则相安无事。是何道理?
这可是我对Com的唯一应用,我几乎对Com失去信心?

 
难道没有人实际的用过com
 
最好把源码发一份来看一下
zm.zqh163@163.net
 
是什么异常? 这个最要紧的你没说。
 
产生什么异常?
 
我说的异常在delphi环境中运行不会出现,只是在调用com的应用程序退出时产生,
就是delphi著名的AV错误。而且时有时无。
to:zm30
抱歉!由于涉及到公司的东东,不能将源码奉上。
简单的说就是在com中(进程内com ,dual接口),封装了一些访问硬件的函数,
com中用到线程。
 
不要抱怨Delphi,仔细找你代码中的问题吧

你想想用dll与com方式
在内存管理,
线程/进程间通讯有什么不同
对硬件的访问是否能有效避免冲突
等等
这方面不要怀疑Delphi,因为她已经经过无数次验证了

所谓的“delphi著名的AV错误”是Delphi IDE中的一些bug,与编制出来的用户程序无关
不然Borland的编译器还能号称第一?
 
调用com的应用程序中加上
uses Activex;

initialization
CoInitialize(nil);

finalization
CoUninitialize;

通常AV都是这部分引起的。
 
我发现在我的客户端程序退出时如果显示对话框就会出错,如果对话框是我自己的Form
就不会出错!什么道理?
 
to hotplum:
请问你提到的“如果把com中的接口函数通过Dll输出在应用程序中调用则相安无事”,
有一问。
com中的接口函数通过Dll输出是如何实现的?
 
to:j_xu
因为COM的载体就是标准的dll,所以只要按照dll函数输出的方法将实现接口的函数
输出即可。
 
我做了好多这样的程序,但不知道怎样去回答你,不跟踪程序怎么能断定错误的原因呢?
你可以将源代码贴出来,我相信大富翁中会有许多人可以为你解决这个问题的.
 
to:TigerDing
用debug跟踪不会出错(如果出错我也知道如何处理了!),只要直接运行就出错。
1.同样的底层代码,我用dll函数输出则无事。
2、客户程序退出时不调用Application.MessageBox,也不会出错。

 
Debug不出错,直接运行有错,很多时候是时序问题,你的一个任务可能需要一点时间去完成,在其返回之前,程序进行了其它操作引起错误

一点信息没有怎么知道你的错误
 
可能是线程的问题,你在debug时是单线程的,
而实际运行可能是多线程的,
 
rockythd的有理,非法内存访问debug也出错的。
 
另外,你说Com中有一个独立的线程,不知是什么意思
按理说,你应该给每个com客户连接创建一个独立的线程才行
 
我见过类似的问题
当接口 A 所引用的对象被释放之前,接口A未被付成 Nil
,在程序退出时会报错但调试环境下没错。所以我推断,

即:
接口A & 接口B 分别指向某对象 X
当 释放顺序为:
A:=Nil
X.Free
B:=Nil
这时会你的那个错误
如果你保证
X.Free之前
所有的A&B已经=Nil这时则无报错信息.

我曾出现的问题就是类似这样的问题,跟你的现象一模一样


 
吧单元中不用的引用一律去掉,
把程序入口处的创建顺序调整一下
试试,可能是因为创建顺序根关闭顺序不一致造成访问内存错误
 
你做的好像是多线程的
你做的是单线程还是多线程啊
 
后退
顶部