企业备案网站名称要求,临沂网站建设培训,建行网上银行,创新优典网站建设在不调试的情况下解决下面的问题#xff0c;说明你的思维调试能力又进阶了。
问题
我在调用 FormatMessage 函数加载一个插入的资源字符串#xff0c;由于某种未知的原因#xff0c;它没能按预期那样工作。 我要加载的字符串类似于这样的 “Blah blah blah %1. Blah blah …在不调试的情况下解决下面的问题说明你的思维调试能力又进阶了。
问题
我在调用 FormatMessage 函数加载一个插入的资源字符串由于某种未知的原因它没能按预期那样工作。 我要加载的字符串类似于这样的 “Blah blah blah %1. Blah blah blah.” FormatMessage 调用失败了通过 GetLastError我得到了具体的错误代码 ERROR_RESOURCE_TYPE_NOT_FOUND 代码如下 请移步至 www.topomel.com 以查看图片
给你第一个提示请特别注意上面代码中的 IDS_MY_CUSTOM_MESSAGE 参数。 第二个提示”IDS_” 这个标识你会想到什么
以 “IDS_” 开头的资源一般都是字符串资源而不是消息资源标识。关于消息资源标识符的命名约定没有达成强烈的共识尽管我曾经见过 “MSG_” 这样的资源标识前缀部分原因是几乎没有人使用消息资源!
我不明白为什么将它们添加到 Win32 中因为已经有一种在资源中嵌入字符串的方法即字符串资源。
这就是你得到 ERROR_RESOURCE_TYPE_NOT_FOUND 的原因。模块中没有消息资源。如果不打算使用消息资源则必须使用 FORMAT_MESSAGE_FROM_STRING 标志并显式传递格式字符串。 请移步至 www.topomel.com 以查看图片
我还对最终参数进行了轻微更改。使用 FORMAT_MESSAGE_ARGUMENT_ARRAY 时最后一个参数必须是 DWORD_PTRs 数组。必须将参数强制转换为 va_list* 才能使编译器满意。)
碰巧原始代码避开了这个错误因为 sizeofDWORD_PTR sizeofLPTSTR 并且它们都具有相同的对齐要求。 另一方面如果插入是 DWORD则传递 va_list*dwValue 肯定是错误的如果您运气不好可能会崩溃。多测试几次就知道了)
总结
有很多技术你可能一辈子都不会用到但它确实在那里。 一小块一小块的将它们搞懂。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一里面有很多关于Windows的小知识对于广大Windows平台开发者来说确实十分有帮助。 本文来自《Psychic debugging: Why does FormatMessage say the resource couldn’t be found?》