引用的结构不"粘"
我目前正将大量代码从基于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运行时间)在不同的二进制模块中初始化和处理对象
- 如果共享该类/结构,则不会正确导出/导入该类/结构。
- 这些类在多个地方定义,我们没有包括正确的定义。
以上三个是最可能的原因,尤其是如果将所有字段都重置为其默认的初始化值时。
如果仅在一个或者两个字段中发生这种情况,则结构可能排列不正确,我们可能需要重新排列字段以更正这些字段(也请检查发布中的内容)。
总的来说,由于某些原因,我倾向于假设我们已初始化的对象不是" RefreshCommProperties()"所看到的对象,可能是上述三个对象之一。
要真正弄清楚发生了什么,我们可能需要发布源代码-或者至少复制源代码,以复制问题。不幸的是,StackOverflow似乎并不鼓励这样做。我们可以将代码发布在FTP站点上,也可以转到允许发布源代码的站点(例如CodeGuru)。
CCommsProperties可能在两个不同的位置定义,并且每个文件都包含其自己的版本。
为了测试这一理论,在调试器中,我们需要查看&props.handshake。如果调试器告诉我们该字段在函数内部和外部具有不同的地址,则该假设成立,我们可以继续检查预处理器输出以查明发生这种情况的原因。
在Saratv发布之后,我决定放弃我所做的事情,然后再次从工作源中重新启动它。
但是这一次它起作用了...我想我永远也不会知道为什么通过结构会导致它发生变化。