Archive

Posts Tagged ‘MFC’

由定义消息引起的Debug版正常而Release版异常的问题及解决方案

September 1st, 2006 No comments

在使用了自定义消息的程序中,有可能出现Debug版正常而Release版非法操作的问题。

下面是一种原因以及其解决办法:

问题的描述:
================

定了了自定义消息: #define WM_DEMOWORK WM_USER+1
消息相应函数: afx_msg void OnDemoWork();
消息映射: ON_MESSAGE(WM_DEMOWORK,OnDemoWork)

上述代码编译没有任何错误,并且在Debug版中运行正常,但是在Release版中会报非法
操作。

原因:
================
在MFC中,ON_MESSAGE宏的定义如下:
#define ON_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_lwl,
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM,
LPARAM))&memberFxn },

可见,在ON_MESSAGE宏中认为消息相应函数memberFxn的原型为 LRESULT
(*pProc)(WPARAM, LPARAM)的形式,它有两个参数,
分别为WPARAM, LPARAM。

解决方案
===============
了解具体的原因后,解决就非常容易。有两个方案:

方案1:
修改消息相应函数的定义,增加函数参数。如:
afx_msg void OnDemoWork(WPARAM wParam, LPARAM lParam);

方案2:
如果消息相应函数中不需要消息参数,可以利用另外一个消息映射宏ON_MESSAGE_VOID
即可。如
ON_MESSAGE_VOID(WM_DEMOWORK,OnDemoWork)

其中ON_MESSAGE_VOID的宏定义为:
#define ON_MESSAGE_VOID(message, memberFxn) { message, 0, 0, 0, AfxSig_vv,
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },

其中消息相应函数原型为void (*pProc)(void)。
;

Categories: 技术讨论 Tags: ,

用VC纯资源dll解决国际化问题

August 22nd, 2006 No comments

由于MFC应用程序也有自己的资源文件,当你调用MFC函数比如 CString::LoadString
或其它 LoadIcon 时,MFC应用程序框架首先跟踪搜索EXE文件的资源,然后才是DLL和
MFC的资源,因此在使用纯资源DLL时候,必须人为先改变资源的搜索顺序,可以通过使
用 AfxSetResourceHandle 函数来实现,具体实现如下:

BOOL CMultilanguageApp::InitInstance()
{
AfxEnableControlContainer();

if (m_bChinese)
{
m_hLangDLL=::LoadLibrary(“chinese.dll”);
}
else
{
m_hLangDLL=::LoadLibrary(“english.dll”);
}

AfxSetResourceHandle(m_hLangDLL);

……
}

Categories: 技术讨论 Tags: ,