如何在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本身的路径。实例效果如下:

DLL文件的核心代码如下:

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

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

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

  

获取DLL的文件路径以及调用DLL的文件路径的更多相关文章

  1. fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。

    为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...

  2. VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

    转自:http://blog.csdn.net/testcs_dn/article/details/27237509 本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链 ...

  3. LabVIEW如何方便地调用DLL文件

    转自:http://bbs.elecfans.com/jishu_469502_1_1.html   LabVIEW调用DLL文件 LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用.比 ...

  4. C++ exe调用dll文件

    生成dll程序 extern "C"_declspec(dllexport) void maopao(int *p,int count);void maopao(int *p,in ...

  5. 【转】C#调用DLL

    C#中如何调用动态链接库DLL(转)     每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主要是基 ...

  6. 在VC中创建并调用DLL

    转自:http://express.ruanko.com/ruanko-express_45/technologyexchange6.html 一.DLL简介 1.什么是DLL? 动态链接库英文为DL ...

  7. QT 调用 DLL 方法(三种方法)

    Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL.为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数) ...

  8. 在Delphi中静态调用DLL

    在Delphi中静态调用DLL top 调用一个DLL比写一个DLL要容易一些.首先给大家介绍的是静态调用方法,稍后将介绍动态调用方法,并就两种方法做一个比较.同样的,我们先举一个静态调用的例子. u ...

  9. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

随机推荐

  1. Android 删除指定文件代码

    package com.tware.pdfdrop; import java.io.File; import android.app.Activity; import android.graphics ...

  2. 匿名hash

    [root@oadb test]# cat a1.pl use Data::Dumper; my @a=qw/1 3 5 7 9/; push @b ,{@a}; print Dumper(@b); ...

  3. 【CF】86 B. Petr#

    误以为是求满足条件的substring总数(解法是KMP分别以Sbeg和Send作为模式串求解满足条件的position,然后O(n^2)或者O(nlgn)求解).后来发现是求set(all vali ...

  4. Super Phyllis(穷举+搜索)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2723 题意:给出一些字符串u,v,代表u-&g ...

  5. POJ_1065_Wooden_Sticks_(动态规划,LIS+鸽笼原理)

    描述 http://poj.org/problem?id=1065 木棍有重量 w 和长度 l 两种属性,要使 l 和 w 同时单调不降,否则切割机器就要停一次,问最少停多少次(开始时停一次). Wo ...

  6. T-SQL查询进阶--详解公用表表达式(CTE)

    简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果 ...

  7. Modifying the ASP.NET Request Queue Limit

    Modifying the ASP.NET Request Queue Limit When ASP.NET is queried, the request for service is carrie ...

  8. 好用的ajax后台框架

    dwz 简单实用的国产jquery Ui框架 http://www.j-ui.com/#_blank

  9. git diff old mode 100755 new mode 100644

    755 vs 644 在linux下载了Qt的软件仓库,拷贝了一份到windows下.在 msysgit 下,发现所有的文件都被修改了. 用 git diff 查看,发现是: $ git diff u ...

  10. 彻底理解position与anchorPoint - Wonderffee's Blog(转)

    引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置?CALayer的position点是哪一点呢?anchorPoint与positio ...