好吧所以我最近决定将我的应用程序中的每个字符串都放到一个STRINGTABLE中,这样我就可以轻松翻译成不同的语言。 我知道如何使用LoadString()api,但这涉及到我想要加载的每个字符串都有一个不同的变量,如果我的应用程序有100个字符串,那就是很多变量。这是最好的方法吗?或者我应该创建一个全局变量用作缓冲区来根据需要加载字符串?另外,由于无法知道我的字符串有多大,我应该创建一个足够大的缓冲区来保存我可能拥有的任何字符串,还是有更好的方法来做这个?
还是根据需要加载字符串对性能有害吗?有什么方法可以预加载它们吗?
RE:好的,我已经尝试创建一个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];
这可以工作但是,我喜欢也将“错误”文本存储到字符串表中并加载当我想显示错误时,问题是需要我有2个全局变量来加载字符串,那里在某些地方,我需要一次加载更多。
是否有更好的解决方案,然后有多个全局变量?
答案 0 :(得分:7)
如果你愿意,你当然可以预装它们。您只需要创建一个字符串指针数组并将每个字符串加载到该数组中。或者您可以使用哈希映射或类似的东西。
性能不佳?这取决于。如果您在用户界面中将这些字符串显示为提示,我不会看到如何根据需要加载每个字符串将是性能问题。无论如何,操作系统都会进行一些智能缓存,所以你不会因为需要显示的每个字符串而碰到磁盘。另一方面,如果您要在紧密循环中使用这些字符串,那么最好将它们预加载到内存中,这样您就不必一直调用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 ++字符串 - 当它超出范围时会自动释放(使用智能指针或现代等价物)。