在編寫窗口程序的時候,經常需要使用messagebox函數嚼蚀,不管是調試輸入也好禁灼,查看變量也罷。這時如果是全字符串的還好轿曙,但是如果需要顯示數值的內容時弄捕,用這個函數就比較麻煩了。需要先使用wsprintf函數執(zhí)行一遍导帝,然后在使用messagebox函數守谓。遠沒有在命令行下的printf方便,如果是需要大量彈窗時就更麻煩了舟扎。所以決定將這兩個函數封裝起來分飞,這樣messagebox就可以和printf函數一樣方便使用了。最終經過兩天時間睹限,完成了這個Unicode編碼的函數譬猫,期間碰到了許多問題讯檐,通過一次次單步調試,查看匯編代碼最終解決掉了所有問題染服,函數能正常使用了别洪。
源碼
/*-------------------------------------------------------*/
/* 函數名稱: 御坂高級彈窗消息 - 限長2000限參100 Unicode
/* 函數參數: 第一個是字符串,和printf一樣柳刮,不定參數個數
/* 使用說明: 彈窗的內容可以使用任意多個參數,類型暫時只支持 %d 和 %s
/*-------------------------------------------------------*/
VOID MSKMessageBox(PTSTR string, ...){
UINT num = 0;
__asm{//獲取字符串的長度挖垛,Unicode版本
//int 3
mov eax, string//獲得字符串的地址
sss:
xor ebx,ebx//清零寄存器
mov bx,word ptr [eax]//獲取該地址的兩字節(jié)的值,賦值給bx
add num,1//計數+1
add eax, 2//地址偏移+2
test bx, bx//判斷bx是不是為0
jne sss//如果不是0則循環(huán)
}
TCHAR str[2001] = {0};//最多2000的字節(jié)內容,如果超過2000就返回錯誤
DWORD straddress[100] = { 0 };//字符串參數地址秉颗,最多100個
INT param = 0;//參數個數
INT strnum = 0;//新的字符串的計數
INT arrnum = 0;//數組的計數
DWORD ebpnum = 0;//先獲得EBP的基址
DWORD temp;//用來獲取數字的值的
UINT i;
for (i = 0; i< num&& i< 2000; i++){
if (string[i] == '%' && (string[i + 1] == 'd' || string[i + 1] == 's')){
param++;
__asm{
mov dword ptr[ebpnum], ebp
}
if (string[i] == '%' && string[i + 1] == 'd'){
TCHAR number[11] = { 0 };//INT整數最多10位
temp = ebpnum + 4 * param + 8;
wsprintf(number, TEXT("%d"), *(DWORD*)temp);
int test = 0;
test = lstrlen(number);
memcpy(&str[strnum], number, lstrlen(number) * 2);//unicode
strnum += lstrlen(number);
i++;
} else{
//--------------------------------------------
temp = ebpnum + 4 * param + 8;//取得參數的地址痢毒,然后4字節(jié)的值寫入到對應位置
straddress[arrnum] = *(DWORD*)temp;
int testnum = 0;
__asm{//獲取字符串的長度,Unicode版本
mov ecx, arrnum
mov eax, straddress
mov eax, straddress[ecx * 4]
sss2 :
xor ebx, ebx
mov bx, word ptr[eax]
add testnum, 1
add eax, 2
test bx, bx
jne sss2
dec testnum
}
memcpy(&str[strnum], straddress[arrnum], testnum * 2);//unicode
strnum += testnum;
i++;
arrnum++;
//--------------------------------------------
}
} else{
str[strnum] = string[i];
strnum += 1;
}
}
TCHAR msg[2001] = {0};
wsprintf(msg, TEXT("字符串:%s 長度:%d 參數:%d"), str, lstrlen(str), param);
MessageBox(NULL, msg, TEXT("御坂高級彈窗消息"), MB_OK);
}