Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;win32正在从资源加载字符串_C_String_Winapi_Api_Resources - Fatal编程技术网

C++;win32正在从资源加载字符串

C++;win32正在从资源加载字符串,c,string,winapi,api,resources,C,String,Winapi,Api,Resources,好的,所以我最近决定将应用程序中的每个字符串放入STRINGTABLE,这样我就可以轻松地翻译成不同的语言。 我知道如何使用LoadString()api,但这涉及到我要加载的每个字符串都有一个不同的变量,如果我的应用程序有100个字符串,那么就有很多变量。这是最好的方法吗?或者我应该创建一个全局变量作为缓冲区,根据需要加载字符串?另外,既然无法知道我的字符串有多大,我应该创建一个足够大的缓冲区来容纳我可能拥有的任何字符串,还是有更好的方法来实现这一点 另外,根据需要加载字符串是否对性能有害?有

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

另外,根据需要加载字符串是否对性能有害?有什么方法可以预加载它们吗

RE:好吧,我试着创建一个256字节大小的缓冲区,并根据需要将字符串加载到该缓冲区中,尽管我遇到了一个小问题

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

LoadString(g_hInst,IDS_ERROR_MEMORY,szBuffer,sizeof(szBuffer)/sizeof(TCHAR)); MessageBox(NULL、szBuffer、文本(“错误”)、MB_OK | MB_ICONERROR); 出境手续(1); 我将缓冲区作为全局变量:
TCHAR szBuffer[256]

这是可行的,但我也希望将“Error”文本存储到string表中并加载,当我想显示错误时,问题是需要有两个全局变量来加载字符串,并且在某些地方,我需要一次加载更多


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

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

对性能不利?视情况而定。如果在用户界面中以提示的形式显示这些字符串,我看不出根据需要加载每个字符串会是一个性能问题。不管怎样,操作系统都会进行一些智能缓存,所以并不是每次需要显示的字符串都会在磁盘上运行。另一方面,如果要在紧密循环中使用这些字符串,那么最好将它们预加载到内存中,这样就不必一直调用
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++字符串——当它超出范围时,将自动释放(使用智能指针或任何与现代等价的任何东西)。

不是ISO C标准的一部分,它更像Posix。MinGW接受用GNU C方言编译的它。因为我在示例中使用了
strdup
而被否决?严厉的我甚至对我的用法发表了评论,以防受到批评。哦,好吧。没有人会取悦所有人。
char* errMem = LoadStringFromResource(IDS_ERROR_MEMORY);
char* errText = LoadStringFromResource(IDS_ERROR_TEXT);
MessageBox(NULL, errMem, errText, MB_OK | MB_ICONERROR);
free(errMem);
free(errText);