none
如何获取DLL自身Handle? RRS feed

  • 问题

  • 写了一个DLL,头文件及全局变量定义如下:
    #include "stdafx.h"
    #include <stdio.h>
    HMODULE dllhandle;
    FARPROC xprintfaddr;
    

    DllMain函数定义如下:
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){
    	if(ul_reason_for_call==DLL_PROCESS_ATTACH){
    		printf("Loaded Successfully.\n\n");
    		dllhandle=GetModuleHandle(NULL);
    		if(dllhandle){
    			printf("Got DllHandle Successfully.\ndllhandle:%d\n\n",dllhandle);
    		}
    		else{
    			printf("Got DllHandle Failed.\nError:%d\n",GetLastError());
    			return TRUE;
    		}
    		xprintfaddr=GetProcAddress(dllhandle,"xprintf");
    		if(xprintfaddr){
    			printf("Got ProcAddress Successfully.\nxprintfaddr:%d\n\n",xprintfaddr);
    		}
    		else{
    			printf("Got ProcAddress Failed.\nError:%d\n",GetLastError());
    			return TRUE;
    		}
    	}
     return TRUE;
    }
    
     另有一函数xprintf定义如下:
    extern "C" __declspec(dllexport) void _cdecl xprintf(){
    	printf("Use Successfully.\n");
    }
    
    编译,连接,得到testdll2.dll。
    于是写了一个EXE,代码如下:
    #include <stdio.h>
    #include <windows.h>
    int main(){
    	HMODULE dllhandle;
    	FARPROC xprintfaddr;
    	dllhandle=LoadLibrary("D:\\VC\\MyProjects\\testdll2\\Debug\\testdll2.dll");
    	printf("-----------------------------------------\n");
    	if(dllhandle){
    		printf("Got DllHandle Successfully.\ndllhandle:%d\n\n",dllhandle);
    	}
    	else{
    		printf("Got DllHandle Failed.\nError:%d\n",GetLastError());
    		return TRUE;
    	}
    	xprintfaddr=GetProcAddress(dllhandle,"xprintf");
    	if(xprintfaddr){
    		printf("Got ProcAddress Successfully.\nxprintfaddr:%d\n\n",xprintfaddr);
    	}
    	else{
    		printf("Got ProcAddress Failed.\nError:%d\n",GetLastError());
    		return TRUE;
    	}
    	return 1;
    }
    
    编译连接得到load.exe,于cmd下运行load.exe,输出结果如下:
    Loaded Successfully.
    Got DllHandle Successfully.
    dllhandle:4194304
    Got ProcAddress Failed.
    Error:127
    -----------------------------------------
    Got DllHandle Successfully.
    dllhandle:268435456
    Got ProcAddress Successfully.
    xprintfaddr:268439567
    可以看到,同样的一段获取地址的代码,在EXE中成功获取了,但是DLL本身却失败,
    而且可以看到,两次获取的dllhandle是不一样的,这说明DLL代码里面获取的handle是错误的:
    Got DllHandle Successfully.
    dllhandle:4194304
    这才导致了后来的获取地址失败。
    DLL中用于获取Handle的代码是这句:
    dllhandle=GetModuleHandle(NULL);
    
    
    难道这样写错了吗?求教。


    2011年8月5日 4:04

答案

  • 呵呵,经过反复实验我发现这样写还真的是错了。
    如上图,填入NULL参数获取的是创建线程的Module的Handle,本DLL中获取的也就是加载它的EXE的Handle,要获取DLL自身的Handle,要改成:
    dllhandle=GetModuleHandle("testdll2");
    这样,输出的结果就正确了!
    • 已标记为答案 X.TK 2011年8月5日 4:38
    2011年8月5日 4:38

全部回复

  • 呵呵,经过反复实验我发现这样写还真的是错了。
    如上图,填入NULL参数获取的是创建线程的Module的Handle,本DLL中获取的也就是加载它的EXE的Handle,要获取DLL自身的Handle,要改成:
    dllhandle=GetModuleHandle("testdll2");
    这样,输出的结果就正确了!
    • 已标记为答案 X.TK 2011年8月5日 4:38
    2011年8月5日 4:38
  • 你好,

     

    很高兴听到您已经通过自己的努力,发现并解决了问题。同时也感谢您能够在此分享您的解决方案。这对与其他与您有相似问题的用户,将会有极大的帮助。谢谢您的支持


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月8日 8:39