先貼代碼,其中DM是一個封裝好的類:
//獲取游戲視窗句柄
void CtestDlg::OnBnClickedButton1()
{
g_userHwnd = 0;
CString cGameStr = "";
((CComboBox*)GetDlgItem(IDC_COMBO1))->GetWindowTextA(cGameStr);
//MessageBox(cGameStr);
CString ctStr;
ctStr = dm.EnumWindow(0, cGameStr, "", 1 + 4 + 8 + 16);
MessageBox(ctStr);
g_userHwnd = (HWND)atol(ctStr);
dm.SetPath("D:\My Documents\Visual Studio 2015\Projects\test");
HWND childWnd = NULL;
long c_userHwnd = long(g_userHwnd);
int aT = 330042;
//EnumChildWindows();
childWnd = (HWND)FindWindowEx(g_userHwnd,NULL,NULL,_T("Edit"));
int a = dm.BindWindow(c_userHwnd, "dx", "normal", "windows", 0); //斷點下在這里
a = dm.KeyPress(65);
a = dm.UnBindWindow();
}
斷點除錯值如下:
- g_userHwnd 0x000708bc HWND__ *
{unused=0 } int
+ childWnd 0x00000000 <NULL> HWND__ *
c_userHwnd 460988 long
+ ctStr "460988" ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >
===========
我想問下
1.首先ctStr取到的“記事本”視窗句柄為460988 轉成HWND型資料g_userHwnd的成員unused為0 這一步應該是有問題的吧
2.用一個long 的c_userHwnd 接收 強轉過來的long(g_userHwnd)獲得的值居然沒錯是460988 這個是怎么理解
HWND本質上是4個位元組的int型別,對吧,直接強轉為什么不行,應該也沒有溢位吧。
uj5u.com熱心網友回復:
測驗代碼:HWND a = NULL;
long b = 460988;
a = (HWND)b;
CString cstr = NULL;
cstr.Format("a = %d", a);
MessageBox(cstr);
下斷點除錯結果:
- a 0x000708bc {unused=6563 } HWND__ *
b 460988 long
+ cstr "a = 460988" ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >
============為什么a的成員unused = 6563 而不是460988
uj5u.com熱心網友回復:
沒錯啊。。。。uj5u.com熱心網友回復:
可是1樓得到的 unused = 0而測驗代碼得到的 unused = 6563
這是何解,2段代碼都是基于 460988 這個數去強轉的
而且按道理460988 強轉過來也應該是 460988 才對吧
uj5u.com熱心網友回復:
理解和討論之前請先學會如何觀察!計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→資料結構、編譯原理、作業系統→計算機網路、資料庫原理、正則運算式→其它語言(包括C++)、架構……
對學習編程者的忠告:
多用小腦和手,少用大腦、眼睛和嘴,會更快地學會編程!眼過千遍不如手過一遍!
書看千行不如手敲一行!
手敲千行不如單步一行!
單步源代碼千行不如單步Debug版對應匯編一行!
單步Debug版對應匯編千行不如單步Release版對應匯編一行!
不會單步Release版對應匯編?在你想單步Release版C/C++代碼片斷的前面臨時加一句DebugBreak();重建所有,然后在IDE中運行。(一般人我不告訴他!
)VC除錯時按Alt+8、Alt+7、Alt+6和Alt+5,打開匯編視窗、堆疊視窗、記憶體視窗和暫存器視窗看每句C對應的匯編、單步執行并觀察相應堆疊、記憶體和暫存器變化,這樣過一遍不就啥都明白了嗎。
對VC來說,所謂‘除錯時’就是編譯連接通過以后,按F10或F11鍵單步執行一步以后的時候,或者在某行按F9設了斷點后按F5執行停在該斷點處的時候。
http://edu.csdn.net/course/detail/2344 C語言指標與匯編記憶體地址-一.代碼要素
uj5u.com熱心網友回復:
HWND 是一個虛構的結構體指標, 具體成員的資料是無意義的, unused 沒影響的HWND是系統提供的一個ID數值而已, App層看不到內部資料的
uj5u.com熱心網友回復:
指標 在32位和64位模式下是長度不一樣的uj5u.com熱心網友回復:
============
你的意思是如果 我將一個值為 460988 的long數值賦值給HWND,而這個HWND顯示出來的不是460988 的數值,是正常情況?
uj5u.com熱心網友回復:
HWND實際上就是一個int的結構體對吧,4個位元組的 460988 怎么著都不會溢位吧
uj5u.com熱心網友回復:
=============
老師能不能具體案例具體解釋下這個是什么情況呢
uj5u.com熱心網友回復:
下斷點除錯結果:
- a 0x000708bc {unused=6563 } HWND__ *
b 460988 long
+ cstr "a = 460988" ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >
============為什么a的成員unused = 6563 而不是460988
都說了, 不要去管 unused, 這個是沒意義的, 你去看 0x000708bc
0x000708bc 轉換成10進制就是 460988
uj5u.com熱心網友回復:
HWND 是一個虛構的結構體指標, 具體成員的資料是無意義的, unused 沒影響的
HWND是系統提供的一個ID數值而已, App層看不到內部資料的
============
你的意思是如果 我將一個值為 460988 的long數值賦值給HWND,而這個HWND顯示出來的不是460988 的數值,是正常情況?
下斷點除錯結果:
- a 0x000708bc {unused=6563 } HWND__ *
b 460988 long
+ cstr "a = 460988" ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char> > >
============為什么a的成員unused = 6563 而不是460988
都說了, 不要去管 unused, 這個是沒意義的, 你去看 0x000708bc
0x000708bc 轉換成10進制就是 460988
==Ole
uj5u.com熱心網友回復:
http://edu.csdn.net/course/detail/2344 C語言指標與匯編記憶體地址-一.代碼要素轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/112564.html
標籤:基礎類
