在dll中使用
g_hBitmap = (HBITMAP)LoadImage(g_hInst, TEXT("e:\\1.bmp"), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
其中第一个参数原来我设置为了NULL,
这样有时候就会g_hBitmap == NULL,即load失败,但是有时候会成功,后来我把dllmain中得到的hinstance传给g_hInst,就再也不出错.
我的理解是hinstance是作为dll重定位的标志的,以此为基础来计算代码位移
是这样吗?
但问题是为什么有时候又能成功的load呢?
疑惑了.
g_hBitmap = (HBITMAP)LoadImage(g_hInst, TEXT("e:\\1.bmp"), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
其中第一个参数原来我设置为了NULL,
这样有时候就会g_hBitmap == NULL,即load失败,但是有时候会成功,后来我把dllmain中得到的hinstance传给g_hInst,就再也不出错.
我的理解是hinstance是作为dll重定位的标志的,以此为基础来计算代码位移
是这样吗?
但问题是为什么有时候又能成功的load呢?
疑惑了.
解决方案 »
- 用opencv如何获取JPEG压缩域的数据呢?
- 关于WPARAM wParam, LPARAM lParam 参数传递
- 关于浏览器中的地址转化为IP地址
- 请问:用new分配一个数组pArray,delete删除之后,如何判断pArray已经删除,像这样吗pArray == NULL ? 好像不行,pArray的值还是原先的值
- 阻塞套接字(CSocket)能否设定超时?
- 〉〉〉在switch语句中能不能定义类变量????
- 一个关于document/view的问题!!!
- ***********************急,请问用TC3。0如何在一个文本文件中查找相应的字符串?
- 如何获得类似资源管理器上的磁盘图标
- 采用SendNotifyMessage会丢失消息吗?
- VC中如何控制CEdit控件换行?
- 修改别人程序的图片可以解决了,但是移动图片还不可以?
如果是远程注入dll的话,那么函数的地址就是以hInstance为标准来计算的!
所以说hInstance是重定位的标准
在exe中加载资源,搜索顺序一般是exe->扩展dll->MFC DLL。
如果扩展dll中加载资源,搜索顺序是扩展dll->MFC DLL->exe。
如果期望改变搜索顺序,就应该在Load资源之前,改变资源句柄:
HINSTANCE hRes = AfxGetResourceHandle();
AfxSetResourceHandle(::GetModuleHandle("Mydll.dll"));
//此处加载资源,譬如LoadBitmap,LoadString,等等
AfxSetResourceHanle(hRes);
要注意的是,在扩展dll中,AfxGetInstanceHandle返回的是Exe的句柄而不是dll的句柄。所以此处使用::GetModuleHandle。
如果多个模块映射到同一基址,装载器会自动进行重定位,这会浪费一些时间,所以一般都在link的时候使用/REBASE指令改变基址。
用什么标准来改变基址呢?
First letter Base address
A - C 0x60000000
D - F 0x61000000
G - I 0x62000000
J - L 0x63000000
M - O 0x64000000
P - R 0x65000000
S - U 0x66000000
V - X 0x67000000
Y - Z 0x68000000
The system DLLs are currently based in memory from 0x70000000 to 0x78000000 (0x68000000 to 0x78000000 on MIPS). Therefore, you should base your DLLs from 0x60000000 to 0x68000000. One possible scheme is to choose a base address based on the first letter of the DLL name.