4KBytes Bin File Editor
前一段时间code base将常量独立出来统一放到一个4K bytes的二进制文件中,这样就隔离了变化,降低代码护,修改的负担了。以往的做法这些常量都散落在代码之中,一旦有需求变更就要搜索这些变更的部分到处改代码,经常会漏改某一些地方后面测试就会出bugL.新的做法就可以有效的避免上述情况了,通过一个4Kbytes的文件将它们统一起来,一旦有变化重新combine一次就OK。
想法非常好,可是我们很长一段时间都没有收到好用的工具可以直观的方便的编辑这个4Kbyte的二进制文件,于是我就写了这样一个EC4KTool.exe。后续几个月我都用这个tool编辑非常爽!可是后来公司release出了一个正式的工具,我的这个tool就退出历史的舞台了,程序运行如下图1所示:
图 1
为了发挥它的余热我现在将完整的source code放在这里,供需要写二进制编辑工具的朋友参考。EC4KTool.exe其实非常简单,只不过是读写文件而已,代码中比较有趣的部分在于我使用了一个singleton BinFileOps管理文件的读入,分析,保存的动作如下述代码所示:
#pragma once
#include "BinFileDef.h"
class BinFileOps
{
private:
BinFileOps(void);
~BinFileOps(void);
public:
static BinFileOps* get_instance();
void set_4k_filepath(CString& str);
void load_default_4k();
void save_to_4k();
BOOL validate_file();
public:
Ec_Project_Info m_Ver;
Ec_Key m_Key;
Ec_Power m_Pwr;
Ec_Brightness m_Brg;
Ec_Thermal m_Thermal;
Ec_IKB m_Ikb;
Ec_Hotkey_Index m_Hotkey_Tab;
Ec_Batt_Info m_Batt_Info;
Ec_HotKey_Value m_Hot_Val;
private:
CString m_File_Path;
public:
PCHAR WideStr_To_MultiStr (PWCHAR WideStr);
};
另一个有趣的地方就是broadcast,因为每张table都对应一个dialog,所以该程序会有很多的dialog。在读入文件完成,或者需要写入文件时我都会广播通知所有的dialog告知数据已经读入而且分析完成,请更新显示;或者要将修改的数据写入二进制文件了,请将dialog中的数据都摘下来。代码如下所示:
void CMyTabCtrl::broadcast_read_4k()
{
for(int nCount=0; nCount < m_nNumberOfPages; nCount++)
{
::PostMessage(m_tabPages[nCount]->m_hWnd,WM_READ_4K,NULL,NULL);
}
}
void CMyTabCtrl::broadcast_write_4k()
{
for(int nCount=0; nCount < m_nNumberOfPages; nCount++)
{
::SendMessage(m_tabPages[nCount]->m_hWnd,WM_WRITE_4K,NULL,NULL);
}
}
每个dialog收到broadcast message以后都会做更新显示或者摘出数据的动作如下述代码所示:
LRESULT CBrightnessDlg::OnRead4k(WPARAM wParam, LPARAM lParam)
{
BinFileOps* ptr_bin = BinFileOps::get_instance();
for(int row = 1; row < m_Grid.GetRowCount(); row++)
for(int col = 1; col < m_Grid.GetColumnCount(); col++)
{
GV_ITEM item;
item.mask = GVIF_TEXT|GVIF_FORMAT;
item.row = row;
item.col = col;
item.nFormat == DT_CENTER|DT_WORDBREAK;
char vtmp = *((char*)(&ptr_bin->m_Brg)+(row-1));
item.strText.Format(_T("%.2x"),vtmp);
m_Grid.SetItem(&item);
}
m_Grid.Invalidate();
return 1;
}
LRESULT CBrightnessDlg::OnWrite4k(WPARAM wParam, LPARAM lParam)
{
BinFileOps* ptr_bin = BinFileOps::get_instance();
for(int row = 1; row < m_Grid.GetRowCount(); row++)
for(int col = 1; col < m_Grid.GetColumnCount(); col++)
{
CString str = m_Grid.GetItemText(row,col);
PCHAR tmp = ptr_bin->WideStr_To_MultiStr(str.GetBuffer());
int ndata;
sscanf(tmp,"%x",&ndata);
*((unsigned char*)(&ptr_bin->m_Brg)+(row-1)) = ndata;
}
return 1;
}
另外有没有发现EC4KTool.exe 界面部分风格有点像vista(半透明,淡蓝色)J。如果对你有所帮助,要谢谢我哦J!
That’s all!
Peter