新手的DLL问题~~在线~~

bluebottle 2003-10-06 12:52:34
如果一个test.exe调用了a.dll,b.dll,c.dll...,现在的问题是要将其中的a.dll,b.dll,或其它的一个或多个dll用新的dll文件更新,而test.exe正在运行,怎么办??
或且另一种方案是检测要更新的DLL在不在内存里被调用,和文件有没有被打开并被哪个进程打开以便将进程关闭更新DLL????
...全文
63 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
conanfans 2003-10-06
  • 打赏
  • 举报
回复
在TEST.exe中把
需要更新的freelibrary掉就可以了.
更新后再load
bluebottle 2003-10-06
  • 打赏
  • 举报
回复
但我要在另外的test2.exe程序中对test.exe进行操作,没有TEST.EXE的修改权~~~
谢谢wanwangzhiwang(万王之王)的方案~~~
布学无数 2003-10-06
  • 打赏
  • 举报
回复
很好解决的嘛!!!

在TEST.EXE中设置两个方法,加载和卸载DLL。
在需要更新DLL的时候,与TEST.EXE建立通信,TEST.EXE收到后卸载DLL。
更新完毕后再通知TEST.EXE重新加载DLL。

这个方法简单,容易实现,并且很容易扩展,呵呵:)
劣势 2003-10-06
  • 打赏
  • 举报
回复
动态装载
wanwangzhiwang 2003-10-06
  • 打赏
  • 举报
回复
上面都是前辈总结的,希望能帮到你
wanwangzhiwang 2003-10-06
  • 打赏
  • 举报
回复
从内存中卸载dll
function KillDll(aDllName: string): Boolean;

var

hDLL: THandle;

aName: array[0..10] of char;

FoundDLL: Boolean;

begin

StrPCopy(aName, aDllName);

FoundDLL := False;

repeat

hDLL := GetModuleHandle(aName);

if hDLL = 0 then

Break;

FoundDLL := True;

FreeLibrary(hDLL);

until False;

if FoundDLL then

MessageDlg('Success!', mtInformation, [mbOK], 0)

else

MessageDlg('DLL not found!', mtInformation, [mbOK], 0);

end;
wanwangzhiwang 2003-10-06
  • 打赏
  • 举报
回复
或且另一种方案是检测要更新的DLL在不在内存里被调用,和文件有没有被打开并被哪个进程打开以便将进程关闭更新DLL????

使用GetModuleHandle('DLL_FileName')即可,这个函数返回一个句柄,你可以使用这个句柄~~~~~~~:),不过你在使用这个函数之后,最好用GetModuleFilaName()验证一下文件名,因为GetModuleHandle有可能获得一个奇怪的匹配项目:Exe文件。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧