中关村在线

首页 排行 新品 问答 下载 论坛 手机 笔记本 数码相机 主板 显卡 平板电脑 更多

VB找不到工程或库

举报
讨论回答 (9)
chenjie3337401
lly061508
66348968
hjylaijuan
car_fan
这个是微软一个很诡异的设计。如果你要使用LoadString获得在动态连接库的资源中保存的String,那么你不能用GetModuleHandle(NULL)来获得模块句柄,因为这个函数会返回调用你这个DLL的主程序的句柄,而LoadString需要你提供你要加载的字符串所在的那个模块的句柄,如果你是加载EXE的中的字符串,则用GetModuleHandle,如果是DLL的字符串,就稍微有点复杂了,要分两种情况讨论:

首先,如果你使用Micorosft Visual Studio 2003(VC 6是否支持我不确定,因为实在太老了)以上的版本,那非常好,你自己写这么一个函数即可:
#include <windows.h>

extern IMAGE_DOS_HEADER __ImageBase;

inline HINSTANCE GetThisModuleHandle()
{
return reinterpret_cast<HINSTANCE>(&__ImageBase);
}

之后你就这么调用LoadString
LoadString(GetThisModuleHandle(), ...);

在Visual Studio的编译器里面,内置了一个变量__ImageBase,他的类型是IMAGE_DOS_HEADER结构体,这个结构体是每个EXE或者DLL文件的一开始的数据结构,而Windows的HINSTANCE事实上就是加载这个模块在内存空间中的首地址,所以正好__ImageBase的地址就是该模块的HINSTANCE的值,这样你直接转换即可。这种方法是可靠的,MSDN里面很多例子都是用这样的方式获取句柄。

如果你不想这么做或者你的编译器很老不支持__ImageBase,那么这个问题就变得比较复杂了。
1. 如果你能保证,你的DLL一定是动态加载的,也就是通过LoadLibrary方式加载,不是通过编译的时候嵌入lib文件的方式加载的,那么你只需要在DllMain函数中,将第一个HMODULE参数保存下来就行了。HMODULE和HINSTANCE由于16位Windows历史的原因存在,这两个类型在32位Windows下是相同的。这种方法无法用在通过lib链接的方式链接的DLL,因为这种加载DLL的方式DllMain不会被调用。

2. 现在问题就非常棘手了,微软没有再提供什么可行性很高的方法来获得DLL的句柄,一种方法是通过DLL的文件名来获得,将DLL的文件名传递给GetModuleHandle,可以获得DLL的句柄,这个方法看似简单但不可靠,你必须将文件名在程序里面写死,这样一来,如果你时候改变DLL文件名称的话,GetModuleHandle调用就会失败。

综上所述,推荐用__ImageBase的方法,微软自己的标准方法。

其实不仅是LoadString,什么LoadCursor,Load...等一堆函数都要提供资源所在的模块句柄,以上方法都适用。
ganrising
q347109
cost错误
检查一下
slohart
wa123456789
展开查看全部 9 条讨论
精品应用推荐
新浪微博 新浪微博 天气通 天气通 淘宝特价版 淘宝特价版 UC浏览器 UC浏览器
相关问题

手机性能天梯榜讨论

4242 浏览 611 回答

求一款外观漂亮的手机

3.4万 浏览 181 回答

小米3啥时候出

609.1万 浏览 168 回答

苹果WWDC2023开发者大会北京时间6月6日凌晨1点,备受瞩目的苹果开发者大会WWDC 2023主题演讲即将正式开幕,不仅有全新升级的iOS 17操作系统,苹

1674 浏览 153 回答

刚买的r9手机外屏碎了。可以单独换吗?多少钱可以换?

22.9万 浏览 152 回答

热门问题

微信客户服务电话95188人工时间?

2 浏览 3 回答

微信客户服务电话95188人工时间?

苹果怎么打开apk 苹果怎么打开apk

2 浏览 6 回答

苹果怎么打开apk 苹果怎么打开apk

电脑突然显示你的电脑遇到问题,需要重新启动,我们只收集是怎么回事_百

2 浏览 4 回答

电脑突然显示你的电脑遇到问题,需要重新启动,我们只收集是怎么回事_百

比亚迪最大股东是哪个国家的

2 浏览 5 回答

比亚迪最大股东是哪个国家的

格力空调客户服务电话人工服务24小时

2 浏览 2 回答

格力空调客户服务电话人工服务24小时

wps怎么设置文字行间距20磅,我找不到在哪里设置?

2 浏览 6 回答

wps怎么设置文字行间距20磅,我找不到在哪里设置?

我的微信群被人举报了,肿么可以查到是谁举报的?

2 浏览 8 回答

我的微信群被人举报了,肿么可以查到是谁举报的?

樱花漫画官方网站入口是什么?

2 浏览 3 回答

樱花漫画官方网站入口是什么?

笔记本键盘打斜线怎么打出来的啊?

2 浏览 5 回答

笔记本键盘打斜线怎么打出来的啊?

《西游记》中,孙悟空变成什么水果,被黄眉老佛吃了﹖

2 浏览 6 回答

《西游记》中,孙悟空变成什么水果,被黄眉老佛吃了﹖
最新问答

win10系统访问局域网中其他电脑要肿么输入网络凭据

4968 浏览 4 回答

win10系统访问局域网中其他电脑要肿么输入网络凭据

苹果电脑pro系统重装磁盘工具里找不到Macintosh HD是为什么?(如图)

1万 浏览 3 回答

苹果电脑pro系统重装磁盘工具里找不到Macintosh HD是为什么?(如图)

笔记本声音插上耳机还能外放吗

7717 浏览 3 回答

笔记本声音插上耳机还能外放吗

CAD布局怎么没办法打印,打印出来还是空白的,我的图层设置是可以打印的

1.4万 浏览 7 回答

CAD布局怎么没办法打印,打印出来还是空白的,我的图层设置是可以打印的

wpsexcel表格复制后肿么变小了?

5273 浏览 4 回答

wpsexcel表格复制后肿么变小了?
举报
举报成功

经过核实后将会做出处理,感谢您为社区和谐做出贡献。

请选择删除原因
删除成功
确定推荐该回答?
推荐成功

更多频道

频道导航
辅助工具