【问题标题】:Referenced structure not 'sticking' [closed]引用的结构不“粘”[关闭]
【发布时间】:2008-10-02 09:24:13
【问题描述】:

我目前正在将大量代码从基于 MFC 的应用程序移植到 DLL 以用于客户品牌推广。

我遇到了一个不寻常的问题。这段代码在两个系统中都是一样的:

// ...
    CCommsProperties props;

    pController->GetProperties( props );
    if (props.handshake != HANDSHAKE_RTS_CTS) 
    {
        props.handshake = HANDSHAKE_RTS_CTS;
        pController->RefreshCommProperties( props );
    }

// ... in another file: 
void CControllerSI::RefreshCommProperties ( const CCommsProperties& props )
{
    // ... code ...
}

CommProperties 是 comm 设置、序列化等的包装器,pController 是 ControllerSI 类型,它本身是实际 Comms 和应用程序之间的一个层。

在原始 MFC 版本上,与 RTS-CTS 握手的设置保持不变,但是当作为 DLL 版本运行时,它会在输入函数后立即将自身重置为 0。代码完全包含在代码的 DLL 部分中,因此没有界限。

原始模块和新模块之间的主要区别在于调用各种对话框的变量已被删除,并且被删除的#includes

我已经为此损失了一个下午,我真的不想再输了......

【问题讨论】:

  • 为什么这个问题被关闭为“离题”??
  • 我最初已经关闭,但我不记得将其关闭为题外话。也许是在他们细化结束代码之前,所有以前结束的问题都设置为默认的“离题”。

标签: c++ mfc


【解决方案1】:

仅从给定的代码很难看出哪里出了问题。一些通用指针:

  1. 对象在不同的​​二进制模块中初始化和处理,链接不兼容(例如C-run times)

  2. 如果类/结构是共享的,则无法正确导出/导入。

  3. 类在多个地方定义,而您没有包含正确的定义。

以上三个是最可能的原因,尤其是在所有字段都重置为其默认初始化值的情况下。

如果这种情况只发生在一两个字段中,则结构可能对齐不佳,您可能需要重新排列字段以更正这些问题(也请在版本中检查)。

一般来说,我很想假设您已初始化的对象不是RefreshCommProperties() 看到的那个,出于某种原因,它可能是上述三个之一。

【讨论】:

    【解决方案2】:

    要真正弄清楚发生了什么,您可能需要发布您的源代码——或者至少要尽可能多地复制问题。不幸的是,StackOverflow 似乎并不鼓励这样做。您可以将代码发布到 FTP 站点或访问允许发布源代码的站点(例如 CodeGuru)。

    【讨论】:

    • UserVoice 上有一个附件项目,但被拒绝。
    【解决方案3】:

    CCommsProperties 可能在两个不同的地方定义,每个文件都包含自己的版本。

    要测试这个理论,你需要在调试器中查看 &props.handshake 。如果调试器告诉您该字段在函数内部和外部具有不同的地址,那么假设是正确的,您可以继续检查预处理器输出以找出它发生的原因。

    【讨论】:

      【解决方案4】:

      在 Saratv 发布之后,我决定放弃我所做的并再次从工作源重新启动它。

      但这一次它起作用了......我想我永远不会知道为什么传递一个结构会导致它发生变化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多