谁能帮忙把这个函数(c)转成delphi的?

xmichen 2004-02-24 06:10:38
static INT32 loadlist(HWND hwndDlg,UINT8 *z)
{
UINT32 s,i,j,y;
UINT8 tmp[MAX_PATH];
UINT8 *fn,*buf;
UINT32 k,h,srclen;
UINT16 TempU[8][MAX_PATH];
UINT8 Temp[8][MAX_PATH];
UINT32 xx=0;

FILE *fp=fopen(grfname,"rb");
if(fp==NULL){
wsprintf(tmp,wowResStr(STR_NOFINDFILE),grfname);
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)tmp);
return 0;
}
fseek(fp,0,2);
s=ftell(fp);
fseek(fp,0,0);
fread(tmp,1,0x2e,fp);
if(!strstr(tmp,"Master of Magic") || fseek(fp,*(UINT32*)(tmp+0x1e),1)){
wsprintf(tmp,wowResStr(STR_NOGRF),grfname);
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)tmp);
return 0;
}
// _chk_("Master of Magic")
if(*(unsigned long*)(tmp+16)==0x04030201)
newgrf=0;
else
newgrf=1;
s-=ftell(fp);
buf=malloc(s);

grf_filelist_size=s;
grf_off=ftell(fp);
grf_filelist=malloc(s);

if(buf==NULL){
wsprintf(tmp,wowResStr(STR_MEM),"grf_filelist");
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)tmp);
return 0;
}
// _chk_("grf_filelist")
fread(buf,1,s,fp);
memcpy(grf_header,tmp,0x2e);
memcpy(grf_filelist,buf,s);
fclose(fp);
memset(filelist_hash,-1,MAX_PATH);
if(newgrf==1){
INT8 *newindex;
UINT32 newindexsize=*(unsigned long*)(buf+4);
s=*(unsigned long*)buf;
buf+=8;
// _chk_("newgrf")
newindex=malloc(newindexsize);
uncompress(newindex,&newindexsize,buf,s);
filelist=malloc(32768*sizeof(filelist[0]));
s=0;
num=0;
while(newindexsize>0){
UINT8 aaa=0;
while(*newindex!=0) {
filelist[s].fn[aaa]=*newindex;
newindex++;
newindexsize--;
aaa++;
}
// _chk_(filelist[s].fn)
newindex++;
newindexsize--;
filelist[s].srclen=*(UINT32*)newindex;
filelist[s].srclen_aligned=*(UINT32*)(newindex+4);
filelist[s].declen=*(UINT32*)(newindex+8);
filelist[s].srcpos=*(UINT32*)(newindex+13)+0x2e;
filelist[s].cycle=0;//period(filelist[s].fn,srclen);
filelist[s].type=*(newindex+12);
newindex+=17;
newindexsize-=17;
filelist[s].next=filelist_hash[h=filehash(filelist[s].fn)];
filelist_hash[h]=s;
num++;
s++;
}
}
else {
bnum=num;
for(j=0,num=0;j<s;j+=21+*(UINT32*)(buf+j))
if(buf[j+*(UINT32*)(buf+j)+16]) num++;
filelist=malloc((num+1024)*sizeof(filelist[0]));
if(filelist==NULL){
wsprintf(tmp,wowResStr(STR_MEM),"filelist");
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)tmp);
return 0;
}
for(i=0,j=0;i<num;i++,j+=21+*(UINT32*)(buf+j)){
grf_filelist_off[i]=j;
k=j+*(UINT32*)(buf+j)+4;
if(buf[k+12]==0){
i--;
continue;
}
fn=decode_filename(buf+j+6,buf[j]-6);
if(strlen(fn)>=sizeof(filelist[i].fn)-1)
break;
srclen=*(UINT32*)(buf+k)-*(UINT32*)(buf+k+8)-715;

filelist[i].srclen=srclen;
filelist[i].srclen_aligned=*(UINT32*)(buf+k+4)-37579;
filelist[i].declen=*(UINT32*)(buf+k+8);
filelist[i].srcpos=*(UINT32*)(buf+k+13)+0x2e;
filelist[i].cycle=period(fn,srclen);
filelist[i].type=buf[k+12];
strcpy(filelist[i].fn,fn);
filelist[i].next=filelist_hash[h=filehash(fn)];
filelist_hash[h]=i;
}
free(buf);
}
if (GetVersion() < 0x80000000) {
memset(&LvItemW,0,sizeof(LvItemW));
LvItemW.mask=LVIF_TEXT;
LvItemW.cchTextMax = MAX_PATH;
} else {
memset(&LvItem,0,sizeof(LvItem));
LvItem.mask=LVIF_TEXT;
LvItem.cchTextMax = MAX_PATH;
}
for ( i=0 ; i<num ; i++ ) {
if ( i % 256 == 0 ) {
if (GetVersion() < 0x80000000) {
wsprintfW(TempU[0],L"%ld/%ld",i+1,num);
SendDlgItemMessageW(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)TempU[0]);
} else {
wsprintf(Temp[0],"%ld/%ld",i+1,num);
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)Temp[0]);
}
}
if (strstr(filelist[i].fn,z)||z[0]=='*') {
if (GetVersion() < 0x80000000) {
wsprintfW(TempU[0],L"%ld",i);
wsprintfW(TempU[1],L"%ld",filelist[i].srclen);
wsprintfW(TempU[2],L"%ld",filelist[i].srclen_aligned);
wsprintfW(TempU[3],L"%ld",filelist[i].declen);
wsprintfW(TempU[4],L"%ld",filelist[i].srcpos);
wsprintfW(TempU[5],L"%d",filelist[i].cycle);
wsprintfW(TempU[6],L"%d",filelist[i].type);
MultiByteToWideChar(949,0,filelist[i].fn,108,TempU[7],108);
LvItemW.iItem=xx;
LvItemW.iSubItem=0;
LvItemW.pszText=TempU[0];
} else {
wsprintf(Temp[0],"%ld",i);
wsprintf(Temp[1],"%ld",filelist[i].srclen);
wsprintf(Temp[2],"%ld",filelist[i].srclen_aligned);
wsprintf(Temp[3],"%ld",filelist[i].declen);
wsprintf(Temp[4],"%ld",filelist[i].srcpos);
wsprintf(Temp[5],"%d",filelist[i].cycle);
wsprintf(Temp[6],"%d",filelist[i].type);
wsprintf(Temp[7],"%s",filelist[i].fn);
LvItem.iItem=xx;
LvItem.iSubItem=0;
LvItem.pszText=Temp[0];
}
if (GetVersion() < 0x80000000) {
if ( xx < bnum )
SendDlgItemMessageW(hwndDlg,IDC_LISTVIEW,LVM_SETITEMW,0,(LPARAM)&LvItemW);
else
SendDlgItemMessageW(hwndDlg,IDC_LISTVIEW,LVM_INSERTITEMW,0,(LPARAM)&LvItemW);
} else {
if ( xx < bnum )
SendDlgItemMessage(hwndDlg,IDC_LISTVIEW,LVM_SETITEM,0,(LPARAM)&LvItem);
else
SendDlgItemMessage(hwndDlg,IDC_LISTVIEW,LVM_INSERTITEM,0,(LPARAM)&LvItem);
}
for ( y=1 ; y < 8 ; y++ ) {
if (GetVersion() < 0x80000000) {
LvItemW.iSubItem=y;
LvItemW.pszText=TempU[y];
SendDlgItemMessageW(hwndDlg,IDC_LISTVIEW,LVM_SETITEMW,0,(LPARAM)&LvItemW);
} else {
LvItem.iSubItem=y;
LvItem.pszText=Temp[y];
SendDlgItemMessage(hwndDlg,IDC_LISTVIEW,LVM_SETITEM,0,(LPARAM)&LvItem);
}
}
xx++;
}
if ( GetAsyncKeyState(VK_ESCAPE)==-32767 )
break;
UpdateWindow(hwndDlg);
}
num=xx;
for ( i=num ; i<bnum ; i++ ) {
SendDlgItemMessage(hwndDlg,IDC_LISTVIEW,LVM_DELETEITEM,num,0);
if ( i % 256 == 0 ) {
if (GetVersion() < 0x80000000) {
wsprintfW(TempU[0],L"%ld/%ld",num+1,bnum-i+num);
SendDlgItemMessageW(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)TempU[0]);
} else {
wsprintf(Temp[0],"%ld/%ld",num+1,bnum-i+num);
SendDlgItemMessage(hwndDlg, IDC_LIST, WM_SETTEXT, 0,(LPARAM)Temp[0]);
}
}
if ( GetAsyncKeyState(VK_ESCAPE)==-32767 )
break;
UpdateWindow(hwndDlg);
}
SendDlgItemMessage(hwndDlg,IDC_LIST,WM_SETTEXT,0,(LPARAM)wowResStr(STR_LIST));
return 0;
}
...全文
34 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧