- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
示例代码如下:
CString CMeetingScheduleAssistantApp::GetStudyPointDescriptionEx(bool b2019Format, const int iStudyPoint, const bool bFormatText /*false*/)
{
CString strDescription = _T("<ERROR>");
LANGUAGE_E eForeignLanguage = GetForeignLanguageGroupLanguageID();
if (iStudyPoint == 0)
strDescription = _T("");
else
{
if (UseTranslationINI(eForeignLanguage))
{
// Snipped
}
else
{
HINSTANCE hInst = nullptr;
if (eForeignLanguage != LANGUAGE_ENGLISH)
hInst = LoadLibrary(theApp.GetForeignLanguageGroupSatelliteDLLPath());
else
hInst = AfxGetInstanceHandle();
if (b2019Format)
strDescription.LoadString(hInst, IDS_STR_NEW_STUDY_POINT_01 + (iStudyPoint - 1));
else
strDescription.LoadString(hInst, + (iStudyPoint - 1));
if (eForeignLanguage != LANGUAGE_ENGLISH)
FreeLibrary(hInst);
}
if (bFormatText) // AJT v16.0.9
{
CString strFormattedText;
strFormattedText.Format(_T("%d - %s"), iStudyPoint, (LPCTSTR)strDescription);
strDescription = strFormattedText;
}
}
return strDescription;
}
注意到加载 DLL 资源文件的函数调用了吗?
它工作正常。我的问题:
我应该加载此 DLL 文件一次并缓存应用程序类中的 HINSTANCE
直到用户改变主意,还是应该不断加载在我需要提取自定义资源值时加载和卸载?
最佳答案
根据所有友情提供的评论,我们决定缓存资源。所以,我现在将资源加载到应用程序类的一个成员变量中。这只会在用户更改设置时执行一次。此后,应用程序使用缓存的实例。
void CMeetingScheduleAssistantApp::LoadForeignLanguageGroupSatelliteFile()
{
LANGUAGE_E eForeignLanguage = GetForeignLanguageGroupLanguageID();
ResetForeignLanguageGroupResources();
// Load the new foreign language resources
if (UseTranslationINI(eForeignLanguage))
ReadTranslationINI(m_SatelliteINI, eForeignLanguage, true);
else
{
if (eForeignLanguage == LANGUAGE_ENGLISH)
m_hInstanceSatelliteDLL = AfxGetInstanceHandle();
else
m_hInstanceSatelliteDLL = LoadLibraryEx(GetForeignLanguageGroupSatelliteDLLPath(), nullptr,
LOAD_LIBRARY_AS_IMAGE_RESOURCE | LOAD_LIBRARY_AS_DATAFILE);
}
}
void CMeetingScheduleAssistantApp::ResetForeignLanguageGroupResources()
{
if (m_hInstanceSatelliteDLL != nullptr)
{
FreeLibrary(m_hInstanceSatelliteDLL);
m_hInstanceSatelliteDLL = nullptr;
}
m_SatelliteINI.clear();
}
由于这是主要 GUI 界面的一组附加资源,因此实例存储在自定义变量中,而不是系统变量 m_hResource
。
因此,我原来问题中显示的方法现在看起来像:
CString CMeetingScheduleAssistantApp::GetStudyPointDescriptionEx(bool b2019Format, const int iStudyPoint, const bool bFormatText /*false*/)
{
CString strDescription = _T("<ERROR>");
LANGUAGE_E eForeignLanguage = GetForeignLanguageGroupLanguageID();
if (iStudyPoint == 0)
strDescription = _T("");
else
{
if (UseTranslationINI(eForeignLanguage))
{
CString strLabel, strKey = _T("StudyPoints");
if (b2019Format)
{
strKey = _T("StudyPoints2019");
strLabel.Format(_T("IDS_STR_NEW_STUDY_POINT_%02d"), iStudyPoint);
}
else
strLabel.Format(_T("IDS_STR_STUDY_POINT_%02d"), iStudyPoint);
// AJT v17.1.3 We now use our own method
strDescription = theApp.GetStringFromTranslationINI(m_SatelliteINI, strKey, strLabel);
}
else
{
if (b2019Format)
strDescription.LoadString(m_hInstanceSatelliteDLL, IDS_STR_NEW_STUDY_POINT_01 + (iStudyPoint - 1));
else
strDescription.LoadString(m_hInstanceSatelliteDLL, + (iStudyPoint - 1));
}
if (bFormatText) // AJT v16.0.9
{
CString strFormattedText;
strFormattedText.Format(_T("%d - %s"), iStudyPoint, (LPCTSTR)strDescription);
strDescription = strFormattedText;
}
}
return strDescription;
}
关于c++ - 你缓存 LoadLibrary HINSTANCE 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54747003/
注册窗口类时需要填写WNDCLASS结构,它有一个 hInstance领域: typedef struct { UINT style; WNDPROC lpfnWndProc;
为什么 WinMain 可以有两种返回类型? 如果我删除它,将报告此警告: warning C4007: 'WinMain' : must be '__stdcall' 或者我错误地读取了 int W
win32应用程序的HINSTANCE被传递给WinMain,但是有没有其他方法可以确定当前的HINSTANCE(如果你不知道,我对win32编程很陌生!)?我需要在库内创建一个窗口(因为该库是跨平台
我用 CreateWindow创建主窗口。 hInstance在 WNDCLASSEX指定注册类的实例。所以我需要hInstance在 CreateWindow找到它的功能。 我用 CreateWin
在单个 .exe 应用程序中,WinMain 入口点有一个 HINSTANCE 参数,它应该是一个伪句柄(因为等同于 GetModuleHandle(NULL) 返回一个伪句柄,根据 MSDN)。我想
我正在使用 ShellExecute 从 C++ 生成一个应用程序,所以我有应用程序的 HINSTANCE。 现在如何使用 HINSTANCE 关闭它?我可以使用 WaitForSingleObjec
我正在编写一个缓存处理程序,它需要应用程序的每个实例都有一个唯一的 ID 号,这样当有人在两个实例中打开两个项目时,缓存就不会混淆。根据this thread ,似乎传递给 WinMain 的 HIN
我使用 ShellExecute 从我当前的应用程序创建一个新的应用程序实例。我想获取该应用程序的 HWND。是否可以从 HINSTANCE 获取 HWND 或者我需要使用 EnumWindows?
我在 VC++ 中创建了一个 DLL 作为 Win32 项目 DLLMAIN函数是 BOOL APIENTRY DllMain( HMODULE hModule,
我正在尝试使用 BTMemoryModule.pas 单元从资源加载 dll,但收到此错误无法加载指定的模块。这些是我使用 BTMemoryModule 从 exe 调用的 dll 中的过程: pro
标题已经说了。 请参阅真实世界示例:https://learn.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-findexe
我不得不更新一些字符串,因为多年来发生了一些变化,但现在它无法编译。这最初是在 VS2010 中完成的。它是在 C 的 Win32 API 中编码的。现在我使用的是 2012,它抛出了这些错误: 1
考虑以下代码: #include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI wWinMain(HINSTANC
我正在使用 Shell 命令启动一个进程。我的开发环境是 C++/QT Creator/QT Libraries 和 Windows APIs。 如何处理 HINSTANCE 返回值? if (hIn
示例代码如下: CString CMeetingScheduleAssistantApp::GetStudyPointDescriptionEx(bool b2019Format, const int
有没有一种方法可以从 WinAPI 中转发声明 HINSTANCE 类型,而不包括完整的(和大的)windows.h header ? 例如,如果我有一个拥有 HINSTANCE mInstance
在使用 Windows API 进行编程时,我总是将 WinMain 中的 HINSTANCE 立即设为全局变量。如果我想做一个 OK 按钮,我会这样做(给定全局 HINSTANCE g_hInsta
我正在使用 -Wbad-function-cast 标志在 gcc 上编译程序。 gcc 显示以下警告: 转换与函数类型不匹配 这是警告行:int ret = (int) FindExecutable
Win32 应用程序。在 MyRegisterClass 中,wc.hInsance = hInstance。显然“hInstane 是一个未定义的标识符。这是为什么?我使用的是 Visual Stu
如何在不使用全局变量的情况下获取 winMain 的 HWND hwnd 的 hInstance 应用程序句柄?我正在尝试创建一个发送到 LRESULT CALLBACK 的对话框,以使其显示某些菜单
我是一名优秀的程序员,十分优秀!