如何在COM+中调用dll(300分)

  • 主题发起人 沉香屑
  • 开始时间

沉香屑

Unregistered / Unconfirmed
GUEST, unregistred user!
在com+对象中调用dll
loadLibrary函数失败
但是在调试环境下正常
如果不注册为com+对象,注册为com对象,完全正常
如果用进程外com对象调用,也完全正常
区别我想只在于com+对象需要用dllhost
在调试状态下是利用调试器进程加载dll,一般的进程内com会加载到调用进程中,
进程外com有自己的进程
难道dllhost和别的进程有什么区别,以至于不能加载dll?
诸位高手不妨试一下
TPMDLLFunction= function :pchar;
TCallDllDemo = class(TTypedComObject, ICallDllDemo)
private
DllHandle:Integer;
PMDLLFunction:TPMDLLFunction;
protected
function hello(var param: OleVariant): HResult;
stdcall;
function freedll: HResult;
stdcall;
{Declare ICallDllDemo methods here}
public
procedure Initialize;override;
end;
procedure TCallDllDemo.Initialize;
begin
DllHandle := LoadLibrary('PDllDemo.dll');
if DllHandle=0 then
showmessage('加载dll失败');
@PMDLLFunction:=GetProcAddress(DllHandle, 'PMDLLFunction');
end;

一个com对象,在Initialize中加载dll,如果注册为com+,在调试环境下正常,
如果直接执行,肯定返回0,关掉jit激活和事务都没有什么效果
300分不够可以再加

 
可能的原因在於PDllDemo.dll放置的地方, 你是不是把 PDllDemo.Dll放在 client 程式的
目錄下, 如此, 如果COM做一般的註冊, 由於執行時, 用的是Client的進程, 所以它找的
到該dll;
註冊成Com+時, 由於執行時, 是在dllhost行程, 它不曉得Client程式的路徑,自然
找到該Dll;
解決方法, 是將PDllDemo.dll放在Windows的System32資料夾下!
另外在
if DllHandle=0 then
showmessage('加载dll失败');
可以改成以下:
if DllHandle=0 then
showmessage('加载dll失败, 因为: ' + SysErrorMessage(GetLastError));
這樣可以知道錯誤的原因
 
谢谢!
我也用了SysErrorMessage,但是没想到这一点
因为com对象的dll和PDllDemo.dll放在一起
最可气的是在调试状态下,取得的当前路径是dll的路径
运行状态就变成了dllhost的路径
因此在LoadLibrary时指定路径也不行
我一直以为是com+的注册有问题
请到http://www.delphibbs.com/delphibbs/dispq.asp?lid=1100791
我还有300分可以给你
 
顶部