程序 调用dll问题(100)

  • 主题发起人 主题发起人 kingswww
  • 开始时间 开始时间
K

kingswww

Unregistered / Unconfirmed
GUEST, unregistred user!
问个新手问题我有个程序a.exe 和 b.dll a.exe程序能调用b.dll里面的函数 现在我想把a.exe和b.dll 合并成一个c.exe 也就是说b.dll做成res资源文件放到a.exe 里面去 我现在出问题了 运行c.exe的时候提示找不到b.dll 我想应该是程序还没有释放dll资源就调用dll了如何 先释放b.dll再调用b.dll里面的函数?
 
别忘了用 brcc32.exe (在Delphi所在的文件夹里)编译你的 Test.rc 文件时 b.dll要和 brcc32.exe 放在一起,最好是和你的项目文件都放在一起,完成后就会生成一个新的 Test.res文件,然后在项目文件(也就是.dpr)中的 {$R *.res} 后面加上一句{$R Test.res} 即可。
 
procedure TForm1.btn1Click(Sender: TObject);var Res: TResourceStream;begin try Res := TResourceStream.Create(Hinstance, 'bdll', 'dllfile'); Res.SavetoFile('b.dll'); finally Res.Free; end;end;使用之前要先生成你自己的资源文件,可用记事本新建一个 Test.rc 文件,文件中的内容如下:bdll dllfile b.dll保存后要用 brcc32.exe 编译一下,即可生成一个 Test.res 文件,然后在项目文件里引用即可。
 
当你成功释放出了 b.dll 之后(可用 if FileExists(b.dll) then ...)就可以调用了。其实若无必要,完全可以不用这种方法,祝你好运。
 
我没有成功没有生成b.dll 还是提示没有找到b.dll
 
我在a.exe或者合起来的c.exe里面procedure TForm1.FormCreate(Sender: TObject);就用到了d.ll里面的东西了
 
看来你的确很新,我再回答最后一次吧。1、首先,你的dll是否已经被编进资源文件中了?如果没有,就先做这一步,如果已经成功的编译进.res资源文件中了,那么进行下一步;2、这个包含dll的资源文件是否正确的被程序加载了?就是用{$R Test.res}语句即可,这样编译出来的exe文件就会包括那个dll了,虽然它被藏在资源里,但也是在exe里;3、上面2步都无误的话就是释放并调用的问题了,既然你在FormCreate事件里就要用到dll里的东东,那就在FormCreate事件首先写上释放的代码,至于你说的没有生成b.dll,也可能是你的dll文件很大,如果真是这样,在 Res.SavetoFile('b.dll');后面加上Sleep(5000); // 等待 5 秒试试看能否成功释放出来,又或者你在 FormCreate 里面就写上释放的代码看看能否成功释放,然后再加上你的调用代码。所以我说:如果你的dll文件很大的话还是别用这种方法,这也不是什么高深的技巧或显示你的水平的办法,你也许会认为安全,这也不一定。好了,我写了太多的废话,除非你另开新帖,否则就希望别的高手来解答了,再次祝你好运!!!
 
明显的你的DLL不是通过 LoadLibrary 进行加载的.
 
dll 的内存家载找下 应该是很老的东西了
 
来自:manjel, 时间:2010-5-13 15:30:39, ID:3993117 明显的你的DLL不是通过 LoadLibrary 进行加载的. 也这么认为
 
是啊 我不是通过LoadLibrary 加载的 来自:delphfans,说的我网上找了下有 可是太复杂了 本人就是那么点水平我用他们说的LoadLibrary 加载dll问题解决了
 
多人接受答案了。
 
后退
顶部