0

我目前正在将大量代码从基于 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

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

4

4 回答 4

1

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

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

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

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

以上三个是最可能的原因,特别是如果所有字段都重置为其默认初始化值。

如果这只发生在一个或两个字段上,则结构可能对齐不佳,您可能需要重新排列字段以更正这些(在发布中也检查)。

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

于 2008-10-02T09:54:19.097 回答
0

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

于 2008-10-02T10:51:26.043 回答
0

CCommsProperties 可能在两个不同的位置定义,并且每个文件都包含自己的版本。

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

于 2008-10-02T11:54:18.340 回答
0

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

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

于 2008-10-02T14:14:41.887 回答