【问题标题】:MFC data exchange validationMFC 数据交换验证
【发布时间】:2011-11-22 16:08:08
【问题描述】:

我们正在使用 MFC 数据交换来验证一些数据,但我们遇到了一些问题。我们使用 DDV_MinMaxFloat 调用来确保应用程序各个部分中的编辑框包含指定范围内的浮点数。使用此验证时,如果输入的值超出范围,则会自动向用户显示一个对话框,指示该值必须位于指定的范围内。这在调试中运行应用程序时一直正常工作,但是在构建版本时我们遇到了问题。验证仍然在发布模式下执行,但是向用户显示的消息框是空白的。

我尝试了通常的强制重建、删除旧资源文件和删除预编译头文件,但这在发布模式下继续发生。有没有人遇到过这个?有什么明显的东西需要寻找吗?

我还应该补充一点,这个应用程序已经有 10 多年的历史了,所以显然之前一直在正常工作。不知何故,过去几周出现了问题。

【问题讨论】:

  • 这听起来不像是验证问题,听起来像是您的消息框有问题。你能从程序的其他(非验证)部分显示消息框吗?你能给我们一些消息框的代码吗?顺便说一句,请参阅有关签名的常见问题解答:stackoverflow.com/faq#signatures
  • 我同意验证是正确的。但是消息框是由框架自动生成的,所以我无法控制消息框(感谢关于签名的提示)
  • 啊,我明白了。谢天谢地,我很长一段时间没有使用 MFC 进行编程,但我有根据的猜测是该对话框取决于可本地化的资源字符串(“值必须在 %f 和 %f 之间”),而您的发布版本没有得到那个将其链接起来。除了按照@DocBrown 的建议进行恢复之外,您还可以收集更多数据点。 (例如:这是只发生在 MinMaxFloat 上,还是发生在所有 DDV 处理程序上?)

标签: c++ mfc


【解决方案1】:

这些消息将来自 MFC 的资源字符串。可能与您自己的资源有一些冲突。检查以确保您的资源符合 Microsoft 的指导方针TN020: ID Naming and Numbering Conventions

特别注意这一点:

MFC 的内部框架实现保留了两个范围:0x7000 到 0x7FFF 和 0xE000 到 0xEFFF。

【讨论】:

  • 我认为这是一个很好的建议,可能会引导我们找到答案,但最初看起来我们的任何资源似乎都没有冲突
【解决方案2】:

在过去的几周内不知何故出现了问题。

由于您的应用程序在几周前运行良好,这应该很容易:从您的修订控制系统中检查最后一个工作版本,并将其与当前版本进行比较。或者尝试将其缩小到不再起作用的第一个修订版。

【讨论】:

  • 这正是我会做的。
【解决方案3】:

使用 Spy++ 检查显示的消息框上是否有控件,并且它们上的文本是否为空白,或者它们上是否根本没有控件。如果文本为空,则必须检查资源或消息框的调用/创建方式。否则,它可能类似于资源设置不正确,并且消息假设它可以从 ::AfxGetResourceHandle() 读取其资源字符串。请注意,这是一个非常容易犯的错误 - 它是一个全局句柄,可以在任何地方更改(包括在您无法控制的 dll 中),因此乍一看似乎无关的代码远程部分的更改可能会触发它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 2011-12-01
    • 2019-03-16
    • 2013-04-28
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多