16,472
社区成员
发帖
与我相关
我的任务
分享
void CListTextView::OnLoadloc()
{
// TODO: 在此添加命令处理程序代码
GetListCtrl().SetRedraw(FALSE);
GetListCtrl().DeleteAllItems();
GetListCtrl().SetRedraw(TRUE);
int n = GetListCtrl().GetHeaderCtrl()->GetItemCount();
for (int i = 0;i < n;i++)
{
GetListCtrl().GetHeaderCtrl()->DeleteItem(0);
} //清空
GetListCtrl().InsertColumn(0,_T("文件序号"),0,80);
GetListCtrl().InsertColumn(1,_T("文件内容长度(字符数UNICODE)"),0,80);
GetListCtrl().InsertColumn(2,_T("相对内容表的偏移"),0,80);
GetListCtrl().InsertColumn(3,_T("文件名"),LVCFMT_CENTER,800);
CString szFilters = _T("Pak Files (*.loc)|*.loc|All Files (*.*)|*.*||");
CFileDialog fileDlg(TRUE, _T("loc"), _T("pack"),OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);
if(fileDlg.DoModal() == IDOK)
{
CString pathName = fileDlg.GetPathName();
if (pathName.Find(_T("pack.loc")) == -1)
{
MessageBox(_T("请找到pack.loc文件"),_T("提示"));
return;
}
HANDLE hFile,hFileMap;
BYTE* pFile;
hFile = CreateFile(pathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
pFile = (BYTE*)MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
if (!pFile)
{
MessageBox(_T("CreateFileMapping Fail!"),_T("Error2"),MB_OK);
CloseHandle(hFileMap);
CloseHandle(hFile);
return;
}
BYTE* pBeign = pFile;
DWORD dwoffsetTab2 = *(DWORD*)(pFile + 0x4);
BYTE* pSecTab = pFile + 0x8 + dwoffsetTab2;
pSecTab += 0x8; //第2张表
DWORD dwIndexCount = *(DWORD*)(pFile + 0xC); //索引总个数
pFile += 0x10; //来到第1个索引
GetListCtrl().ShowWindow(SW_HIDE);
for (int i = 0;i < dwIndexCount;i++)
{
DWORD dwOffset = *(DWORD*)pFile;
DWORD dwFileNameLen = *(DWORD*)(pFile + 0x4);
DWORD dwnIndex = *(DWORD*)(pFile + 0x8);
CString szIndex;
szIndex.Format(_T("0x%X"),dwnIndex);
TCHAR bufFileName[0x200] = {0};
char bufFileNameA[0x200] = {0};
memcpy_s(bufFileNameA,0x200,(void*)(pFile + dwOffset),dwFileNameLen);
MultiByteToWideChar(CP_UTF8,0,bufFileNameA,dwFileNameLen,bufFileName,dwFileNameLen);
DWORD dwTab2_0 = *(DWORD*)pSecTab;
DWORD dwTab2_1 = *(DWORD*)(pSecTab + 0x4);
CString szTab0,szTab1;
szTab0.Format(_T("0x%X"),dwTab2_0);
szTab1.Format(_T("0x%X"),dwTab2_1);
int j = GetListCtrl().InsertItem(GetListCtrl().GetItemCount(),_T(""));
GetListCtrl().SetItemText(j,0,szIndex);
GetListCtrl().SetItemText(j,1,szTab0);
GetListCtrl().SetItemText(j,2,szTab1);
GetListCtrl().SetItemText(j,3,bufFileName);
pFile += 0xC;
pSecTab += 0x8;
}
UnmapViewOfFile(pBeign);
CloseHandle(hFileMap);
CloseHandle(hFile);
GetListCtrl().SetHotItem(0);
GetListCtrl().ShowWindow(SW_SHOW);
// Implement opening and reading file in here.
//Change the window's title to the opened file's title.
}
}