2011-05-20 87 views
5

好吧,所以我最近做出了将我的应用程序中的每个字符串放入STRINGTABLE的决定,所以我可以很容易地翻译成不同的语言。 我知道如何使用LoadString()api,但是这涉及到我想要加载的每个字符串都有一个不同的变量,如果我的应用程序有100个字符串,那就是很多变量。这是做这件事的最好方法吗?或者我应该创建一个全局变量,用作缓冲区来根据需要加载字符串?另外,既然没有办法知道我的字符串有多大,我应该创建一个足够大的缓冲区来容纳我可能拥有的任何字符串,或者有更好的方法来做到这一点?C++ win32从资源加载字符串

还正在根据需要加载字符串性能不好?有什么方法可以预先加载它们吗?

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

使用支持本地化的GUI框架会容易得多 – 2011-05-20 18:22:24

回答

4

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

性能不好?这取决于。如果您将这些字符串显示为用户界面中的提示,我不会看到如何加载每个字符串,因为它将是一个性能问题。无论如何,操作系统会做一些智能缓存,所以它不会像你需要显示的每一个字符串一样敲击磁盘。另一方面,如果你要在紧密的循环中处理这些字符串,那么最好将它们预加载到内存中,这样就不必一直呼叫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++字符串 - 当它超出作用域时(使用智能指针或任何现代等价物),它将自动释放。

+0

感谢这很好。 – Josh 2011-05-20 19:21:49

+0

'strdup()'不是ISO C标准的一部分,它更像是Posix。 MinGW接受它在GNU C方言中编译。 – Salvador 2014-06-19 02:24:48

+2

哇。因为我在示例中使用了'strdup',因此降低了投票率?苛刻。我甚至评论了我的使用情况,以防止因此而遭到批评。好吧。不讨人喜欢。 – 2014-06-19 12:07:22