DLL中如何获取自身的路径

9 篇文章 0 订阅

问题:DLL中如何获取DLL自身所在的文件夹,而不是主调程序的。用GetCurrentDirectory获取的是exe主调程序所在的目录,不符合我的要求;用GetModuleFileName只能在DllMain中才能获取到,因为DllMain第一个参数hInstance就是DLL模块局并,而GetModuleFileName()只有传入DLL模块句柄才能获取DLL路径。

但是,如果不是DllMain项目,而是Win32 DLL勾选MFC选项的项目,入口函数是int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]),没有DllMain那样的入参hInstance,又该如何获取DLL的模块句柄呢?

方法1:需要传入DLL句柄

 使用一个全局变量保存DllMain中的hInstance,然后在你需要的地方传给::GetModuleFileName()。

方法2:需要传入DLL名称

HMODULE hMod = GetModuleHandle(_T("mydll.dll"));
if(hMod != NULL)
{
    TCHAR szBuffer[MAX_PATH] = {0};
    GetModuleFileName(hMod, szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1);
}

方法3:通用办法

TCHAR szDLLFolder[MAX_PATH + 1];
GetModuleFileName(AfxGetApp()->m_hInstance, szDLLFolder, MAX_PATH);
//或GetModuleFileName(::AfxGetResourceHandle(), szDLLFullPath, MAX_PATH);
//或GetModuleFileName(::AfxGetInstanceHandle(), szDLLFullPath, MAX_PATH);

先补充说明一下,VC有三种DLL项目

(1)MFC扩展DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

(2)Win32标准DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
(3)Win32勾选MFC选项DLL( dll被 加载 不会进入函数_tmain(),只能提供导出接口

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])


  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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实现英文切换可以让我们的应用程序更加灵活多语言化,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值