DLL中如何获取自身的路径

1.DLL获取文件目录

GetModuleFileName可以获得指定模块的路径,如果传入NULL,则输出所在进程exe的路径,因此在DLL中要想获得当前DLL的路径,必须获得DLL的实例。这样我们才能得到当前DLL的路径,总结可分为如下四种方法,这些方法的不同只在于获得DLL的模块实例句柄方法不同:

[cpp]  view plain  copy
 print ?
  1. //编译器伪变量  
  2. void __stdcall GetCurDLLDir()  
  3. {  
  4.     TCHAR szDir[MAX_PATH];  
  5.   
  6.     HMODULE hModule = reinterpret_cast<HMODULE>(&__ImageBase);  
  7.     GetModuleFileName(hModule, szDir, MAX_PATH);  
  8.     PathRemoveFileSpec(szDir);  
  9.   
  10.     MessageBox(NULL, szDir, TEXT("GetCurDLLDir-DLL路径名"), MB_OK);  
  11. }  
  12.   
  13. //GetModuleHandleEx获得模块句柄  
  14. void __stdcall GetCurDLLDir2()  
  15. {  
  16.     TCHAR szDir[MAX_PATH];  
  17.     HMODULE hModule;  
  18.   
  19.     GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPTSTR)GetCurDLLDir2, &hModule);  
  20.     if(NULL != hModule)  
  21.     {  
  22.         GetModuleFileName(hModule, szDir, MAX_PATH);  
  23.         PathRemoveFileSpec(szDir);  
  24.     }  
  25.   
  26.     MessageBox(NULL, szDir, TEXT("GetCurDLLDir2-DLL路径名"), MB_OK);  
  27. }  
  28.   
  29. //ATL  
  30. void __stdcall AtlGetCurDLLDir()  
  31. {  
  32.     TCHAR szDir[MAX_PATH];  
  33.   
  34.     HMODULE hModule = _Module.GetModuleInstance();  
  35.     GetModuleFileName(hModule, szDir, MAX_PATH);  
  36.     PathRemoveFileSpec(szDir);  
  37.   
  38.     MessageBox(NULL, szDir, TEXT("AtlGetCurDLLDir-DLL路径名"), MB_OK);  
  39. }  
  40.   
  41. //全局HMODULE  
  42. void __stdcall GlobalGetCurDLLDir()  
  43. {  
  44.     TCHAR szDir[MAX_PATH];  
  45.   
  46.     HMODULE hModule = g_hModule;  
  47.     GetModuleFileName(hModule, szDir, MAX_PATH);  
  48.     PathRemoveFileSpec(szDir);  
  49.   
  50.     MessageBox(NULL, szDir, TEXT("GlobalGetCurDLLDir-DLL路径名"), MB_OK);  
  51. }  


2.调试的方法

调试DLL导出函数,可以借助于微软的rundll32.exe程序 传入待调试的dll模块[空格]函数名即可

本工程配置如下:


演示文件下载链接  访问密码 7ae5

原创,转载请注明来自http://blog.csdn.net/wenzhou1219

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)是一种开发Windows桌面应用程序的框架,可以使用动态链接库(DLL)来实现英文切换。 首先,我们需要创建一个DLL项目,并在其添加资源文件,包括不同语言的字符串和对应的ID。比如,可以创建两个资源文件,一个是英文字符串,另一个是文字符串,分别命名为en-US.res和zh-CN.res。 然后,在MFC应用程序使用LoadLibrary函数加载DLL,并调用FindResource和LoadResource函数加载对应语言的资源。可以通过设置不同的语言标识符参数来选择加载不同的资源。例如,对于英文资源,可以使用以下代码: HMODULE hModule = LoadLibrary(_T("dll路径")); HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(IDR_ENGLISH), RT_RCDATA); HGLOBAL hMemory = LoadResource(hModule, hResource); LPVOID lpResource = LockResource(hMemory); CString strEnglish((const char*)lpResource); FreeLibrary(hModule); 对于文资源,只需将IDR_ENGLISH更改为IDR_CHINESE即可。 最后,使用CString或其他方法将获取的字符串显示在MFC应用程序的界面上,即可实现英文切换。 需要注意的是,为了方便切换语言,在MFC应用程序还需提供切换语言的选项或设置,通过相应的逻辑代码来实现切换时重新加载DLL并更新界面显示的字符串。 总结起来,借助MFC的特性和DLL的加载能力,我们可以在应用程序通过加载不同的资源文件来实现英文切换。 ### 回答2: 在MFC使用DLL实现英文切换,可以通过以下步骤进行: 第一步,创建一个DLL项目,用于存储英文的字符串资源。可以在资源文件添加对应的英文字符串,并在代码定义一个函数来获取这些字符串。 第二步,创建一个MFC应用程序项目。在应用程序的初始化过程,加载DLL文件并获取所需要的字符串资源。可以使用LoadLibrary函数加载DLL文件,并使用GetProcAddress函数获取相应函数的地址。 第三步,创建一个语言选择界面,用于让用户选择要使用的语言。可以使用对话框或者菜单添加语言选项。用户选择语言后,将相应的语言标识保存在配置文件或注册表。 第四步,根据用户选择的语言标识,动态修改应用程序的字符串显示。可以通过调用DLL的函数来获取对应的英文字符串,然后将其显示在对应的界面控件上。 第五步,在应用程序的所有界面添加语言切换的功能。可以在每个界面的菜单栏或功能栏上添加一个语言切换的按钮或选项,用户点击按钮或选择选项后,重新加载相应语言的字符串资源,并刷新界面的所有文本。 通过以上步骤,就可以实现MFC应用程序的英文切换功能。用户可以根据自己的需要选择合适的语言,并在应用程序动态更改界面文字的显示。这样可以提供更好的用户体验,同时方便应对不同语言环境下的需求。 ### 回答3: 在MFC实现英文切换可以通过使用动态链接库(DLL)的方式来实现。首先,我们可以在资源文件创建多语言版本的字符串资源,分别对应文和英文。然后,将这些字符串资源保存到一个DLL文件。 在MFC应用程序,我们需要在主窗口初始化时加载这个DLL文件,以便在运行时可以动态切换语言。可以在InitInstance函数使用LoadLibrary函数加载DLL文件,并使用AfxSetResourceHandle函数将资源句柄设置为DLL文件的句柄。 当需要切换语言时,我们可以通过调用AfxSetResourceHandle函数来重新设置资源句柄为DLL文件的句柄,然后强制重绘界面。这样就可以实现界面上的文本、标签等显示为不同的语言了。 另外,为了方便管理和切换语言,可以根据需求在应用程序添加一个菜单或者工具栏,通过点击菜单项或者工具栏按钮在运行时切换语言。当用户通过菜单或者工具栏切换语言时,可以根据用户选择的语言,重新设置资源句柄为相应DLL文件的句柄,并强制重绘界面。 需要注意的是,在切换语言的过程,我们需要注意重新加载语言资源,例如重新加载菜单资源、工具栏资源等,以便将其显示为对应的语言。 总的来说,通过使用DLL实现英文切换可以让我们的应用程序更加灵活多语言化,提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值