XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog

VC6 MFC DLL类成员float 变量赋值后,类的子类成员变量数据被变更 0xa4, 0xcd

子类有一个 bool 成员变量

在dll接口中给float赋值后0.1f, 0.99f,子类成员变量 bool值 有规率的 从0XCD 变成 0xa4

后来将类型改成double后,问题消失,后来想重现问题未能实现

事后怀疑数据被串改,只能回想内存布局

bool 初始值false,内存如下:

1408daa0 00 cd cd cd 5a 56 40 00 2a 3f

赋值 对应16进制 float: 

0.1F0x3DCCCCCD ,

0.99F = 0x3F7D70A4

0482D63C  A4 70 7D 3F 5A 56 40 00 2A 3F, 版权:不及格的程序员

看16进制形式,数据应该是被覆盖了,但是数据位如何串的原因找不到了,结论就是C++的内存好危险。

不过以后遇到此类问题可以留意了,记录内存变化图谱追踪问题,这里就不重现了浪费时间。

2023-04-10更新:

原因好像是找到了, 自定义MFC消息映射原型写的不对,出错的函数我没有声明两个附加参数

之所以发现这个是因为在一个Realse项目中调用回调时闪退了(调试项目的debug与release均未发现问题,此问题很隐辟,由其是在消息循环中崩溃,难以找到源头),通过缩减代码,停用代码最终定位进度条回调刷新消息有重大嫌疑,找来找去应该是这里有问题,改成对应函数声明格式,闪退问题消失。

闪退是在消息循环内部抛出的。。。 找了4天时间 

 

 

// User extensions for message map entries

// for Windows messages
#define ON_MESSAGE(message, memberFxn) \
    { message, 0, 0, 0, AfxSig_lwl, \
        (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },

LRESULT BaseWorkThread::onFinishPercent(WPARAM wParam, LPARAM lParam)
{
    //可以像委托那样, 再声明一个指针也可以继承此类,调用针指将百分比传递出去
    //本例并没有提供函数指针,可以采用多重继承然后调用子类成员函数传递百分比。
    onPercent(this->mPercent);
    return 0;
}

BEGIN_MESSAGE_MAP(BaseWorkThread, CWnd)
    //{{AFX_MSG_MAP(BaseWorkThread)
        // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_ONTHREADFINISHED, workder_onFinished)
    ON_MESSAGE(WM_ONWorkFinishPercent, onFinishPercent)
END_MESSAGE_MAP()

 

 
posted on 2023-03-17 13:51  不及格的程序员-八神  阅读(43)  评论(0编辑  收藏  举报