如果需要,您当然可以预加载它们。您只需要创建一个字符串指针数组并将每个字符串加载到该数组中。或者您可以使用哈希图或类似的东西。
对性能不利?这取决于。如果您在用户界面中将这些字符串显示为提示,我不认为根据需要加载每个字符串会成为性能问题。无论如何,操作系统都会进行一些智能缓存,因此您不会为需要显示的每个字符串而访问磁盘。另一方面,如果您要在紧密循环中使用这些字符串,那么最好将它们预加载到内存中,这样您就不必调用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++ 字符串——当它超出范围时,该字符串将被自动释放(使用智能指针或任何现代的等价物)。