C++ win32 从资源加载字符串

标签 c string winapi api resources

好吧,所以我最近决定将我的应用程序中的每个字符串都放入一个 STRINGTABLE 中,这样我就可以轻松地翻译成不同的语言。 我知道如何使用 LoadString() api,但这涉及到我要加载的每个字符串都有一个不同的变量,如果我的应用程序有 100 个字符串,那就是很多变量。这是最好的方法吗?或者我应该创建一个全局变量,用作缓冲区以根据需要加载字符串?此外,由于无法知道我的字符串有多大,我应该只创建一个足够大的缓冲区来容纳我可能拥有的任何字符串,还是有更好的方法来做到这一点?

按需加载字符串是否也会影响性能?有什么方法可以预加载它们吗?

回复:好的,我已经尝试创建一个 256 字节大小的缓冲区并根据需要将字符串加载到其中,尽管我遇到了一个小问题......

这是我显示错误消息的代码,错误是“错误分配内存!”

LoadString(g_hInst, IDS_ERROR_MEMORY, szBuffer, sizeof(szBuffer)/sizeof(TCHAR));
MessageBox(NULL, szBuffer, TEXT("Error"), MB_OK | MB_ICONERROR);
ExitProcess(1);

我将缓冲区作为全局变量:TCHAR szBuffer[256];

这行得通,但是,id 也想将“错误”文本存储到字符串表中,并在我想显示错误时加载它,问题是这需要我有 2 个全局变量来加载字符串,并且有有些地方我需要一次加载更多。

有没有比使用多个全局变量更好的解决方案?

最佳答案

如果需要,您当然可以预加载它们。您只需要创建一个字符串指针数组并将每个字符串加载到该数组中。或者您可以使用 HashMap 或类似的东西。

性能不好?这取决于。如果您在用户界面中将这些字符串显示为提示,我看不出按需要加载每个字符串会如何成为性能问题。无论如何,操作系统都会进行一些智能缓存,因此您不会为需要显示的每个字符串都访问磁盘。另一方面,如果您打算在紧密循环中使用这些字符串,那么最好将它们预加载到内存中,这样您就不必一直调用 LoadString

就缓冲区而言,我总是分配一个与我希望在资源文件中包含的最大字符串一样大的缓冲区。考虑到用户界面字符串通常非常小,一个 256 字节的缓冲区就足够了。任何比这更大的东西,我要么在启动时预加载到内存中以便保留它,要么我编写一个单独的方法在加载时分配一个字符串而不是保留一个缓冲区。

附加信息:

与其为字符串定义全局变量,不如考虑编写一个函数来加载资源字符串、制作它的副本并返回该副本。即:

char * LoadStringFromResource(uint id)
{
    // szBuffer is a globally pre-defined buffer of some maximum length
    LoadString(ghInst, id, szBuffer, bufferSize);
    // yes, I know that strdup has problems. But you get the idea.
    return strdup(szBuffer);
}

然后你的代码变成:

char* errMem = LoadStringFromResource(IDS_ERROR_MEMORY);
char* errText = LoadStringFromResource(IDS_ERROR_TEXT);
MessageBox(NULL, errMem, errText, MB_OK | MB_ICONERROR);
free(errMem);
free(errText);

以上是C代码,但你可以很容易地转换成C++。特别是,您可能想要修改包装函数,以便它返回一个 C++ 字符串——当它超出范围时会自动释放的东西(使用智能指针或任何现代等效物)。

关于C++ win32 从资源加载字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6075138/

相关文章:

c++ - 需要管理一 block 'theoretical'内存的slab

c - 内存占用优化与性能

c++ - 如何将 remove_if 与 !函数的(不是函数的)

winapi - FS在Win32中注册

c - 关于C中char和int指针的几点疑惑

c - sprintf 中的 %f 似乎在 TI 84 CE 在线 IDE 中不起作用

c - BSP 实现 Sieve Of Eratosthenes 不打印 C

arrays - PowerBuilder - 字符串到数组的转换

windows - 将 'open' 传递给 ShellExecute 不会在特定计算机上打开 word 文件

c++ - 设置 NOTIFYICONDATA 结构的 szTip 字段