鱼C论坛

 找回密码
 立即注册
查看: 3198|回复: 6

[已解决]Win32匯編窗口句柄問題

[复制链接]
发表于 2019-11-2 12:13:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Win32匯編中, 第一個窗口程序有些小問題想請教一下
1. GetModuleHandle 獲取當前的執行檔的句柄, 這個是因為這個執行檔載入記憶體後, 需要一個辨識, 所以才有這個句柄我可以理解,
可是為什麼要把這個句柄當作參數送到WndClassEx中? 是因為WndClassEx需要一個父程序的句柄當作辨識, 辨識這個WndClassEx是屬於哪一個程序的嗎?

2. CreateWindowEx創建一個窗口的時候, 我們要給他一個句柄, 這個句柄我們也是給他hInstance, 與註冊WndClassEx的句柄是一樣的,
是因為這個窗口也需要一個父程序的句柄當作辨識, 辨識這個窗口是屬於哪一個程序的嗎?
最佳答案
2019-11-2 16:13:18
1.png
2.png


是不是明白了?这就是hInstance
hInstance 保存着当前exe文件的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-2 14:13:49 | 显示全部楼层
如果能附上一个简短的程序辅以说明,那就更好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 14:21:22 | 显示全部楼层
本帖最后由 kikiatw 于 2019-11-2 14:24 编辑

  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; 窗口程序的模板代碼
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4.                 .386
  5.                 .model flat,stdcall
  6.                 option casemap:none
  7. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  8. ; Include 文件定義
  9. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10. include                windows.inc
  11. include                gdi32.inc
  12. includelib        gdi32.lib
  13. include                user32.inc
  14. includelib        user32.lib
  15. include                kernel32.inc
  16. includelib        kernel32.lib
  17. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  18. ; 數據段
  19. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  20.                 .data?
  21. hInstance        dd        ?
  22. hWinMain        dd        ?
  23. hWinSlav        dd        ?

  24.                 .const
  25. szClassName        db        'MyClass',0
  26. szCaptionMain        db        'My first Window !',0
  27. szText                db        'Welcome to fishc.com!',0
  28. szButton        db        'button',0
  29. szButtonText        db        '&OK',0
  30. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  31. ; 代碼段
  32. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  33.                 .code
  34. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  35. ; 窗口過程
  36. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  37. _ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam
  38.                 local        @stPs:PAINTSTRUCT
  39.                 local        @stRect:RECT
  40.                 local        @hDc

  41.                 mov        eax,uMsg
  42. ;********************************************************************
  43.                 .if        eax ==        WM_PAINT
  44.                         invoke        BeginPaint,hWnd,addr @stPs
  45.                         mov        @hDc,eax

  46.                         invoke        GetClientRect,hWnd,addr @stRect
  47.                         invoke        DrawText, @hDc, addr szText, -1, addr @stRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
  48.                         invoke        EndPaint,hWnd,addr @stPs
  49. ;********************************************************************
  50.                 .elseif        eax ==        WM_CLOSE
  51.                         invoke        DestroyWindow,hWinMain
  52.                         invoke        DestroyWindow,hWinSlav
  53.                         invoke        PostQuitMessage,NULL
  54. ;********************************************************************
  55.                 .else
  56.                         invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
  57.                         ret
  58.                 .endif
  59. ;********************************************************************
  60.                 xor        eax,eax
  61.                 ret
  62. _ProcWinMain        endp

  63. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  64. ;********************************************************************
  65. ; 註冊窗口類
  66. ;********************************************************************
  67. _WinMain        proc
  68.                 local        @stWndClass:WNDCLASSEX
  69.                 local        @stMsg:MSG

  70.                 invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
  71. ;********************************************************************
  72. ; 註冊窗口類
  73. ;********************************************************************
  74.                 invoke        GetModuleHandle,NULL
  75.                 mov        hInstance,eax
  76.                 mov        @stWndClass.hInstance,eax
  77. ;                push        hInstance
  78. ;                pop        @stWndClass.hInstance
  79.                 invoke        LoadCursor,0,IDC_ARROW
  80.                 mov        @stWndClass.hCursor,eax
  81.                 mov        @stWndClass.cbSize,sizeof WNDCLASSEX
  82.                 mov        @stWndClass.style,CS_HREDRAW or CS_VREDRAW
  83.                 mov        @stWndClass.lpfnWndProc,offset _ProcWinMain
  84.                 mov        @stWndClass.hbrBackground,COLOR_WINDOW+1
  85.                 mov        @stWndClass.lpszClassName,offset szClassName
  86.                 invoke        RegisterClassEx,addr @stWndClass
  87. ;********************************************************************
  88. ; 建立並顯示窗口
  89. ;********************************************************************
  90.                 invoke        CreateWindowEx,WS_EX_CLIENTEDGE, offset szClassName, offset szCaptionMain, WS_OVERLAPPEDWINDOW, 100,100,600,400, NULL, NULL, hInstance, NULL
  91.                 mov        hWinMain,eax
  92.                 invoke        ShowWindow,hWinMain,SW_SHOWNORMAL
  93.                 invoke        UpdateWindow,hWinMain

  94.                 invoke        CreateWindowEx,WS_EX_CLIENTEDGE, offset szButton, offset szButtonText, WS_CHILD or WS_VISIBLE, 10,10,100,80, hWinMain, 1, hInstance, NULL
  95.                 mov        hWinSlav,eax
  96.                 invoke        ShowWindow,hWinSlav,SW_SHOWNORMAL
  97.                 invoke        UpdateWindow,hWinSlav

  98. ;********************************************************************
  99. ; 消息循環
  100. ;********************************************************************
  101.                 .while        TRUE
  102.                         invoke        GetMessage,addr @stMsg,NULL,0,0
  103.                         .break        .if eax        == 0
  104.                         invoke        TranslateMessage,addr @stMsg
  105.                         invoke        DispatchMessage,addr @stMsg
  106.                 .endw
  107.                 ret

  108. _WinMain        endp
  109. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  110. start:
  111.                 call        _WinMain
  112.                 invoke        ExitProcess,NULL
  113. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  114.                 end        start

复制代码


以上是一個簡短的程序, 麻煩您了

執行後
Snap3.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 14:43:19 | 显示全部楼层
本帖最后由 kikiatw 于 2019-11-2 14:44 编辑
  1.      invoke        CreateWindowEx,WS_EX_CLIENTEDGE, offset szButton, offset szButtonText, WS_CHILD or WS_VISIBLE, 10,10,100,80, hWinMain, 1, hInstance, NULL
  2.                 mov        hWinSlav,eax
  3.                 invoke        ShowWindow,hWinSlav,SW_SHOWNORMAL
  4.                 invoke        UpdateWindow,hWinSlav
复制代码

我自己照著書本多呼叫了一個按鈕, 然後看書上的說明, hWinMain 就是這個按鈕的父窗口, hInstance 就應該就是firstwindow的模塊, 規定就是這樣傳入, 所以第二個問題我沒問題了, 所以回來看第一個問題, 模塊, 就是這個程序載入內存的一個區域, hInstance 就是這個程序載入的標示符, 這個模塊可以看到自己的4GB內存
書上說WndClassEx.hInstance 就是: "指定要註冊的窗口類(WndClassEx)屬於哪個模塊 "
從上面這段話看起來, 也就是說, 只要理解模塊其實就是一個程序執行檔(firstwindow.exe)載入記憶體後, 系統會分配一個號碼給這個被執行的程序(firstwindow.exe), 也就是這個模塊的代碼, 如果是這樣理解的話, 我第一個問題似乎也算是解了, 對吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-2 16:13:18 | 显示全部楼层    本楼为最佳答案   
1.png
2.png


是不是明白了?这就是hInstance
hInstance 保存着当前exe文件的地址
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-2 16:25:50 | 显示全部楼层
哈哈哈哈, 看到MZ開頭跟這個位址, 雖然還沒學到PE結構, 但是我完全明白, 終於了解了, 所以我之前的理解是對的, 感謝!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-11 13:42:37 | 显示全部楼层
人造人 发表于 2019-11-2 14:13
如果能附上一个简短的程序辅以说明,那就更好了

你好,能不能帮忙看看这个问题,https://fishc.com.cn/thread-152138-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表