我目前正在将基于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和Application之间的一层。
在原始MFC版本上,对RTS-CTS的握手设置会粘住,但在作为DLL版本运行时,只要输入该功能,它就会自动重置为0。代码完全包含在代码的DLL部分中,因此没有边界。
原始模块和新模块之间的主要区别在于调用各种对话框的变量已被删除,并且删除了#include
我已经失去了一个下午,我真的不想再失去......
答案 0 :(得分:1)
单独给定代码很难看出有什么问题。一些通用指针:
对象在具有不兼容链接的不同二进制模块中初始化和处理(例如C运行时间)
如果共享类/结构,则不会正确导出/导入。
课程在多个地方定义,而且您没有包含正确的定义。
以上三种是最可能的原因,特别是如果所有字段都重置为默认的初始值。
如果仅在一个或两个字段中发生这种情况,则结构可能会很难对齐,您可能需要重新排列字段以更正这些字段(请在发行版中检查)。
一般来说,我很想假设您已经初始化的对象不是RefreshCommProperties()
看到的对象,出于某种原因,可能是上述三个中的一个。
答案 1 :(得分:0)
要真正弄清楚发生了什么,您可能需要发布源代码 - 或者至少要复制问题。不幸的是,StackOverflow似乎并不鼓励这样做。您可以在FTP站点上发布代码或转到允许发布源代码的站点(如CodeGuru)。
答案 2 :(得分:0)
CCommsProperties可能在两个不同的地方定义,每个文件都包含自己的版本。
要测试这个理论,在调试器中你需要查看& props.handshake。如果调试器告诉您字段在函数内部和外部具有不同的地址,则假设为真,您可以继续检查预处理器输出以找出它发生的原因。
答案 3 :(得分:0)
在Saratv发布之后,我决定抛弃我所做的事情并再次从工作源重新开始。
但这次它有效......我想我永远不会知道为什么通过一个结构导致它改变。