WM_LBUTTONDOWN:
Begin
sPoint.x:=lParam AND $FFFF;
sPoint.y:=lParam SHR 16;
//这里就不能用Hi和Lo了
If PtInRect(sRect,sPoint) Then
Begin
PostMessage(hDlg,WM_NCLBUTTONDOWN,2,0);
End;
End;
WM_DRAWITEM:
Begin
ItemDraw(PDrawItemStruct(lParam));
Result:=0;
End;
Procedure ItemDraw(lpDIS:PDrawItemStruct);
Var
Str:String;
Begin
FillRect(lpDIS^.hDC,lpDIS^.rcItem,h_Brush);
SetTextColor(lpDIS^.hDC,$A0A0A0);
SetBkMode(lpDIS^.hDC,TRANSPARENT);
DrawEdge(lpDIS^.hDC,lpDIS^.rcItem,BDR_RAISEDOUTER,BF_RECT);
GetWindowText(lpDIS^.hwndItem,PChar(Str),10);
DrawText(lpDIS^.hDC,PChar(Str),-1,lpDIS^.rcItem,DT_SINGLELINE OR DT_VCENTER OR DT_CENTER);
If lpDIS^.itemState MOD 2=1 Then
Begin
SetTextColor(lpDIS^.hDC,$DDFF);
DrawText(lpDIS^.hDC,PChar(Str),-1,lpDIS^.rcItem,DT_SINGLELINE OR DT_VCENTER OR DT_CENTER);
DrawEdge(lpDIS^.hDC,lpDIS^.rcItem,BDR_SUNKENOUTER,BF_RECT);
End;
End;
问题是,现在string是在stack里分配的,从代码看,是局部变量。画个堆栈就可以发现,这个String的位置恰好对应到004042AD的指令分配的空间,而且长度为0ch。而从下面可以看见,get到的长度最多是0ah。差2个字节。但是short的存放方式是1个长度字节+255个buffer,这里却有2个字节的富余。然而AnsiString起码也要4个字节。实在想不通是怎么回事。试了用String[10],但是在类型转换的地方出了问题。Array of Byte没有试过,从理论和实际上应该可以自圆其说,但因为GetWindowText的关系,没敢造次。
//尚未点击,绘制按钮边框-突起状态
DrawEdge(pdis.hDC, pdis.rcItem, BDR_RAISEDOUTER, BF_RECT);
GetWindowText(pdis.hwndItem, szText, sizeof(szText));
DrawText(pdis.hDC, szText, -1, pdis.rcItem, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
//已被按下,绘制按钮边框-凹陷状态
//if (pdis.itemState and ODS_SELECTED)=ODS_SELECTED then
if (pdis.itemState and ODS_SELECTED) <> 0 then
begin
SetTextColor(pdis.hDC, $00ddff);
DrawText(pdis.hDC, szText, - 1, pdis.rcItem, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
DrawEdge(pdis.hDC, pdis.rcItem, BDR_SUNKENOUTER, BF_RECT);
end;
end;
//////////////
大家可以看出他逆向的还真差不多呢!佩服