3个单选框中只能有一个是选中状态,为了记录哪个单选框是选中状态,在类中定义一个成员变量m_nSelect。对3个单选框,分别使m_nSelect值为1、2和3。下面来看主要的代码。
在单击“计算”按钮后,响应该按钮的代码如下:
- void CPeParseDlg::OnBtnCalc()
- {
- // TODO: Add your control notification handler code here
- DWORD dwAddr = 0;
- // 获取的地址
- dwAddr = GetAddr();
- // 地址所在的节
- int nInNum = GetAddrInSecNum(dwAddr);
- // 计算其他地址
- CalcAddr(nInNum, dwAddr);
- }
分别看一下GetAddr()、GetAddrInSecNum()和CalcAddr()的实现。
获取在编辑框中输入的地址内容的代码如下:
- DWORD CPeParseDlg::GetAddr()
- {
- char szAddr[10] = { 0 };
- DWORD dwAddr = 0;
- switch ( m_nSelect )
- {
- case 1:
- {
- GetDlgItemText(IDC_EDIT_VA, szAddr, 10);
- HexStrToInt(szAddr, &dwAddr);
- break;
- }
- case 2:
- {
- GetDlgItemText(IDC_EDIT_RVA, szAddr, 10);
- HexStrToInt(szAddr, &dwAddr);
- break;
- }
- case 3:
- {
- GetDlgItemText(IDC_EDIT_FILEOFFSET, szAddr, 10);
- HexStrToInt(szAddr, &dwAddr);
- break;
- }
- }
- return dwAddr;
- }
获取该地址所属的第几个节的代码如下:
- int CPeParseDlg::GetAddrInSecNum(DWORD dwAddr)
- {
- int nInNum = 0;
- int nSecNum = m_pNtHdr–>FileHeader.NumberOfSections;
- switch ( m_nSelect )
- {
- case 1:
- {
- DWORD dwImageBase = m_pNtHdr–>OptionalHeader.ImageBase;
- for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
- {
- if ( dwAddr >= dwImageBase + m_pSecHdr[nInNum].VirtualAddress
- && dwAddr <= dwImageBase + m_pSecHdr[nInNum].VirtualAddress
- + m_pSecHdr[nInNum].Misc.VirtualSize)
- {
- return nInNum;
- }
- }
- break;
- }
- case 2:
- {
- for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
- {
- if ( dwAddr >= m_pSecHdr[nInNum].VirtualAddress
- && dwAddr <= m_pSecHdr[nInNum].VirtualAddress
- + m_pSecHdr[nInNum].Misc.VirtualSize)
- {
- return nInNum;
- }
- }
- break;
- }
- case 3:
- {
- for ( nInNum = 0; nInNum < nSecNum; nInNum ++ )
- {
- if ( dwAddr >= m_pSecHdr[nInNum].PointerToRawData
- && dwAddr <= m_pSecHdr[nInNum].PointerToRawData
- + m_pSecHdr[nInNum].SizeOfRawData)
- {
- return nInNum;
- }
- }
- break;
- }
- }
- return -1;
- }