首页 > 其他 > 详细

获取DLL的文件路径以及调用DLL的文件路径

时间:2014-02-25 23:03:36      阅读:476      评论:0      收藏:0      [点我收藏+]

如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize)函数来获取,根据hModule参数来辨别是DLL本身还是DLL的调用者。

当hModule 为NULL时候 获取到路径为调用者,当hModule为main入口的

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) 

中的hModule的时候,获取到的路径是DLL本身的路径。实例效果如下:

bubuko.com,布布扣

DLL文件的核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    TCHAR pCallFileName[MAX_PATH];
    TCHAR pDllFileName[MAX_PATH];
    ::GetModuleFileName(NULL,pCallFileName,MAX_PATH);
    ATL::CString strCall = pCallFileName;
    strCall = L"调用EXE:" + strCall;
    ::GetModuleFileName(hModule,pDllFileName,MAX_PATH);
    ATL::CString strTips = pDllFileName;
    strTips = L"被调用DLL:"+strTips;
    ::MessageBox(NULL,strCall+L"\n"+strTips,L"MyDLL.dll",MB_OK);
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

 调用DLL文件的程序调用DLL代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//静态库调用
#include "../LibTest/lib.h"
#pragma comment(lib,"../release/LibTest.lib")//指定与静态库一起链接
 
//dll 的静态调用
#pragma comment(lib,"../release/MyDLL.lib")
extern "C" _declspec(dllexport) int sub(int x,int y);
 
 
//dll的动态调用
typedef int(*lpSubFun)(int,int);//宏定义函数指针类型
 
int _tmain(int argc, _TCHAR* argv[])
{
    //静态库调用
    //int rs = add(5,10);
    //cout << rs <<endl;
 
    //dll的静态调用
    //int rs2 = sub(100,33);
    //cout << rs2 <<endl;
 
    //dll的动态调用:  LoadLibrary-GetProcAddress-FreeLibrary”
    //系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式
    HINSTANCE hDll;//DLL句柄
    lpSubFun subFunc;//函数指针
    hDll = LoadLibrary(L"../release/MyDLL.dll");
    if(hDll!=NULL)
    {
        subFunc = (lpSubFun)GetProcAddress(hDll,"sub");
    }
    if(subFunc!=NULL)
    {
        int rs3 = sub(100,88);
        //cout << rs3 << endl;
    }
    //cin.get();
    return 0;
}

  

获取DLL的文件路径以及调用DLL的文件路径

原文:http://www.cnblogs.com/JczmDeveloper/p/3566529.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!