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

2024-06-28

好吧,我最近决定将应用程序中的每个字符串放入 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];

这是可行的,但是,id还喜欢将“错误”文本存储到字符串表中并加载,当我想显示错误时,问题是这需要我有2个全局变量来加载字符串,并且有一些地方我需要一次加载更多的内容。

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ win32 从资源加载字符串 的相关文章

随机推荐

  • Firefox 选择元素将文本缩进值加倍

    今天我发现了一个奇怪的问题 似乎是 Firefox 35 0 中的一个错误 当指定一个text indent财产为select元素 Firefox 似乎将像素值加倍 其他浏览器正确显示缩进 有没有解决方法可以避免这种情况 我被迫使用text
  • 为什么C++编译器在这个简单的程序中不给予优先权(赋值下的递增运算符)?

    根据C C 语言中运算符的优先级表 参见维基百科 自增运算符 优先于赋值运算符 有人可以解释一下为什么编译器首先在这个简单的程序中赋值 bill x 中的 1 然后增加索引值 i 我觉得应该是相反的 先增加再赋值 include
  • AVCaptureSession VS UIImagePickerController 相机预览

    我正在开发一个类似于 Instagram iOS 应用程序的应用程序 Instagram 有一个自定义相机预览 我想开发类似的东西 问题是 为了这个目的更好地使用什么 UIImagePickerController 与自定义cameraOv
  • 更新选择列表中的现有选项

    假设我有一个包含 3 个选项的选择列表
  • @JsonSerialize 和 JsonSerializer 的用法

    Problem 我有一个 Spring MVC 应用程序 需要我将某个实体列表的 id 和名称转换为具有特定格式的 JSON 对象数组 并根据某个请求输出该数组 也就是说 我需要一个如下所示的 JSON 对象数组 label Subject
  • PHP在页面上重复图像[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我制作了一个 php 程序来在方框中重复页面上的图像 该图像连续重复 100 次 然后垂直重复 100 次 这意味着该方框中总共重复了 100x
  • 如何使用 for 循环分配按钮

    你能帮助我吗 我仍在尝试了解如何分配listType到一个按钮 有8个按钮 其中每一个都将被分配给一个特定的按钮 我不知道如何做到这一点 https jsfiddle net 82gv4nhm https jsfiddle net 82gv
  • “发射后不管” python async/await

    有时需要发生一些非关键的异步操作 但我不想等待它完成 在 Tornado 的协程实现中 您可以通过简单地省略来 触发并忘记 异步函数yield关键词 我一直在试图弄清楚如何用新的方式 发射后忘记 async awaitPython 3 5
  • 未实现接口成员“IComparable.CompareTo(Object)”

    我有一个 android 的 aar 文件 我正在尝试在我的 xamarin android 应用程序中使用它 我按照链接中给出的步骤进行操作https developer xamarin com guides android advanc
  • 将不正确的变量类型传递给函数不会发出类型错误

    你能解释一下为什么当我将不正确的变量类型传递给函数 ts 时不会发出类型错误吗 export class CreateCategoryDto implements Omit
  • R 中二维核密度估计的混乱

    核密度估计器用于估计特定的概率密度函数 参见mvstat net http www mvstat net tduong research seminars seminar 2001 05 and scikit learn 文档 http s
  • Python postgreSQL sqlalchemy 查询 DATERANGE 列

    我有一个预订系统 并将预订日期范围保存在 日期范围 列中 booked date Column DATERANGE nullable False 我已经知道我可以通过以下方式访问实际日期booked date lower or booked
  • 允许结构字段溢出到下一个字段

    考虑以下简单示例 struct attribute packed int code 1 int place holder 100 s void test int n int i for i 0 i lt n i s code i 1 for
  • 无法访问通过 jQuery ajax 发送的我的 Post 值

    EDIT 用 htaccess 删除 index php 会创建我刚刚发现的这个问题 现在我要着手解决它 EDIT 问题解决了 JavaScript 是错误的 url login 它需要一个尾部斜杠 ORIGINAL 在我的主页视图中 我创
  • Qt:如何制作二维插值颜色字段?

    我是 C 的初学者 尤其是与图形相关的 我想为我的图形视图制作一个动画背景 如下所示 梯度场气流 http www engineering leeds ac uk cfd research images untitled JPG 该图片表现
  • 在 Ruby 中生成正则表达式模式的字符串

    在Python语言中我发现rstr https bitbucket org leapfrogdevelopment rstr 可以生成一个字符串regex http en wikipedia org wiki Regular express
  • 如何解决转移/减少冲突?

    我正在使用 CUP 创建论文所需的解析器 我的语法中存在移位 归约冲突 我有这个生产规则 command IDENTIFIER IDENTIFIER LPAREN parlist RPAREN 我有这个警告 Warning Shift Re
  • 具有最大高度的 div 内的表格

    我想要一个可滚动的表格 为了实现这一点 我包装了一个 table into a div with a max height and overflow auto 除此之外 div has display inline block以确保 div
  • 在接收器上获取 Chromecast 发送器 URL

    Chromecast 接收者是否可以确定特定发送者的 URL 我可以获得发件人列表 const context cast framework CastReceiverContext getInstance context getSender
  • C++ win32 从资源加载字符串

    好吧 我最近决定将应用程序中的每个字符串放入 STRINGTABLE 中 这样我就可以轻松翻译成不同的语言 我知道如何使用 LoadString api 但这涉及我为要加载的每个字符串使用不同的变量 如果我的应用程序有 100 个字符串 那