【DLL】关于DLL在程序运行时加载的问题

jayu1987 2010-02-10 09:14:22
公司有一个项目提出了一个需求,要求在项目里调用某种设备的驱动程序。
这种设备属于专业设备,有很多的厂家在生产,但是这些厂家并没有一个统一的标准来做,因此导致每个厂家生产的设备,都有一个属于自己的驱动程序接口。
A厂家提供了Dll_A.dll,并导出了一大堆的函数给开发人员使用。
同理B厂家C厂家都提供了不同的DLL,这些DLL的接口完全不同……

为了整合这些不同的DLL,我简单的弄了一个适配器,在基类提供接口,在不同的子类中【静态链接】了不同厂家的DLL并使用这些DLL导出的函数来实现基类的功能。

现在需求发生了变化!
公司不希望“把程序交给用户的时候,要把所有厂家提供的DLL都打包给用户”。
而是希望“把程序交给用户之后,用户可以通过添加不同的DLL来实现对不同厂家设备的支持”

于是我的代码出现了问题,在运行时,会报“找不到XXX.dll。重新安装程序可能解决这个问题”。

我的第一个解决方案是把所有的DLL改为【动态链接】,然后在没有这种DLL的时候,我就不去初始化那个封装了它的类,这样就不会出现那种错误了。

但是这个方案被上面否了,上面不希望我在代码中使用LoadLibrary。

于是希望大家能帮我一下,如果真的有别的办法来解决这个需求,希望能提供给我一个思路,如果真的没有别的办法来解决这个需求,希望能给我一个合理的理由,我好和上面交代……

文字很长,分很少,问题很复杂,给大家赔个不是先……实在是没有更多的分了 T T,去哪儿刷分啊……
...全文
227 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayu1987 2010-03-16
  • 打赏
  • 举报
回复
非常抱歉!
这么久才回来看 T T,过年+出差+搬家……乱七八糟的事情一弄这个就忘掉了……

先说下事情的结果: 因为项目需求再度变化,于是现在只需要提供一个厂家的接口,于是就没这个问题了……

总之谢谢icansaymyabc以及其它回帖的朋友们,这个问题虽然已经不复存在,但是你们的支持对我今后的工作会有极大的帮助~

再次为隔了这么久才结帖表示歉意
taodm 2010-02-11
  • 打赏
  • 举报
回复
“上面不希望我在代码中使用LoadLibrary”的理由呢?
icansaymyabc 2010-02-11
  • 打赏
  • 举报
回复
“这些厂家并没有一个统一的标准来做”
“把程序交给用户的时候,把所有厂家提供的DLL都打包给用户”
“把程序交给用户之后,用户可以通过添加不同的DLL来实现对不同厂家设备的支持”
“不希望在代码中使用LoadLibrary”

这些条件表面上看来不合理。也让人觉着窝囊。但是自行补充一些条件还是可以貌似完成的。

0、尽管你不提供DLL给用户,尽管用户可以添加不同的DLL,但是用户能添加的DLL必须是你们在代码中明确予以支持的,任何你们未曾提供支持的DLL都不可能被添加。这是最基本的条件,原则性的要求,否则就是扯淡

1、VC 里面有一个“动态连接库延迟加载”的选项,用上它,所有的DLL仅在其输出函数被调用了才加载(事实上系统也是用LoadLibrary实现的,不过你的代码里不会出现 LoadLIbrary)。你可以在代码中自行检查DLL的存在性,你自己保证不会调用不存在的DLL的输出函数。

2、如果办法1也被你的“上面”拒绝了,还可以变通一下,就是在系统的DLL搜索路径的最后的位置上放上完整的假DLL驱动库,只有名称,没有任何代码的那种。它的作用就是保证你的程序启动时加载DLL不出错。而用户自行添加的DLL在搜索路径中都将位于假DLL之前,如果用户添加了DLL,你的假DLL就不会被加载。
tq65535 2010-02-11
  • 打赏
  • 举报
回复
可能因为 LoadLibrary 字母太长 了吧
CSDMAdmimistrator 2010-02-10
  • 打赏
  • 举报
回复
你让上面的去吃屎

一定要长









































































回复内容太短了!
想出这个限制的家伙JJ太短
jayu1987 2010-02-10
  • 打赏
  • 举报
回复
呃, 没刷新的关系,没看到2楼,抱歉哈~~

我的方法好不好不重要,现在的问题是我的方法不被上面接受,因此我需要一个比这个方法更好的方法,或者是一个可以确保没有比这个方法更好的方法的理由 ……
jayu1987 2010-02-10
  • 打赏
  • 举报
回复
太晚了,下班回去睡觉咯……
明天回来看 T T
希望不要还是没人理我OTL
twistmost 2010-02-10
  • 打赏
  • 举报
回复
你的方法很好啊。用LoadLibrary的话 1)自己定位每个用到的函数,2)预先还要判断DLL是不是存在才能去调用
jayu1987 2010-02-10
  • 打赏
  • 举报
回复
T T

为什么没人理我……

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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