如何在运行时动态加载新的dll(动态链接库)

Garriot 2005-03-30 02:39:12
我试图用vb.net在运行的时候加载一个用c语言写的动态链接库。
大体要求是这样的,主程序目录下有几个名称未知的dll动态链接库,我希望主程序在启动的时候检测这些dll文件并动态加载它,以达到使用它们内部某些功能的目的。
我已经做过试验,在代码中用dllimport语句可以在编码的时候实现对这些链接库的加载。但是,dllimport加载dll文件,只能使用dll文件名字符串常量。我无法确定这些文件时候在运行的时候都存在于程序目录内,而且都是使用这个名字,所以用dllimport加载的方式被否决了。
然后我想到了反射。反射倒是可以完全实现检测并动态加载。我用reflection.assembly做了试验,但发现提示dll文件格式不正确。原因可能是反射这种方式只能用于加载.net格式的dll文件。
我现在一头雾水。还有个解决方案就是用LoadLibrary()这个api函数。但是我想.net已经封装了大量个api函数,而且也不提倡再使用win32 api,于是我想寻求一个.net平台内部的解决方案,请大家帮助。
谢谢。
如50分不够,可另开帖加分
...全文
822 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiri07 2005-06-22
  • 打赏
  • 举报
回复
关注
dofly 2005-04-15
  • 打赏
  • 举报
回复
只能為你提前了
Garriot 2005-04-13
  • 打赏
  • 举报
回复
这么多天了,都没人看到马?
江南第八帅 2005-04-04
  • 打赏
  • 举报
回复
非常有建设性的问题~~~~ ^_^
tl_pear 2005-04-04
  • 打赏
  • 举报
回复
我顶
luobing1972 2005-04-04
  • 打赏
  • 举报
回复
我也遇到同样的问题,帮顶
Garriot 2005-04-04
  • 打赏
  • 举报
回复
还没有人能回答吗?愁死我了。
Garriot 2005-04-01
  • 打赏
  • 举报
回复
找过msdn了,没有找到相关的东西,.net的就不必说了,好像没有什么办法。
至于loadlibrary()和gerprocaddress()这几个函数的解释和例子,除了SetHook,和SetWindowText这几个例子,没有如何获取的调用函数返回值的例子
Garriot 2005-04-01
  • 打赏
  • 举报
回复
我再顶
hidejay 2005-04-01
  • 打赏
  • 举报
回复
MSDN
farrio 2005-04-01
  • 打赏
  • 举报
回复
不会。学习!
Garriot 2005-03-31
  • 打赏
  • 举报
回复
用loadlibrary()和gerprocaddress()如何运行带返回值的函数啊
Garriot 2005-03-31
  • 打赏
  • 举报
回复
我顶,我就不信没有解决方案
zhouweiwansui 2005-03-31
  • 打赏
  • 举报
回复
好像只能动态加载。net的dll
zzzjaychung 2005-03-31
  • 打赏
  • 举报
回复
我不懂,只是加个MARK
Garriot 2005-03-31
  • 打赏
  • 举报
回复
都过了一夜了,还没人回答么?
Garriot 2005-03-30
  • 打赏
  • 举报
回复
To lzmtw(水如烟):我的要求不能动用注册表。这种思想类似于plugin,你需要一个dll时,就把它copy到plugin目录,然后主程序初始化的时候会自动调用它,中间,你不需要其它动作。

To Little_Ghost(小鬼) :LoadLibrary()、GetProcess()、FreeLibrary()确实不是很烦琐,但这中间我也遇到了问题。loadlibrary()函数读取dll文件后,用GetProcAddress()函数获得你所需要的功能函数的地址来执行相应函数。
在这里我有一个问题。如果是C/C++语言,这个执行非常方便,因为GetProcAddress()获得的地址其实就相当于函数地址,完全可以用函数指针的方式来执行,但在VB/VB.NET在指针上一直都是弱项。我不太清楚如何通过地址来调用函数。
当然调用也可以求助于api函数CallWindowProc,但是这同样存在问题:通过CallWindowProc()来调用函数,如何来获取函数的返回值呢?我在网上泡了一天都没找到合适的解决方案。
请高手指点,谢谢
Little_Ghost 2005-03-30
  • 打赏
  • 举报
回复
也不是很烦琐阿!
LoadLibrary()
GetProcess()
FreeLibrary()
水如烟 2005-03-30
  • 打赏
  • 举报
回复
没经验。下面只是看法:
“我已经做过试验,在代码中用dllimport语句可以在编码的时候实现对这些链接库的加载。但是,dllimport加载dll文件,只能使用dll文件名字符串常量。我无法确定这些文件时候在运行的时候都存在于程序目录内,而且都是使用这个名字,所以用dllimport加载的方式被否决了。”
症结:无法确定存在于哪个目录
方法:安装此链接库时一般的在注册表上有登记
“我现在一头雾水。还有个解决方案就是用LoadLibrary()这个api函数。但是我想.net已经封装了大量个api函数,而且也不提倡再使用win32 api,于是我想寻求一个.net平台内部的解决方案,请大家帮助。”
症结:我想.net已经封装了大量个api函数,而且也不提倡再使用win32 api
方法:看NET的Win32API类是否有你要的函数;没有的话,既然NET都封装,自己也封装有何不妥呢?
jjkcom 2005-03-30
  • 打赏
  • 举报
回复
very good question
加载更多回复(1)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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