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

正文內(nèi)容

delphi的對(duì)象機(jī)制淺探-資料下載頁(yè)

2025-08-12 10:00本頁(yè)面

【導(dǎo)讀】前幾天開(kāi)始閱讀VCL源代碼,可是幾個(gè)基類(lèi)的繼承代碼把我看得頭大。最后只好臨時(shí)啃了一下匯編,把Delphi對(duì)象操作的幾個(gè)關(guān)鍵的方法勘察。這是我花費(fèi)一個(gè)晚上的測(cè)試結(jié)果,更多的細(xì)節(jié)只能以后在學(xué)習(xí)中再去了解。其實(shí)更重要的是,大家可以幫忙檢查我的分析有沒(méi)有錯(cuò)誤。和VCL得來(lái)的,匯編更是臨時(shí)抱佛腳,所以錯(cuò)誤難免。我清楚自己的水平,所以寫(xiě)下結(jié)論后非常擔(dān)心。盡管如此,我的目的是為了學(xué)習(xí),希望你發(fā)現(xiàn)錯(cuò)誤。編譯器對(duì)每個(gè)class都一視同仁。(*)dl和eax是constructorCreate實(shí)現(xiàn)的關(guān)鍵寄存器。結(jié)構(gòu)化異常處理。(*)objectreference方式的constructor調(diào)用,編譯器嘗試實(shí)現(xiàn)為inherited調(diào)。Callingconventions(register缺省調(diào)用約定,constructor和destructor函數(shù)必須?!禗elphi的原子世界》非常值得一讀。addesp,$0c;恢復(fù)堆棧,注意只恢復(fù)了12字節(jié)的堆棧,,確實(shí)是個(gè)空函數(shù)。在Win32操作系統(tǒng)上的實(shí)現(xiàn)之一。還有其他的異常處理實(shí)現(xiàn)機(jī)制,產(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))。//主意這里如果改為這樣就對(duì)了,這里可能是編譯器做的 。 end。 其實(shí)(積步)的做法就是得到這個(gè)類(lèi)的段地址的 FA 的偏移地址。而不是該地址 里面的內(nèi)容,至于怎么樣取出我們要找到該變量地址的值,就象 (savetime)那樣 做!但是那樣那做為什么能夠取出他的值?后來(lái)(積步)用寄存器加上立即數(shù)也可以 取出來(lái),我還是模糊??? 來(lái)自: savetime, 時(shí)間: 202016 10:19:00, ID: 2395616 to kk2020: 你的問(wèn)題很簡(jiǎn)單 MOV EAX, A。 // A 是指向?qū)ο蟮闹羔?,這句把對(duì)象在內(nèi)存中的地址存入 EAX 這時(shí) EAX + 4 就是對(duì)象的第一個(gè)成員變量 TA(EAX).FA 就是 EAX 加上 FA 的偏移處的內(nèi)容 這是 Delphi 語(yǔ)法支持的,能大概看得懂就行了。 你可是解決了一個(gè)大問(wèn)題,不用匯編也能訪問(wèn)私有 成員,我原以為是匯編的特權(quán)呢。 procedure (Sender: TObject)。 var A: TA。 begin A := 。 (100)。 ShowMessage(IntToStr(TA(A).FA))。 。 end。 來(lái)自: savetime, 時(shí)間: 202016 10:28:00, ID: 2395657 我錯(cuò)了,我忘記同一個(gè)單元的類(lèi)可以互相訪問(wèn)私有成員,真是該死。 來(lái)自: chnplzh, 時(shí)間: 202016 10:40:00, ID: 2395707 收藏! 來(lái)自: book523, 時(shí)間: 202016 11:47:00, ID: 2395949 to savetime: 你做什么工作啊,好像挺有時(shí)間的啊。 有時(shí)間到 上看看,是個(gè)好地方啊。 來(lái)自: savetime, 時(shí)間: 202016 12:05:00, ID: 2396007 to book523, 真是高手云集啊,收藏! 我在公司做雜務(wù),主要是收發(fā)貨、檢查客戶退回來(lái)的產(chǎn)品。我總是盡快把雜務(wù)處理掉,其他的時(shí)間就自己寫(xiě)點(diǎn)小程序,讀讀書(shū)。我也想去軟件公司, 可是沒(méi)有人要我,學(xué)歷太低,專(zhuān)業(yè)知識(shí)也不夠。只好先混著。 來(lái)自: ka52, 時(shí)間: 202016 12:43:00, ID: 2396097 看了看 .感覺(jué)這才是真正的高手之路 . 可偶對(duì)匯編太沒(méi)感覺(jué)了 ..我開(kāi)始看看 vcl 吧 :) 來(lái)自: Walnut_Tom, 時(shí)間: 202016 13:52:00, ID: 2396282 這里也是高手如云呀 來(lái)自: book523, 時(shí)間: 202016 14:03:00, ID: 2396310 01上很多都是在這里已成名 的高手。 當(dāng)然現(xiàn)在人氣還不夠。 來(lái)自: savetime, 時(shí)間: 202016 16:08:00, ID: 2396594 昨天只看完了 Windows Callback FObjectInstance 方法的匯編代碼。如果 Borland 把 TMessage 設(shè)計(jì)為 Result 字段在最前面,就不用把 Windows 回調(diào)前在堆棧中建立的參數(shù)再 PUSH 一遍了,直接把 Windows 傳過(guò)來(lái)的 HWND 設(shè)置為 0 后當(dāng)作 Result 用就行了 (因?yàn)?MainWndProc 并沒(méi)有使用到 HWND)。這樣的話 StdWndProc 就可以設(shè)計(jì)為只有一段小段代碼而不是函數(shù),處理消息的效率可以稍微提高一點(diǎn)。看來(lái) Borland 寧愿降低效率也不愿放棄語(yǔ)法的美感。 下面是從 Windows Callback 開(kāi)始到 被調(diào)用的匯編代碼: DispatchMessage(amp。Msg) // Windows 準(zhǔn)備回調(diào) Windows 準(zhǔn)備回調(diào) : push LPARAM push WPARAM push UINT push HWND push () 。 把 Windows Callback 后下一條語(yǔ)句的地址保存在堆棧中 jmp 只有一條 call 語(yǔ)句 : 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 對(duì)于 VCL 消息系統(tǒng)的學(xué)習(xí),這只是個(gè)開(kāi)始。在 方法中設(shè)置斷點(diǎn),查看什么時(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ù)雜了,除了硬著頭皮一行行代碼讀下去,還有什么好辦法呢? 來(lái)自: savetime, 時(shí)間: 202016 17:55:00, ID: 2396907 瀏覽了一個(gè) Application 的執(zhí)行過(guò)程,把過(guò)程簡(jiǎn)單描述一下: begin 首先調(diào)用了一個(gè)隱含的過(guò)程 _InitExe _InitExe 初始化了 Module 信息,然后調(diào)用 _StartExe _StartExe 設(shè)置異常等,然后調(diào)用 InitUnits InitUnits 調(diào)用各個(gè) Units 的 Initialization 段 其中調(diào)用到了 的 Initializaiotn 段 調(diào)用 InitControls InitControls 主要建立 Mouse, Screen和 Application 實(shí)例 調(diào)用 建立一個(gè)窗口,并設(shè)置 為回調(diào)函數(shù) 主要處理一些應(yīng)用程序級(jí)別的消息 然后才是 Project 的第一句: 。 這個(gè)過(guò)程基本上沒(méi)有內(nèi)容,主要是讓用戶設(shè)置一個(gè)初始化函數(shù) 然后是 Project 的第二句: (TForm1, Form1)。 新增 Form1 的內(nèi)存實(shí)例 調(diào)用 (Self) 調(diào)用 InitInheritedComponent InitInheritedComponent 調(diào)用 InternalReadComponentRes InternalReadComponentRes 調(diào)用 調(diào)用 調(diào)用到了 GetTextHeight 調(diào)用 調(diào)用 這時(shí)候才標(biāo)識(shí)出 又調(diào)用了 要 求 使 用 Handle 于 是 調(diào) 用 需要 HWnd,于是調(diào)用 由于沒(méi)有建立 HWnd,于是調(diào)用 這才調(diào)用 建立窗口 調(diào)用 調(diào)用 這時(shí)才真正建立了一個(gè)窗口 真是漫漫長(zhǎng)路。 最后是: 。 我還沒(méi)看代碼,估計(jì)是建立消息循環(huán)之類(lèi)。 看來(lái)不能這樣跟蹤,相關(guān)流操作太多,今天回家單獨(dú)建立一個(gè) TForm 跟蹤一下。 下班了 ! 來(lái)自: xzgyb, 時(shí)間: 202017 21:02:00, ID: 2399360 最近在看 windows 程序設(shè)計(jì) ,對(duì) windows 編程稍懂了點(diǎn),下午照 vcl 抄了一下,只是主要的窗口建立部分,不知對(duì)你有沒(méi)有用,如下 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
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1