模块化程序设计,用DLL还是COM/COM+?(总额可达1000分,先发300分)(300分)

  • 主题发起人 主题发起人 WiseAnt
  • 开始时间 开始时间
yysun,你为何说DCOM/COM+将会被抛弃呢?
我正在看.NET的书,如果我理解得没错,.NET的assembly
仍然是建立在COM/COM+的基础之上的
不过DCOM即将被SOAP取代,这个我倒是同意
 
左兄啊,不知道您从为何得出这样的概念:
“.NET的assembly仍然是建立在COM/COM+的基础之上的”?
.NET 中可以使用 COM,这样的程序称为 interop application。
其目的是利用现有的已经存在的 COM。如果您新开发,就不要再考虑 COM 了。
更有惊人的:将来连 Win API 也许都将逐步关闭,不许用了。
 
前不久不知看哪本书上也有这种说法
听李维的演说里就讲到了,Microsoft为了能更随意的在操作系统上作更改,所以在
API上封了一层,我觉得以后不开放API是很正常的。
 
yysun:
我只是一种猜测。
按照我的理解,assembly就是COM的改进形式,它把引用计数、类型注册之类的工作
全部简化掉了,而且通过CLR支持自动回收,通过IL支持语言集成,做到了语言无关的
二进制代码重用。有点象Delphi对COM的封装一样。
但是,它的底层实现应该还是COM,或者说改进过的COM吧?因为不但在.NET中可以使
用现存的COM,而且可以将assembly象COM一样供别的语言使用:只需要将assembly
注册到注册表,然后用类型库生成工具生成一个tlb文件即可。
我看的书是O'Reilly的《.NET framework Essentials》,中文版译名《.NET框架精髓》。
有一节是“.NET中的COM+服务”。
 
左兄:.NET 的机制与 COM 完全不同,并不依赖于 COM。
.NET 中可以输入(import)和使用 COM,import 后生成 wrapper class。
我这里有个例子就是在 C# WindowForm 调用 WebBrowser ActiveX 控件。
(这个做法与 Delphi 非常相似的)。
.NET 中的程序也可以配以 wrapper class,输出为 COM Objects。
MS 很重视 .NET 以及 COM 相互调用,因为当前很多主要的程序和系统都是 COM 的,
不能让人家全部扔掉吧。比如 ADO.NET 目前还在调用 OLE DB 访问 SQL Server。
但是,.NET 不依赖于 COM。如果您现在开发新的 business logic,就不要考虑 COM 了。
我得到消息是 MS 内部正在鼓励各开发组停止使用 COM 开发新功能。
而本计划今年推出,现在推迟到明年的 .NET Server,将主要围绕 .NET 技术展开。
最后,.NET 的多语言调用不需要 COM、tlb、注册表,编译成 .dll 和放在 exe 一起就
能直接可以相互用,例如 C# 调用C++ Managed class,VB.NET 调用 C#,C# 调用
Delphi.NET ...
 
不得不听的课!先谢谢各位老师!
 
呵呵,热闹,我也说说。应该使用BPL,而不是DLL,
1、你要建自己的对象吧?DLL之间怎么共享?BPL可以。
2、你要使用字符串,动态数组吧?DLL需要特殊的BorlandMM.dll支持,BPL不需要。
3、您不想出现模块,对象重复吧?BPL可以检测,DLL没有。
BPL就是一种特殊的DLL
 
听了各位大虾的意见, 思维有点混乱, 有没有大虾居高临下地总结一下,
让大家的意见有个结果...谢谢各位
 
WiseAnt,给你点实际的:
公用的变量放在一个公用的.dll中, 如工号,姓名
每一功能模块做个.dll,如: 入库.dll,出库.dll ,修改密码.dll
程序更新时,更新相应的.dll即可,
你还可做个 远程更新.dll,自动更新其它模块。
不过程序的体积可就变大了,可轻松达到50M,所以,要外加一个upx或aspack压一个。
说实在的:
我刚开始用.dll是因为我的笔记本电脑运行d6很慢,编译很费时。做成dll可减缓。
但现在觉得挺好的。
 
  非常感谢各位大吓的莅临指导,这几天我忙着做各方面的技术测试,一直没上来给
各位打招呼,怠慢了!
  动态载入每一个模块的测试已经通过,没有什么问题,并且也可以轻松的实现模块
挂接以及用户二次开发模块的挂接,在一个模块一个入口函数的方式下已经没有问题?
  只是我考虑到程序组织及分工问题,可能会遇到一个DLL中提供几个接口函数以实现
不同功能的情况,所以一个DLL一个接口函数的方式可能是不谨慎的,所以我修改了一下
程序,增加一个TLoadModule类型,其中的IntakeFuncs: TStringList属性记录了一个DLL
中不同的接口函数被载入的情况,如果某接口函数已经被调入过一次了,就直接使用不再
调入,当一个接口函数所生成的MDI子窗口被关闭时,就通过回调函数通知主窗口做相应处
理,并找到TLoadModule实例,去掉对此接口的引用计数。
  但是当我做了以上修改后,程序在关闭MDI子窗口时会触发异常,这两天也不太有空,
一没搞定,我只好简化程序,去掉与数据库相关的代码,传到网络上,望各位帮忙测试一
下,非常感谢!
  源代码:http://wiseant.myetang.com/newdemo.zip
 
编译成Dll,多累啊。
你不妨使用一下 Frames
每个人负责几个模块(窗体)把模块的所有东东都作进Frames,大家分开调试,
最后把写好的Frames集成进程序中,运行时动态载入,既快又简单
充分体现了模块化和团队开发,又容易控制进度。
 
例子粗看了一下,详细还来不及研究。可能是回调没处理好。
 
  估计99%的可能是TLoadModule的Delete方法有问题,而且如果不在MDI子窗口销毁时
调用Delete函数(此时传递的mItem参数指定了IntakeFunc的值),而是在主窗口关闭时调
用Delete函数(此时传递的mItem参数仅指定了ModuleID的值),则一切正常。
  望各位大吓不吝援手!3x!
 
to WiseAnt:
你的程序比病毒还利害呀,我运行时,能弹出dllfrom,这到没什么,
在关闭这个dllfrom时,可出问题了,我的系统也随之……
真是预哭无泪呀。
Dllform在调用过程中,如有资源未被释放干净会出现很多问题,
而过多的释放,可会出现更严重的问题呀,你可要控制好。
嘿嘿!
我原在使用NT4时,就作了很多dllform的程序,没有一点问题
但现在拿到2000确错误百出,你可要注意这一点的。
 
to 程云:
  先说声抱歉,再说声感谢!
  程序的问题应该在TLoadModule.Delete方法中,看一下你上面那一次贴出的内容,我
已经将希望寄托在你身上了,[:D]我只跟你熟一点呀![:D]
各位大侠,也请帮帮忙吧,我可以另外加分的!
 
可以确定是TLoadModule中传递回调函数时出了问题。
问题出在下面这句语句中:
vForm:=pModule^.PLoadModuleForms[0](Application,@FormFreeCallBack, DM_Common.AdoConnection);
它传递的回调函数的地址(@FormFreeCallback)不对。如果把这句语句换成直接调用dll中的ShowChild函数
就没有问题。
环境:Delphi 6.0+sp2
W2k pro
 
to softdog:
  表面上是象回调函数的问题,但实际应该还是TLoadModule.Delete方法的问题。
//下面的回调函数
procedure FormFreeCallBack(FormHandle: HWND);
var i: Integer;
mItem: TModuleItem;
begin
...
FmMain.LoadModules.Delete(mItem);
end;

[:(]如果将最后一行注释掉,则不会出错,再看一下TLoadModule.Delete方法:
function TLoadModules.Delete(mItem: TModuleItem): Boolean;
var i, j, n: Integer;
pModule: PLoadModule;
begin
...
if mItem.IntakeFunc<>'' then
begin
[?]//将这段去掉,这一切正常,所以问题应该出在这里!!!![?]
end else
begin
pModule^.LoadCount := 0;
end;
...
end;

感谢大家的帮助!!!
 
后退
顶部