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

本文介绍如何使用GetModuleFileName函数在DLL中获取DLL自身的路径及调用者的路径。当hModule参数为NULL时,获取的是调用者的路径;当hModule为DllMain函数中的hModule时,则获取DLL自身的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何在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文件的核心代码如下:

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

  

 

转载于:https://www.cnblogs.com/JczmDeveloper/p/3566529.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值