获取DLL的文件路径以及调用DLL的文件路径
2014-02-25 13:33
281 查看
如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(
当hModule 为NULL时候 获取到路径为调用者,当hModule为main入口的
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
中的hModule的时候,获取到的路径是DLL本身的路径。实例效果如下:
DLL文件的核心代码如下:
调用DLL文件的程序调用DLL代码如下:
HMODULE
hModule,
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; }
相关文章推荐
- Exercise 4:变量
- 2012年蓝桥杯【初赛试题】 转方阵
- s3c6410地址映射
- XPC Service
- 学习视频、高清影视下载
- [asp.net]C#实现json的序列化和反序列化
- JAVA实现汉字转全拼或首字母
- 在vc的cpp头部加入#define new DEBUG_NEW的作用
- javaBean与Map<String,Object>互转
- 简要了解API
- 【学习笔记】android源码下载
- Cscope教程
- 诺基亚为何推安卓手机:微软意在围剿谷歌服务
- 杭电 看归并排序和快速排序
- 数据处理
- Android Fragment完全解析,关于碎片你所需知道的一切
- linux shell 使用相关汇总(条件判断)
- #pragma mark
- Monkey测试4——Monkey命令行可用的全部选项
- uva10003