freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

delphi的對象機制淺探-資料下載頁

2025-08-12 10:00本頁面

【導(dǎo)讀】前幾天開始閱讀VCL源代碼,可是幾個基類的繼承代碼把我看得頭大。最后只好臨時啃了一下匯編,把Delphi對象操作的幾個關(guān)鍵的方法勘察。這是我花費一個晚上的測試結(jié)果,更多的細節(jié)只能以后在學(xué)習(xí)中再去了解。其實更重要的是,大家可以幫忙檢查我的分析有沒有錯誤。和VCL得來的,匯編更是臨時抱佛腳,所以錯誤難免。我清楚自己的水平,所以寫下結(jié)論后非常擔(dān)心。盡管如此,我的目的是為了學(xué)習(xí),希望你發(fā)現(xiàn)錯誤。編譯器對每個class都一視同仁。(*)dl和eax是constructorCreate實現(xiàn)的關(guān)鍵寄存器。結(jié)構(gòu)化異常處理。(*)objectreference方式的constructor調(diào)用,編譯器嘗試實現(xiàn)為inherited調(diào)。Callingconventions(register缺省調(diào)用約定,constructor和destructor函數(shù)必須?!禗elphi的原子世界》非常值得一讀。addesp,$0c;恢復(fù)堆棧,注意只恢復(fù)了12字節(jié)的堆棧,,確實是個空函數(shù)。在Win32操作系統(tǒng)上的實現(xiàn)之一。還有其他的異常處理實現(xiàn)機制,產(chǎn)生的代碼也不相同。

  

【正文】 。 var A: TA。 tmpInt: Integer。 begin A := 。 tmpInt := 0。 (100)。 asm MOV ECX, A。 //為什麼 = 100 立即數(shù)就可以顯示為 100, 如果不改就顯示為其它值。 (這里修改一下 ) MOV tmpInt, ECX。 end。 ShowMessage(IntToStr(TA(tmpInt).FA))。//主意這里如果改為這樣就對了,這里可能是編譯器做的 。 end。 其實(積步)的做法就是得到這個類的段地址的 FA 的偏移地址。而不是該地址 里面的內(nèi)容,至于怎么樣取出我們要找到該變量地址的值,就象 (savetime)那樣 做!但是那樣那做為什么能夠取出他的值?后來(積步)用寄存器加上立即數(shù)也可以 取出來,我還是模糊??? 來自: savetime, 時間: 202016 10:19:00, ID: 2395616 to kk2020: 你的問題很簡單 MOV EAX, A。 // A 是指向?qū)ο蟮闹羔槪@句把對象在內(nèi)存中的地址存入 EAX 這時 EAX + 4 就是對象的第一個成員變量 TA(EAX).FA 就是 EAX 加上 FA 的偏移處的內(nèi)容 這是 Delphi 語法支持的,能大概看得懂就行了。 你可是解決了一個大問題,不用匯編也能訪問私有 成員,我原以為是匯編的特權(quán)呢。 procedure (Sender: TObject)。 var A: TA。 begin A := 。 (100)。 ShowMessage(IntToStr(TA(A).FA))。 。 end。 來自: savetime, 時間: 202016 10:28:00, ID: 2395657 我錯了,我忘記同一個單元的類可以互相訪問私有成員,真是該死。 來自: chnplzh, 時間: 202016 10:40:00, ID: 2395707 收藏! 來自: book523, 時間: 202016 11:47:00, ID: 2395949 to savetime: 你做什么工作啊,好像挺有時間的啊。 有時間到 上看看,是個好地方啊。 來自: savetime, 時間: 202016 12:05:00, ID: 2396007 to book523, 真是高手云集啊,收藏! 我在公司做雜務(wù),主要是收發(fā)貨、檢查客戶退回來的產(chǎn)品。我總是盡快把雜務(wù)處理掉,其他的時間就自己寫點小程序,讀讀書。我也想去軟件公司, 可是沒有人要我,學(xué)歷太低,專業(yè)知識也不夠。只好先混著。 來自: ka52, 時間: 202016 12:43:00, ID: 2396097 看了看 .感覺這才是真正的高手之路 . 可偶對匯編太沒感覺了 ..我開始看看 vcl 吧 :) 來自: Walnut_Tom, 時間: 202016 13:52:00, ID: 2396282 這里也是高手如云呀 來自: book523, 時間: 202016 14:03:00, ID: 2396310 01上很多都是在這里已成名 的高手。 當然現(xiàn)在人氣還不夠。 來自: savetime, 時間: 202016 16:08:00, ID: 2396594 昨天只看完了 Windows Callback FObjectInstance 方法的匯編代碼。如果 Borland 把 TMessage 設(shè)計為 Result 字段在最前面,就不用把 Windows 回調(diào)前在堆棧中建立的參數(shù)再 PUSH 一遍了,直接把 Windows 傳過來的 HWND 設(shè)置為 0 后當作 Result 用就行了 (因為 MainWndProc 并沒有使用到 HWND)。這樣的話 StdWndProc 就可以設(shè)計為只有一段小段代碼而不是函數(shù),處理消息的效率可以稍微提高一點??磥? Borland 寧愿降低效率也不愿放棄語法的美感。 下面是從 Windows Callback 開始到 被調(diào)用的匯編代碼: DispatchMessage(amp。Msg) // Windows 準備回調(diào) Windows 準備回調(diào) : push LPARAM push WPARAM push UINT push HWND push () 。 把 Windows Callback 后下一條語句的地址保存在堆棧中 jmp 只有一條 call 語句 : call push jmp 。調(diào)用 : pop ecx 。將 的值存入 ecx, 用于取 @MainWndProc 和 Self jmp StdWndProc 。跳轉(zhuǎn)至 StdWndProc StdWndProc 的反匯編代碼 : function StdWndProc(Window: HWND。 Message, WParam: Longint。 LParam: Longint): Longint。 stdcall。 assembler。 asm push ebp mov ebp, esp XOR EAX,EAX xor eax, eax PUSH EAX push eax 。 := 0 PUSH LParam push dword ptr [ebp+$14] PUSH WParam push dword ptr [ebp+$10] PUSH Message push dword ptr [ebp+$0c] MOV EDX,ESP mov edx, esp 。 mov edx, var TMessage MOV EAX,[ECX].Longint[4] mov eax, [ecx+$04] 。 mov eax, Self CALL [ECX].Pointer call dword ptr [ecx] : call MainWndProc ADD ESP,12 add esp, $0c POP EAX pop eax end。 pop ebp ret $0010 mov eax, eax 對于 VCL 消息系統(tǒng)的學(xué)習(xí),這只是個開始。在 方法中設(shè)置斷點,查看什么時候建立窗口,結(jié)果看到的調(diào)用堆棧 是下面這樣: (0) ([csHandleValid..csFontValid]) (39。039。) (39。039。) ($9525B4) ($951FA8) ($951FA8) InternalReadComponentRes(39。TForm139。,4194304,$951FA8) InitComponent(TForm1) InitInheritedComponent($951FA8,TForm) ($9517C8) (TForm1,(no value)) Project1 真是太復(fù)雜了,除了硬著頭皮一行行代碼讀下去,還有什么好辦法呢? 來自: savetime, 時間: 202016 17:55:00, ID: 2396907 瀏覽了一個 Application 的執(zhí)行過程,把過程簡單描述一下: begin 首先調(diào)用了一個隱含的過程 _InitExe _InitExe 初始化了 Module 信息,然后調(diào)用 _StartExe _StartExe 設(shè)置異常等,然后調(diào)用 InitUnits InitUnits 調(diào)用各個 Units 的 Initialization 段 其中調(diào)用到了 的 Initializaiotn 段 調(diào)用 InitControls InitControls 主要建立 Mouse, Screen和 Application 實例 調(diào)用 建立一個窗口,并設(shè)置 為回調(diào)函數(shù) 主要處理一些應(yīng)用程序級別的消息 然后才是 Project 的第一句: 。 這個過程基本上沒有內(nèi)容,主要是讓用戶設(shè)置一個初始化函數(shù) 然后是 Project 的第二句: (TForm1, Form1)。 新增 Form1 的內(nèi)存實例 調(diào)用 (Self) 調(diào)用 InitInheritedComponent InitInheritedComponent 調(diào)用 InternalReadComponentRes InternalReadComponentRes 調(diào)用 調(diào)用 調(diào)用到了 GetTextHeight 調(diào)用 調(diào)用 這時候才標識出 又調(diào)用了 要 求 使 用 Handle 于 是 調(diào) 用 需要 HWnd,于是調(diào)用 由于沒有建立 HWnd,于是調(diào)用 這才調(diào)用 建立窗口 調(diào)用 調(diào)用 這時才真正建立了一個窗口 真是漫漫長路。 最后是: 。 我還沒看代碼,估計是建立消息循環(huán)之類。 看來不能這樣跟蹤,相關(guān)流操作太多,今天回家單獨建立一個 TForm 跟蹤一下。 下班了 ! 來自: xzgyb, 時間: 202017 21:02:00, ID: 2399360 最近在看 windows 程序設(shè)計 ,對 windows 編程稍懂了點,下午照 vcl 抄了一下,只是主要的窗口建立部分,不知對你有沒有用,如下 unit MyWindowUnit。 interface uses Windows, SysUtils, Messages。 type TMyCreateParams = record Caption: PChar。 Style: DWORD。 ExStyle: DWORD。 X, Y: Integer。 Width, Height: Integer。 WndParent: HWnd。 Param: Pointer。 WindowClass: TWndClass。 WinClassName: array[0..63] of Char。 end。 TMyMessage = packed record Msg: Cardinal。 case Integer of 0: ( WParam: Longint。 LParam: Longint。 Result: Longint)。 1: ( WParamLo: Word。 WParamHi: Word。 LParamLo: Word。 LParamHi: Word。 ResultLo: Word。 ResultHi: Word)。 end。 TMyWndMethod = procedure(var Message: TMyMessage) of object。 TMyWindow = class private FHandle: HWnd。 FDefWndProc: Pointer。 FObjectInstance: Pointer。 function GetHandle: HWnd。 protected procedure CreateWindowHandle(const Params: TMyCreateParams)。 virtual。 procedure CreateParams(var Params: TMyCreateParams)。 virtual。 procedure Creat
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1