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

ec446ca031399cddcf2422b640012582.png

DLL文件的核心代码如下:

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代码如下:

//静态库调用

#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 <

//dll的静态调用

//int rs2 = sub(100,33);

//cout << rs2 <

//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;

}

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

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

LabVIEW如何方便地调用DLL文件

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

C&plus;&plus; exe调用dll文件

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

【转】C&num;调用DLL

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

在VC中创建并调用DLL

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

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

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

在Delphi中静态调用DLL

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

随机推荐

我的MYSQL学习心得(十四) 备份和恢复

我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

New Career

Today I received the official confirmation letter with very good grade for the probation, it means t ...

Android 6&period;0 运行时权限处理

在运行时请求权限 从Android 6.0(API级别23)开始,用户权限授予应用程序在应用程序运行时,当他们安装程序.这种方法简化了应用程序的安装过程,因为用户不需要安装或更新应用程序时授予权限.这 ...

jquery条件选择多个元素(与、或者)

或者:选择器用逗号分隔,这也对应了jquery对象转dom为$(obj)[0]的写法 如:$('div[name="a"],div[name="b"]') :h ...

iOS 钥匙串 指纹识别 get和Post请求的区别

01-钥匙串 1. 通过系统提供的钥匙串功能可以在本地保存密码,系统使用AES的方式对密码加密 a. 查看Safari中保存的密码 2. 使用第三方框架SSKeychain把密码保存到钥匙串和获取钥匙 ...

UVa11082 Matrix Decompressing(最小费用最大流)

题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

Java实现多线程邮件发送

利用java多线程技术配合线程池实现多任务邮件发送. 1.基本邮件发送MailSender package hk.buttonwood.ops.email; import java.io.File; ...

java&lowbar;String和StringBuffer区别分析

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供 ...

CentOS自带mysql配置&lpar;密码更改、端口开放访问、添加进系统启动项&rpar;

前些天虚拟机安装好了CentOS6.1,但是自己想远程连接自带的mysql发现不知道如何改密码,于是谷歌一下,把结果记录下来,方便后期自己使用: 方法一: # /etc/init.d/mysql st ...

awk命令基本使用方法

awk命令 基本用法 awk '{print $1, $4}' netstat.txt 单引号中大括号的部分就是awk语句 $1至$n表示第几列,$0表示整行 格式化输出的方法 $ awk '{pri ...

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐