[高分]该死的“必须加载一个 dll。”,如何解决?(200分)

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

aladdin

Unregistered / Unconfirmed
GUEST, unregistred user!
因为项目里包含的技术比较多,我暂时也不知道这个问题是属于datasnap、com+、ado
还是websnap的?
反正已经是不止一次遇到这个错了,而且没有一次是解决了的,但似乎都出现在调用
COM+组件方法的时候。。这是以前的一些遭遇记录:
1. 在调用IAppServer.AS_ApplyUpdates时,出现“必须加载一个dll。(must load a dll)”
的EOleException错误。改用Supports获取接口再调用,居然就没问题了?
2. 调用WebSysObj.LoginUser('aladdin', '')时,特意输入错误的密码(服务器会抛出异常),显示
“必须加载一个dll。”
3. 应用服务器产生的异常,调用方无法获得正确的异常信息,而是“必须加载一个dll。”。
4. 在对ADO对象设置Properties后,再存取数据时出现“must load a dll”错误。
而今天的问题更可气,我刚增加来一个实现与GetUser完全相同的GetUnit方法,而在websnap
调用GetUnit时,ISAPI版立即跳出“必须加载一个 dll。”错误,赶快用WebAppDebugger版
来跟踪。。。。噢,噢,噢。。。居然没有任何问题(这才是正常的啊)!居然代码完全相同的
两个版本还会出现这种情况?
从网上搜索的情况来看,用delphi开发遇到这个问题的人几乎没有,只在borland community上
有人在用interbase时出现过,delphi开发小组的人员回答时也没说什么。
哪位高人能够提供些线索,它到底是否真的需要加载什么dll,如果是又是哪一个?怎么解决呢?
谢谢,谢谢,再三感谢~~!
 
你的错误太多了,想帮都无法下手呢……
 
你可以试验,撞大运好了
我押宝midas.dll
 
to 一流钱疯:
是吗?我倒是以为“发生点多”,线索多,突破任何一点也许就可以找到解决方法了,
或者希望更大呢?
但总的来说都是发生在调用com+方法时候,所以一定还是有些什么规律的吧。只是
错误信息太简短了,又不知道该如何去分析。
to liuxudong:
感觉不像,因为只是某些特定的方法出现这个情况,相同组件的其他数据访问方法
都正常,不该是midas.dll的问题啊?
最后遇到的这一次,后来发现是在调用Transactional DM的GetUnit没有问题,而通过
Transactional Object的GetUnit(其实就是前者的代理方法,为提高接口的可维护性而
设置的)来调用在ISAPI版里就会出现上述现象。所以,虽然代码中实在看不出什么异常,
但背后一定有什么原因的吧。
 
我今天遇到过这个错误,后来查到原因是我把一个数据对象和一个协调对象放到同一个包
里了。后来把协调对象单独放到一个包里就万事大吉。
 
这个错误是由于COM接口调用出错引起的,由于COM调用是SAFECALL,在正常情况下会返
回S_OK,在出错时应返回错误信息。但如果COM对象没有进行错误处理,那么将返回一个
灾难性错误(错误代码是8000FFFF)。DELPHI在处理这个错误时就会显示“必须加载一
个dll”。
下面是实证:
(uses ComObj;)
procedure TForm1.Button1Click(Sender: TObject);
begin
raise EOleException.Create('',$8000FFFF, '', '', 0);
end;

解决方法:
1。如果可能,不要让它出错;
2。如果是别人写的组件,只好TRY了;
3。如果是自己的接口,简单点可以自己TRY。。。EXCEPT。。。然后返回错误信
息(作为一个参数返回);复杂的可以实现ISupportErrorInfo接口(我没试过)。
 
我认为:它并不是真的要加载一个DLL
 
应该是某个相关COM组件没注册,最大可能是MIDAS.DLL。
 
dll中com并不论出什么错,都会出这个提示,多用try啦。
 
谢谢各位发表自己的见解。现在没有开发环境来试验,明天到公司后试试看再说。
不过,我不太赞同认为是midas.dll或com出错就会出现此信息的说法。因为其他几乎完全
相同的组件方法,都是正常的啊。而我的很多组件方法也都是直接抛出异常的,而
客户端也能够正确地catch到,并没有什么问题。需要像huzzz说的那样去实现
ISupportErrorInfo接口吗?(我没听说过 :P)
当然,我这里是把错误理解为Exception,不知道soul说的错误是否还有它指?如果是,
如何能够获得更多的信息呢?对这种情况(Exception不能拦截的错误)如何处理?
我的数据组件确实是和movingboy说的情况一样,明天试试。虽然还不知道这么做的依据
如何。
 
如果你是用D5的话,请打一个d5adoupdate2.exe补丁,试试看。
 
建立MTS/COM+对象,并使用数据模块,将它在MTS/COM+ 对象的private中
申明此数据模块。如果不这样,客户端调用是出现“需要加载一个DLL”,
我试验了这个结果。
 
我在d7下开发com+组件,调试中的出现这种问题多次
我总结出一个规律:如果对dataset之类的组件进行操作,但是失败了,一般的返回信息就是如此
其实也不是什么真正的需要加载dll,千万不要从这里去找毛病。现在的d版d7毛病很多,我在d7下开发的
com+组件根本不能正常运行,但是在d6下开发试运行得很好,大家要小心呀,到时写了很多代码,就是不能用
,你哭鼻子。
 
我也碰到这样的问题,我想是你的COM+组件没有注册好的,或者是DCOM的配置有问题,
你不妨试试设置DCOM的配置,我突然解决该问题时候是在配置了DCOM后,局域网内所有的
计算机都正常了,不懂何解,但跟MADIS.dll是没有关系的。
 
后退
顶部