可以参考我以下的程序片段: var DLLHandle: THandle; DLLSub: InvokeDLLForm; begin Result:=true; try DLLHandle := LoadLibrary(Pchar(xFileName)); if DLLHandle <> 0 then begin @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm'); if Assigned(DLLSub) then begin //DLLForm := DLLSub(Application, Screen); DLLSub(Application, Screen,vararrayof(['A',''])) end else RaiseLastWin32Error; end; finally FreeLibrary(DLLHandle); //调用完毕收回DLL占用的资源 end;
to loveWife(我爱红) 你还没有弄清楚我的意思,我有两个不同的业务界面使用的是同一个dll,同时打开这两个业务界面(实际上一个dll加载了两次),然后分别释放就会有问题,你可以试一下! 如果是先打开一个,然后关闭,然后再打开同一个,再释放,我也是成功的!
to 楼主: 你不应该在每个窗体关闭的时候,都释放窗体所属的DLL,象你现在的问题,一个DLL的两个窗体先后打开,关闭其中一个,就要释放DLL,而另一个窗体还在显示,当然不行了。 show 和showmodal 不同,你可以在.exe 里建一个变量FormNum ,打开窗体时 FormNum +1 ,接收到关闭窗体的消息是FormNum -1 ,如果FormNum = 0 则表示关闭的是DLL的最后一个窗体,这时后在freelibrary。
to loveWife(我爱红) 我试过了,两次load,就必须两次free,所以只free最后一次是不行的。 另外,你能否发代码到我的信箱。mail: [email protected] 解决了分可以再加。
to loveWife(我爱红) 我试过了,两次load,就必须两次free,所以只free最后一次是不行的。你为什么需要两次load?? 你可以先判断是否已经load成功了。。 loveWife(我爱红) 的引用计数是一种不错的方法。。很多地方用到。。
不需要两次load ..... if DLLHandle = 0 then DLLHandle := LoadLibrary(Pchar(xFileName)); else begin @DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm'); if Assigned(DLLSub) then begin //DLLForm := DLLSub(Application, Screen); DLLSub(Application, Screen,vararrayof(['A',''])) end; end; .......
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
Result:=true;
try DLLHandle := LoadLibrary(Pchar(xFileName));
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
if Assigned(DLLSub) then
begin
//DLLForm := DLLSub(Application, Screen);
DLLSub(Application, Screen,vararrayof(['A','']))
end
else
RaiseLastWin32Error;
end;
finally
FreeLibrary(DLLHandle); //调用完毕收回DLL占用的资源 end;
http://community.borland.com/article/0,1410,27178,00.html
这页里有说明, 不知我这为什么,下不全, 一半就停了, google 中找 dynamic bpl
调完dll立即释放肯定有问题,因为mdi是show.to comanche(太可怕);
mdi+dll没有任何问题啊,甚至我已经实现只要是不同的dll加载,然后发送消息通知主程序释放dll,现在就是不能解决为什么同一个dll,就不能loadlibrary两次!
这些代码我都看过了,大多数都没有freelibrary,但有一个代码和我的很相似,是采用消息传递的,但仍然不能解决同一个dll,加载两次以上的问题。难道大家写程序都不考虑释放吗??
你不必发愁,你的问题碰巧我知道,我公司的MIS框架是本人建立的,MDI+DLL,
你是怎么解决这个问题的,我们可以讨论一下啊,
我的msn: [email protected]
//放dll,现在就是不能解决为什么同一个dll,就不能loadlibrary两次!当然可以了。
你还没有弄清楚我的意思,我有两个不同的业务界面使用的是同一个dll,同时打开这两个业务界面(实际上一个dll加载了两次),然后分别释放就会有问题,你可以试一下!
如果是先打开一个,然后关闭,然后再打开同一个,再释放,我也是成功的!
你不应该在每个窗体关闭的时候,都释放窗体所属的DLL,象你现在的问题,一个DLL的两个窗体先后打开,关闭其中一个,就要释放DLL,而另一个窗体还在显示,当然不行了。
show 和showmodal 不同,你可以在.exe 里建一个变量FormNum ,打开窗体时 FormNum +1 ,接收到关闭窗体的消息是FormNum -1 ,如果FormNum = 0 则表示关闭的是DLL的最后一个窗体,这时后在freelibrary。
我试过了,两次load,就必须两次free,所以只free最后一次是不行的。
另外,你能否发代码到我的信箱。mail: [email protected]
解决了分可以再加。
我试过了,两次load,就必须两次free,所以只free最后一次是不行的。你为什么需要两次load?? 你可以先判断是否已经load成功了。。 loveWife(我爱红) 的引用计数是一种不错的方法。。很多地方用到。。
if DLLHandle = 0 then
DLLHandle := LoadLibrary(Pchar(xFileName));
else
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateDLLForm');
if Assigned(DLLSub) then
begin
//DLLForm := DLLSub(Application, Screen);
DLLSub(Application, Screen,vararrayof(['A','']))
end;
end;
.......