SlideShare a Scribd company logo
1 of 225
陳昇瑋  ( 陳寬達 ) 中央研究院  資訊科學研究所 Borland  C++Builder 進階課程
Outlines ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Win32  開發環境 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
獨立的  4GB  位址空間- Windows 95/98  架構 0xFFFFFFFF ~ 0xC0000000 1 GB  區域。用於  VxD 、記憶體管理、系統程式碼,所有  Win32  處理程序共享。 0xBFFFFFFF ~ 0x80000000 1 GB  區域。用於記憶體對映檔案及  Win32 DLL ,所有  Win32  程序共享。 0x7FFFFFFF ~ 0x00400000 2143289344  位元組,約  2044 MB ,每個  Win32  處理程序私有區域。 0x003FFFFF ~ 0x00001000 4190208  位元組,約  4 MB ,放置  DOS  及  Win16  應用程式。 0x00000FFF ~ 0x00000000 4096  位元組,用於偵測不合法指標。
獨立的  4GB  位址空間- Windows NT  架構 2 GB  區域。用於作業系統、核心程式及驅動程式,應用程式無法存取。 0xFFFFFFFF ~ 0x80000000 0x7FFEFFFF ~ 0x00010000 2147352576  位元組,約  2047 MB ,每個  Win32  處理程序私有區域。 0x0000FFFF ~ 0x00000000 64 KB  區域。用於偵測不合法指標。 0x7FFFFFFF ~ 0x7FFF0000 64 KB  區域。用於偵測不合法指標。
多執行緒支援 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
何謂行程( process )? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
何謂執行緒( thread )? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
多執行緒程式 ,[object Object],[object Object],[object Object],[object Object]
多執行緒的優劣 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Win32 API ,[object Object],[object Object]
Win32 API ,[object Object]
DLL  釋名 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DLL  的重要性 ,[object Object],[object Object],[object Object],[object Object]
DLL  的重要性 ,[object Object]
檢視  DLL  提供的函式 E:INNTystem32>dumpbin /exports user32.dll Microsoft (R) COFF Binary File Dumper Version 5.00.7022 Copyright (C) Microsoft Corp 1992-1997. All rights reserved. Dump of file user32.dll File Type: DLL Section contains the following Exports for USER32.dll 0 characteristics 336A2A2A time date stamp Sat May 03 01:53:46 1997 0.00 version 1 ordinal base 634  number of functions 634  number of names ordinal hint  name 1  0  ActivateKeyboardLayout  (00015B1A) 2  1  AdjustWindowRect  (0000D704) 3  2  AdjustWindowRectEx  (00007D8E) 4  3  AnyPopup  (00043ABB) 5  4  AppendMenuA  (00011F57) 6  5  AppendMenuW  (0002D7A4)
檢視  DLL  提供的資源
DLL  的運作特徵 ,[object Object],[object Object],[object Object],[object Object]
DLL  的載入方式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
訊息驅動 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
處處皆訊息 ,[object Object]
視窗訊息結構 ,[object Object],typedef struct tagMSG { //  訊息結構 HWND  hwnd; //  視窗編號 UINT  message; //  訊息編號 WPARAM wParam; //  參數  1 LPARAM lParam; //  參數  2 DWORD  time;  //  時間 POINT  pt;  //  滑鼠座標 } MSG;
訊息的傳遞方式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
以程式產生/傳遞訊息 ,[object Object],[object Object],[object Object],[object Object],[object Object]
以程式產生/傳遞訊息 ,[object Object],[object Object],void __fastcall TForm1::Button1Click(TObject *Sender) { HWND wnd; if (wnd = FindWindow(NULL, " 小算盤 ")) { PostMessage (wnd, WM_KEYDOWN, '1', 0); PostMessage (wnd, WM_CLOSE, 0, 0); }; } void __fastcall TForm1::Button1Click(TObject *Sender) { HWND wnd; if (wnd = FindWindow(NULL, " 小算盤 ")) { SendMessage (wnd, WM_SETTEXT, 0, (LPARAM)" 測試,測試 "); }; }
訊息處理機制 USER32.DLL 訊息迴圈 視窗函式 messages post messages send / post messages while ( GetMessage (&Msg, NULL, NULL, NULL)) { TranslateMessage (Msg); DispatchMessage (Msg); } switch (Msg.Message) { //  視窗建立時 case WM_CREATE: ...  //  按下滑鼠左鍵 case WM_LBUTTONDOWN: ...    //  按下按鍵時 case WM_KEYDOWN: ...  //  關閉視窗時 case WM_CLOSE: ... } DefWindowProc(..)
行程、執行緒、訊息佇列及 訊息迴圈 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
行程、執行緒、訊息佇列及 訊息迴圈 行程 執行緒 訊息佇列 程式碼 視窗  C  視窗函式 訊息迴圈 視窗  C 視窗  D 視窗  D  視窗函式 取出 分派 執行緒 訊息佇列 程式碼 視窗  A  視窗函式 訊息迴圈 視窗  A 視窗  B 視窗  B  視窗函式 取出 分派 工作執行緒 程式碼
開發工具的型態及演進 ,[object Object],[object Object],[object Object],[object Object],[object Object]
開發工具的型態及演進 ,[object Object],[object Object],[object Object]
Win32  開發工具的比較 ,[object Object]
RAD  無罪,輕鬆有理 ,[object Object],[object Object],[object Object]
RAD  無罪,輕鬆有理 ,[object Object],[object Object],[object Object]
C++ Language ,[object Object],[object Object],[object Object],[object Object]
Programming Paradigm ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Procedural  Programming Paradigm ,[object Object],[object Object],[object Object],[object Object],[object Object]
ADT Programming Paradigm ,[object Object],[object Object],[object Object],[object Object]
Object-Oriented  Programming Paradigm ,[object Object],[object Object],[object Object],[object Object],[object Object]
物件導向程式設計 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
物件導向要素-封裝 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],個體 動作  C 變數  A 變數  B 動作  D 介面 被使用
物件導向要素-繼承 ,[object Object],泡泡龍 吃(水果) 身高 體重 噴(泡泡) 酷斯拉 吃(魚) 身高 體重 噴(熱氣) 繼承 繼承 姓名 生蛋 爬蟲類 吃 身高 體重 噴
物件導向要素-多型 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
C++  的由來 ,[object Object]
如何看待  C++ ? ,[object Object],[object Object],[object Object],[object Object],[object Object]
強大複雜的  C++ ,[object Object],[object Object],如果你認為  C++  還不算太複雜,那麼請你解釋何謂  protected abstract virtual base pure virtual private destructor ,而你又會在何時需要它呢? Tom Cargill C++ Journal Fall 1990
強大複雜的  C++ ,[object Object]
C++  類別宣告 ,[object Object],[object Object],[object Object],[object Object],class  TMyClass { int a, b, c; TMyClass(<parameters>); //  建構函式 ~TMyClass(void); //  解構函式 void draw(); int draw(int x, int y, int z); };
C++  物件 ,[object Object],[object Object],[object Object],[object Object],void foo(void) { TCat cat;  //  在堆疊中建立  TCat  類別的  cat  物件 ,  進入  foo  時才建立 cat.Meow(); //  呼叫  cat  物件的  Meow()  方法 } TCat cat; //  在資料節區中建立  TCat  類別的  cat  物件 ,  程式啟動後即建立 void foo(void) { cat.Meow(); //  呼叫  cat  物件的  Meow()  方法 } void foo(void) { TButton* btn = new TButton(this);  //  在堆疊中建立  TButton  類別的  btn  物件 btn->Show(); //  呼叫  btn  物件的  Show()  方法 }
[object Object],[object Object],TMammal and child classes class  TMammal { private : AnsiString FName, FEyeColor; int  FAge; public : __fastcall  TMammal( void ); virtual   void   __fastcall  Speak( void ) = 0; }; class  TCat :  public  TMammal { virtual   void   __fastcall  Speak( void ) {ShowMessage(“I’m Cat”);} }; class   TDog  :  public  TMammal { virtual   void   __fastcall  Speak( void ) {ShowMessage(“I’m Dog”);} };
[object Object],[object Object],[object Object],The Power of Polymorphism void __fastcall TForm1::Button1Click(TObject *Sender) { TMammal* Mammal = new  TCat (); Mammal->Speak(); delete Mammal; } void __fastcall TForm1::Button2Click(TObject *Sender) { TMammal* Mammal = new  TDog (); Mammal->Speak(); delete Mammal; }
C++ Enhancement for BCB ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Added Keywords ,[object Object],[object Object],[object Object],[object Object]
Properties ,[object Object],[object Object],[object Object],[object Object],class TMyClass { private: TColor FColor; TColor __fastcall GetColor( void ); public:  __fastcall TMyClass( void ); __property TColor Color = { read = FColor, write = SetColor }; };
DFM resources ,[object Object],[object Object],# include <vclcl.h> #pragma hdrstop #include &quot;Unit1.h&quot; //--------------------------------------------------------- #pragma resource &quot;*.dfm”  // <- binding DFM resources TForm1 *Form1; //--------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { }
AnsiString Class and Variant ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],void __fastcall TForm1::Button1Click(TObject *Sender) { Variant x; x = 13; edtTest->Text = IntToStr( x + 12 ); x = &quot;Hello, world&quot;; ShowMessage( x ); }
Set ,[object Object],[object Object],typedef Set <char, 'A','Z'> UPPERCASESet; UPPERCASESet s;
Open Array ,[object Object],ShowMessage(Format(&quot;%s %d&quot;,  OPENARRAY (TVarRec, (&quot;Hello&quot;,    123))));
Traditional Methods for Error Handling ,[object Object],if ((pBuffer = malloc(1000)) == NULL) { /* error processing code here; */ } if ((fp = fopen(“data.txt”, “r”)) == NULL) { /* error processing code here; */ }
Handling VCL Exception ,[object Object],try { edtTotal->Text = IntToStr( StrToInt( edtOp1->Text ) / StrToInt( edtOp2->Text ) ); } catch ( EDivByZero& ) { ShowMessage( &quot;Cannot divide by zero&quot; ); } catch ( EConvertError& ) { ShowMessage( &quot;Error during conversion&quot; ); }
Unhandled VCL Exceptions ,[object Object],WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch  ( Exception  &exception) { Application->ShowException(&exception); } return 0; }
Throwing exceptions ,[object Object],[object Object],try { if (numItems == 0 ) throw EDivByZero( &quot;Cannot divide by zero&quot; );  // ^ throw your own exception else edtAvg->Text = FloatToStr( sum / numItems ); } catch ( EDivByZero& ) { edtAvg->Text = FloatToStr( 0.0 ); throw; // <- re-throw the same exception }
Creating Custom Exception Class ,[object Object],class EInvalidBalance : public Exception { public: virtual __fastcall EInvalidBalance( String msg ) : Exception( msg ) {}; };
VCL  的多重面貌 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  的原始碼面貌 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  的編譯後單元面貌 ,[object Object],[object Object]
VCL  的類別及元件面貌 ,[object Object],[object Object],[object Object]
VCL  的執行檔面貌 ,[object Object],這是一個什麼事都沒做的  console mode  程式: 大小只有  16K ,因為它只用到  RTL  的  System  單元,與  VCL  完全無關。 而這個呢,是一個什麼事都沒做,但包含一個  form  的  VCL  程式: 292864  位元組減掉  16384  位元組等於  276480  位元組,多出來的這些就是  VCL  機械碼。 ,[object Object],[object Object]
VCL  的  RunTime  Package  面貌 ,[object Object],[object Object],[object Object],[object Object]
VCL  的  Run-Time Package  面貌 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  的  Run-Time Package  面貌 ,[object Object],[object Object]
VCL  的  Run-Time Package  面貌
學習  VCL  類別架構 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
學習  VCL  類別架構 ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  核心類別 ,[object Object]
VCL  核心類別- TObject ,[object Object],[object Object],[object Object],[object Object]
VCL  核心類別- TObject ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  核心類別- TObject ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  核心類別- TObject ,[object Object],[object Object],[object Object],void foo(void) { TCat cat;  //  在堆疊中建立  TCat  類別的  cat  物件 ,  進入  foo  時才建立 cat.Meow(); //  呼叫  cat  物件的  Meow()  方法 } TCat cat; //  在資料節區中建立  TCat  類別的  cat  物件 ,  程式啟動後即建立 void foo(void) { cat.Meow(); //  呼叫  cat  物件的  Meow()  方法 } void foo(void) { TButton* btn = new TButton(this);  //  在累堆中建立  TButton  類別的  btn  物件 btn->Show(); //  呼叫  btn  物件的  Show()  方法 delete btn; }
VCL  核心類別- TObject ,[object Object],[object Object],TCCalendar = class(TCustomGrid) private ...  procedure WMSize(var Message: TWMSize); message WM_SIZE; end;
VCL  核心類別- TPersistent ,[object Object],[object Object],[object Object],[object Object]
VCL  核心類別- TPersistent ,[object Object],[object Object],[object Object],[object Object],[object Object],TPersistent = class(TObject) protected ... procedure AssignTo(Dest: TPersistent); virtual; public ... procedure Assign(Source: TPersistent); virtual; end;
VCL  核心類別- TPersistent ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  核心類別- TPersistent ,[object Object],[object Object],{ TPersistent abstract class } {$M+} TPersistent = class(TObject) ... end; {$M-}
VCL  核心類別- TComponent ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別 ,[object Object]
VCL  控制項類別 ,[object Object]
VCL  控制項類別- TControl ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別- TWinControl ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別- TGraphicControl ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別- TCustomControl ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別分類 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  控制項類別分類 ,[object Object],:hwnd -c project1 Handle  Class WinProc TID Module 03071A  IME 77E952BA ED 00000000 030724  TForm1 00254477 ED 00010100 050732  TStaticText 011B0FAE ED 00000000 050730  TPanel 011B0FBB ED 00010000 03072E  TButton 011B0FC8 ED 00000000 030718  TApplication 011B0FEF ED 0100:0000
VCL  控制項類別分類 ,[object Object]
VCL  控制項的擁有關係 ,[object Object],[object Object],任何不具視窗的  TControl  元件都必須以一個  TWinControl  元件為  parent  元件,也就是被一個  TWinControl  元件包含,它才能夠出現在畫面上。
VCL  控制項的擁有關係 ,[object Object],[object Object]
VCL  程式運作類別 ,[object Object]
VCL  程式運作類別- TForm ,[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  程式運作類別- TApplication ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
VCL  RAD  支援類別 ,[object Object]
VCL  RAD  支援類別
TStream ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
TFiler ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
元件是啥咚咚? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
為什麼要自行撰寫元件? ,[object Object],[object Object],[object Object],[object Object],[object Object]
元件使用者 ,[object Object],[object Object],[object Object],[object Object]
元件發展者 ,[object Object],[object Object],[object Object],[object Object],[object Object]
自製元件的種類 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
撰寫元件六大步驟 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
選擇父代類別 ,[object Object],[object Object],[object Object],[object Object],[object Object]
各類型元件的祖先類別
加強型元件- TShellAboutLabel ,[object Object],[object Object],[object Object],ShellExecute(0, “open”, “mailto:kuan@ilife.cx”, NULL,    NULL, SW_SHOWNORMAL);
加強型元件- TFlatEdit ,[object Object],[object Object],[object Object]
功能型元件- TWordCount ,[object Object],[object Object],[object Object]
組合型元件- TSuperListBox ,[object Object],[object Object]
對話盒元件- TAboutBox ,[object Object],[object Object],[object Object]
另起爐灶可視元件- TRuler ,[object Object],[object Object],[object Object]
另起爐灶可視元件- TGradientEdit ,[object Object],[object Object],[object Object],[object Object],[object Object]
Real life samples from the lecturer ,[object Object],[object Object],[object Object],[object Object]
Sample 1 - TxColorMemo ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Sample 1 - TxColorMemo ,[object Object],[object Object]
Sample 2 - TxMarquee ,[object Object],[object Object],[object Object]
Sample 3 - TxHexEdit ,[object Object],[object Object],[object Object],[object Object],[object Object]
Sample 3 - TxHexEdit ,[object Object],[object Object]
Mechanisms behind RAD Environment ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Run Time Type Information
Run Time Type Information ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Where is RTTI ? ,[object Object],[object Object],[object Object],[object Object]
Unfold the RTTI Data of Objects ,[object Object],VMT structure: defined in System unit Pointer Instance Variable P: TMyObject Instance Data VMT Pointer ... Data field 1 Data field 2 Data field 3 Virtual Method Table ... -64 -60 -56 0 4 -4 ... Self Pointer Type Info Field Table Destroy First Virtual Method ... Init Table -76 PTypeInfo = ^TTypeInfo; TTypeInfo = record Kind: TTypeKind; Name: ShortString; {TypeData: TTypeData} end; Class function TObject.ClassInfo: Pointer;
What’s Inside the TTypeInfo Structure ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
The Advantages RTTI Take to Programmers ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Use is And as Operator ,[object Object],[object Object],procedure TForm1.BtnTypeCastClick(Sender: TObject); begin if Sender  is  TMenuItem then ShowMessage(‘Menu: ’ + TMenuItem(Sender).Caption) else  ShowMessage(‘Button: ’ + (Sender as TButton).Caption); end;
Know More Than Just Name Of Properties and Events ,[object Object],procedure TForm1.Button2Click(Sender: TObject); var I  : Integer; PropInfo: PPropInfo; begin for I := 0 to ComponentCount - 1 do begin PropInfo :=  GetPropInfo (Components[I]. ClassInfo , 'Color'); if PropInfo <> nil then SetOrdProp (Components[I], PropInfo, clRed); end; end;
Know More Than Just Name of Properties and Events ,[object Object],function IsDataAware(AComponent: TComponent): Boolean; var PropInfo: PPropInfo; begin //  檢查元件  AComponent  是否擁有  DataSource  屬性 PropInfo :=  GetPropInfo (AComponent.ClassInfo, 'DataSource'); Result := PropInfo <> nil; //  謹慎起見,檢查看看那個叫做  DataSource  屬性的型態是否為  TDataSource  或 //  其衍生類別 if Result then if not ((PropInfo^.Proptype^.Kind = tkClass) and  ( GetTypeData (PropInfo^.PropType^).ClassType. InheritsFrom (   TDataSource))) then  Result := False; end;
Examine Type Info with RTTI
RTTI on Daily Basis ,[object Object],[object Object],[object Object],[object Object],[object Object]
Streaming ,[object Object],[object Object],[object Object],[object Object],[object Object]
Streaming ,[object Object]
Streaming Elements ,[object Object],[object Object],[object Object]
Streaming Mechanism own write TWriter DFM file component TStream create WriteComponentRes function TStream.WriteComponent TStream.WriteComponentRes TStream.WriteDescent TStream.WriteDescentRes component component component component own component component component component Delphi RAD IDE / Programmer write
Multi-Appearance of Forms ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],= =
What We Can Do in Streaming Process ? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Additional Data in Stream object Form1: TForm1 ... object Timer1: TTimer Left = 264 Top = 176 end object Memo1: TMemo ... Lines.Strings = ( 'Memo1' 'Line 2' 'Line 3') end object StatusBar1: TStatusBar ... Panels = < item Width = 50 end item Bevel = pbRaised Width = 50 end item Width = 50 end> end end
Overrided TComponent.DefineProperties ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],procedure TComponent.DefineProperties(Filer: TFiler); var Ancestor: TComponent; Info: Longint; begin Info := 0; Ancestor := TComponent(Filer.Ancestor); if Ancestor <> nil then Info := Ancestor.FDesignInfo; Filer. DefineProperty ('Left', ReadLeft, WriteLeft, LongRec(FDesignInfo).Lo <> LongRec(Info).Lo); Filer. DefineProperty ('Top', ReadTop, WriteTop, LongRec(FDesignInfo).Hi <> LongRec(Info).Hi); end;
Overrided TStrings.DefineProperties ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],procedure TStrings.DefineProperties(Filer: TFiler); function DoWrite: Boolean; begin if Filer.Ancestor <> nil then begin Result := True; if Filer.Ancestor is TStrings then Result := not Equals(TStrings(Filer.Ancestor)) end else Result := Count > 0; end; begin Filer. DefineProperty ('Strings', ReadData, WriteData, DoWrite); end;
Streaming on Daily Basis ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Other Topics on Streaming ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],TComponent = class(TPersistent) published property Name: TComponentName read FName write SetName stored False; property Tag: Longint read FTag write FTag  default   0 ; end;
Messaging ,[object Object],[object Object],[object Object]
Messaging USER32.DLL Message Loop (TApplication.ProcessMessage) TObjectInstance TObjectInstance TObjectInstance TObjectInstance TObjectInstance TObjectInstance WndProc Dispatch message method 1 message method 2 message method 3 ... DefaultHandler DefWindowProc window Forms.StdWndProc MainWndProc messages post messages send / post messages TWinControl ...
Opportunities of Intercepting Messages ,[object Object],[object Object],[object Object],[object Object],[object Object],TDog = class(TWinControl) private procedure WMLButtonDown(var Message: TWMLButtonDown);  message  WM_LBUTTONDOWN; procedure WMMouseMove(var Message: TWMMouseMove);  message  WM_MOUSEMOVE; end;
Other Topics on Window and Messaging ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
多執行緒支援 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
何謂行程( process )? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
何謂執行緒( thread )? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
多執行緒程式 ,[object Object],[object Object],[object Object],[object Object]
多執行緒的優劣 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
執行緒的分類 ,[object Object],[object Object]
使用  VCL  的執行緒類別 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
使用  TThread  類別注意事項 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
最簡單的  TThread  後代類別 __fastcall TSleepThread::TSleepThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } void __fastcall TSleepThread::Execute() { Sleep(10 * 1000); } void __fastcall TForm1::Button3Click(TObject *Sender) { TSleepThread* trd = new TSleepThread(true); trd->OnTerminate = SleepThreadFinish; trd->Resume(); } void __fastcall TForm1::SleepThreadFinish(TObject *Sender) { ShowMessage(&quot;Finish&quot;); }
透過  Synchronize  方法 來使用  VCL  物件 ,[object Object],void __fastcall TCalcThread::Execute() { for (int i = 0; i < 100 && !Terminated; i++) { ... FStep++; Synchronize(UpdateProgressBar); } } void __fastcall TCalcThread::UpdateProgressBar(void) { Form1->ProgressBar1->Position = FStep; }
多執行緒隱含的陷阱- 以  TTimer  元件為例
多執行緒隱含的陷阱- 以  TTimer  元件為例 ,[object Object],[object Object],[object Object],[object Object],[object Object]
Summary ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DLL  釋名 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DLL  的重要性 ,[object Object],[object Object],[object Object],[object Object]
DLL  的重要性 ,[object Object]
檢視  DLL  提供的函式 E:INNTystem32>dumpbin /exports user32.dll Microsoft (R) COFF Binary File Dumper Version 5.00.7022 Copyright (C) Microsoft Corp 1992-1997. All rights reserved. Dump of file user32.dll File Type: DLL Section contains the following Exports for USER32.dll 0 characteristics 336A2A2A time date stamp Sat May 03 01:53:46 1997 0.00 version 1 ordinal base 634  number of functions 634  number of names ordinal hint  name 1  0  ActivateKeyboardLayout  (00015B1A) 2  1  AdjustWindowRect  (0000D704) 3  2  AdjustWindowRectEx  (00007D8E) 4  3  AnyPopup  (00043ABB) 5  4  AppendMenuA  (00011F57) 6  5  AppendMenuW  (0002D7A4)
檢視  DLL  提供的資源
DLL  的運作特徵 ,[object Object],[object Object],[object Object],[object Object]
DLL  的載入方式 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
撰寫  DLL  的大致步驟 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
DLL  函式的宣告方式 ,[object Object],[object Object],extern &quot;C&quot; {   void  _stdcall  ShowAboutBox(void); } void  _export _stdcall  ShowAboutBox(void) { ... } extern &quot;C&quot; { __declspec(dllimport)  int  _stdcall  AddInteger(int, int); } __declspec(dllimport)  int  _stdcall  AddInteger(int a,int b) { return a + b; }
DLL  函式的宣告方式 ,[object Object],#ifndef XXXDLL #define EXTERN __declspec(dllimport) //  用於應用程式 #else #define EXTERN __declspec(dllexport) //  用於  DLL #endif extern &quot;C&quot; { EXTERN int _stdcall AddInteger(int, int); } EXTERN  int  _stdcall  AddInteger(int a,int b) { return a + b; }
DLL  函式的使用方式- Implicitly Linking ,[object Object],[object Object],[object Object],[object Object],[object Object],d:CBecture>IMPLIB XXXDLL.LIB XXXDLL.DLL Borland Implib Version 3.0.8 Copyright (c) 1991, 1999 Inprise Corporation #include <xxxdll.h>
DLL  函式的使用方式- Explicitly Linking ,[object Object],[object Object],[object Object],[object Object],[object Object],int _stdcall (*AddInteger)(int, int); ShowMessage(IntToStr(AddInteger(2, 3))); HINSTANCE hInst; hInst = LoadLibrary(”e:dllxxxdll.dll&quot;); (FARPROC&)AddInteger = GetProcAddress(hInst, &quot;AddInteger&quot;); FreeLibrary(hInst);
資源檔建立方式 ,[object Object],[object Object],[object Object],[object Object],Garf BITMAP garf200.bmp STRINGTABLE  { 100, &quot;Oh Oh, I am resource string&quot; } d:cbecture>brcc32 xxxdll.rc Borland Resource Compiler  Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation.  All rights reserved.
DLL  資源宣告方式 ,[object Object],#pragma resource &quot;calcdll.res&quot;
DLL  資源使用方式 ,[object Object],[object Object],[object Object],[object Object],Image1->Picture->Bitmap-> LoadFromResourceName ((int)hInst, &quot;Garf&quot;); HINSTANCE hInst; hInst = LoadLibrary(”e:dllxxxdll.dll&quot;); char buf[256]; LoadString(hInst, 100, buf, sizeof(buf)); ShowMessage(buf);
Summary ,[object Object],[object Object],[object Object],[object Object]
COM Component Object Model
Outlines ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Why COM ? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Component ,[object Object],[object Object],single   software component   software Comp A Comp B Comp C Comp D Comp E component   software Comp A Comp B Comp C Comp D New version  of Comp E
Advantages of Using Component ,[object Object],[object Object],[object Object],component   software Proxy of Comp A Comp B Proxy of Comp C component providers Comp A network Comp C
Object Model Requirements ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
COM Specification ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
COM IS NOT ... ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Interface ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Interface (cont) ,[object Object],[object Object],[object Object],[object Object],[object Object]
QueryInterface ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Reference Counting ,[object Object],[object Object],[object Object],[object Object]
Class and Interface Naming ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Techniques based on COM ,[object Object],[object Object],[object Object],[object Object],[object Object]
Conclusions ,[object Object],[object Object],[object Object]
善用除錯工具,縮短開發時間 ,[object Object],[object Object],[object Object],[object Object]
資源保固機制 ,[object Object],[object Object],GetMem(p, 100); try ... //  儘情使用  p finally FreeMem(p); end; try ...  Exit; //  離開此  procedure  或  function finally ... //  善後工作 end;
例外處理機制 ,[object Object],[object Object],GetMem(pBuffer, 1000); if (pBuffer = nil) then begin /* error processing code here; */ end; //  取得  x,  計算  x  的倒數 if x = 0 then begin /* error processing code here; */ end;
例外處理機制 ,[object Object],[object Object],try edtTotal.Text := IntToStr( StrToInt( edtOp1.Text ) / StrToInt( edtOp2.Text ) ); except on EDivByZero do ShowMessage( ' Cannot divide by zero ' ); on EConvertError do ShowMessage( ' Error during conversion ' ); end;
例外處理機制 ,[object Object],[object Object],try if numItems = 0 then raise EDivByZero.Create( ' Cannot divide by zero ' ) // ^ throw your own exception else edtAvg.Text := FloatToStr( sum / numItems ); except edtAvg.Text := FloatToStr(0.0); raise; // <- re-throw the same exception end;
例外處理機制 ,[object Object],[object Object],EInvalidBalance = class(Exception); raise EInvalidBalance.Create( 'Invalid Number');
例外處理機制 ,[object Object],[object Object],[object Object]
Assert  程序 ,[object Object],[object Object],procedure TForm1.SetID(Id: Integer); begin Assert((id) >=  ID_MIN  and (id <=  ID_MAX )); ... //  正常處理 end; Assertion failed: test, file filename, line linenum
Assert  程序 ,[object Object],[object Object],[object Object],void __fastcall TForm1::SetID(int id) { char *p = malloc(100); assert(p != NULL); ... };
OutputDebugString  除錯字串 ,[object Object],[object Object],[object Object],[object Object]
OutputDebugString  除錯字串 ,[object Object]
系統層級除錯器- SoftICE ,[object Object]
系統層級除錯器- SoftICE ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
系統層級除錯器- SoftICE
系統層級除錯器- SoftICE
Summary ,[object Object],[object Object],[object Object]
實作與理論 ,[object Object],[object Object],[object Object]
實作與理論 ,[object Object],[object Object],它們都是實作,可是理論都在裡頭。
實作與理論 ,[object Object],[object Object]
實作與理論 ,[object Object],[object Object],[object Object],[object Object]
參考書目 -  C / C++ Programming ,[object Object],[object Object],[object Object]
參考書目-  Delphi / C++Builder ,[object Object],[object Object],[object Object],[object Object],[object Object]
參考書目 -  Windows Programming ,[object Object],[object Object],[object Object],[object Object]
參考書目-  OOA / OOD / OOP ,[object Object],[object Object],[object Object],[object Object]
參考書目-  Practical Programming  ,[object Object],[object Object],[object Object]
參考書目-  工具書 ,[object Object],[object Object]
Delphi  深度歷險 ,[object Object]
Delphi  深度論壇 ,[object Object]
Delphi  深度歷險 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
THE END 有緣再見! 陳昇瑋  ( 陳寬達 ) http://www.iis.sinica.edu.tw/~swc

More Related Content

What's hot

Kotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxKotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxtakshilkunadia
 
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所Takahiro Miyaura
 
Supporting multiple screens on android
Supporting multiple screens on androidSupporting multiple screens on android
Supporting multiple screens on androidLi SUN
 
Introduction to Skia by Ryan Chou @20141008
Introduction to Skia by Ryan Chou @20141008Introduction to Skia by Ryan Chou @20141008
Introduction to Skia by Ryan Chou @20141008Ryan Chou
 
HoloLensハンズオン:ハンドトラッキング&音声入力編
HoloLensハンズオン:ハンドトラッキング&音声入力編HoloLensハンズオン:ハンドトラッキング&音声入力編
HoloLensハンズオン:ハンドトラッキング&音声入力編Takashi Yoshinaga
 
Android animation
Android animationAndroid animation
Android animationKrazy Koder
 
Project meeting: Android Graphics Architecture Overview
Project meeting: Android Graphics Architecture OverviewProject meeting: Android Graphics Architecture Overview
Project meeting: Android Graphics Architecture OverviewYu-Hsin Hung
 
Understaing Android EGL
Understaing Android EGLUnderstaing Android EGL
Understaing Android EGLSuhan Lee
 
LCE13: Android Graphics Upstreaming
LCE13: Android Graphics UpstreamingLCE13: Android Graphics Upstreaming
LCE13: Android Graphics UpstreamingLinaro
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveAndroid graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveBin Chen
 
The Android graphics path, in depth
The Android graphics path, in depthThe Android graphics path, in depth
The Android graphics path, in depthChris Simmonds
 
Inside Android's UI
Inside Android's UIInside Android's UI
Inside Android's UIOpersys inc.
 
Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Gerke Max Preussner
 
#MRDevDaysJP HoloLens 2 アプリ開発入門
#MRDevDaysJP HoloLens 2 アプリ開発入門#MRDevDaysJP HoloLens 2 アプリ開発入門
#MRDevDaysJP HoloLens 2 アプリ開発入門Madoka Chiyoda
 
LOD and Culling Systems That Scale - Unite LA
LOD and Culling Systems That Scale  - Unite LALOD and Culling Systems That Scale  - Unite LA
LOD and Culling Systems That Scale - Unite LAUnity Technologies
 
Android Components & Manifest
Android Components & ManifestAndroid Components & Manifest
Android Components & Manifestma-polimi
 

What's hot (20)

Kotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptxKotlin Basics & Introduction to Jetpack Compose.pptx
Kotlin Basics & Introduction to Jetpack Compose.pptx
 
UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所UnityによるHoloLens用UWPアプリケーション開発の勘所
UnityによるHoloLens用UWPアプリケーション開発の勘所
 
Supporting multiple screens on android
Supporting multiple screens on androidSupporting multiple screens on android
Supporting multiple screens on android
 
Introduction to Skia by Ryan Chou @20141008
Introduction to Skia by Ryan Chou @20141008Introduction to Skia by Ryan Chou @20141008
Introduction to Skia by Ryan Chou @20141008
 
HoloLensハンズオン:ハンドトラッキング&音声入力編
HoloLensハンズオン:ハンドトラッキング&音声入力編HoloLensハンズオン:ハンドトラッキング&音声入力編
HoloLensハンズオン:ハンドトラッキング&音声入力編
 
Android animation
Android animationAndroid animation
Android animation
 
Project meeting: Android Graphics Architecture Overview
Project meeting: Android Graphics Architecture OverviewProject meeting: Android Graphics Architecture Overview
Project meeting: Android Graphics Architecture Overview
 
Android UI
Android UIAndroid UI
Android UI
 
Introduction to Android Window System
Introduction to Android Window SystemIntroduction to Android Window System
Introduction to Android Window System
 
Understaing Android EGL
Understaing Android EGLUnderstaing Android EGL
Understaing Android EGL
 
LCE13: Android Graphics Upstreaming
LCE13: Android Graphics UpstreamingLCE13: Android Graphics Upstreaming
LCE13: Android Graphics Upstreaming
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspectiveAndroid graphic system (SurfaceFlinger) : Design Pattern's perspective
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
 
The Android graphics path, in depth
The Android graphics path, in depthThe Android graphics path, in depth
The Android graphics path, in depth
 
OpenCL 3.0 Reference Guide
OpenCL 3.0 Reference GuideOpenCL 3.0 Reference Guide
OpenCL 3.0 Reference Guide
 
Inside Android's UI
Inside Android's UIInside Android's UI
Inside Android's UI
 
Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4Plug-ins & Third-Party SDKs in UE4
Plug-ins & Third-Party SDKs in UE4
 
#MRDevDaysJP HoloLens 2 アプリ開発入門
#MRDevDaysJP HoloLens 2 アプリ開発入門#MRDevDaysJP HoloLens 2 アプリ開発入門
#MRDevDaysJP HoloLens 2 アプリ開発入門
 
LOD and Culling Systems That Scale - Unite LA
LOD and Culling Systems That Scale  - Unite LALOD and Culling Systems That Scale  - Unite LA
LOD and Culling Systems That Scale - Unite LA
 
Android Components & Manifest
Android Components & ManifestAndroid Components & Manifest
Android Components & Manifest
 
Android Widget
Android WidgetAndroid Widget
Android Widget
 

Viewers also liked

網路購書大數據– 給出版者的洞察分析
網路購書大數據– 給出版者的洞察分析網路購書大數據– 給出版者的洞察分析
網路購書大數據– 給出版者的洞察分析Sheng-Wei (Kuan-Ta) Chen
 
971230建築能源管理(bems)節能手冊
971230建築能源管理(bems)節能手冊971230建築能源管理(bems)節能手冊
971230建築能源管理(bems)節能手冊jbcinvest
 
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop YKLee3434
 
Image and image component 影像與影像元件
Image and image component 影像與影像元件Image and image component 影像與影像元件
Image and image component 影像與影像元件YKLee3434
 
20150911 [社團事務] 跑酷社創社審查
20150911 [社團事務] 跑酷社創社審查20150911 [社團事務] 跑酷社創社審查
20150911 [社團事務] 跑酷社創社審查羅左欣
 
從鍵盤走向社會 @KCG
從鍵盤走向社會 @KCG從鍵盤走向社會 @KCG
從鍵盤走向社會 @KCGHsiao-hsien Yang
 
20160802 那些年,關於大學的那些事...
20160802 那些年,關於大學的那些事...20160802 那些年,關於大學的那些事...
20160802 那些年,關於大學的那些事...羅左欣
 
20161211 給社團人的一封信
20161211 給社團人的一封信20161211 給社團人的一封信
20161211 給社團人的一封信羅左欣
 
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作羅左欣
 
Research Skills I Learned in UIUC from Pi-Cheng Hsiu
Research Skills I Learned in UIUC from Pi-Cheng HsiuResearch Skills I Learned in UIUC from Pi-Cheng Hsiu
Research Skills I Learned in UIUC from Pi-Cheng HsiuSheng-Wei (Kuan-Ta) Chen
 
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...Sheng-Wei (Kuan-Ta) Chen
 
資料科學家未曾公開之資安研究事件簿
資料科學家未曾公開之資安研究事件簿資料科學家未曾公開之資安研究事件簿
資料科學家未曾公開之資安研究事件簿Sheng-Wei (Kuan-Ta) Chen
 
20160829 夢想,Loading...
20160829 夢想,Loading...20160829 夢想,Loading...
20160829 夢想,Loading...羅左欣
 

Viewers also liked (20)

一位程式人 PI 在中研院
一位程式人 PI 在中研院一位程式人 PI 在中研院
一位程式人 PI 在中研院
 
網路購書大數據– 給出版者的洞察分析
網路購書大數據– 給出版者的洞察分析網路購書大數據– 給出版者的洞察分析
網路購書大數據– 給出版者的洞察分析
 
971230建築能源管理(bems)節能手冊
971230建築能源管理(bems)節能手冊971230建築能源管理(bems)節能手冊
971230建築能源管理(bems)節能手冊
 
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop
Photoshop 的色階與曲線調整 Levels and curve Adjustment in Photoshop
 
Image and image component 影像與影像元件
Image and image component 影像與影像元件Image and image component 影像與影像元件
Image and image component 影像與影像元件
 
線上遊戲與雲端運算
線上遊戲與雲端運算線上遊戲與雲端運算
線上遊戲與雲端運算
 
20150911 [社團事務] 跑酷社創社審查
20150911 [社團事務] 跑酷社創社審查20150911 [社團事務] 跑酷社創社審查
20150911 [社團事務] 跑酷社創社審查
 
從鍵盤走向社會 @KCG
從鍵盤走向社會 @KCG從鍵盤走向社會 @KCG
從鍵盤走向社會 @KCG
 
Web 2.0世代的資安議題
Web 2.0世代的資安議題Web 2.0世代的資安議題
Web 2.0世代的資安議題
 
20160802 那些年,關於大學的那些事...
20160802 那些年,關於大學的那些事...20160802 那些年,關於大學的那些事...
20160802 那些年,關於大學的那些事...
 
20161211 給社團人的一封信
20161211 給社團人的一封信20161211 給社團人的一封信
20161211 給社團人的一封信
 
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作
20150104各類型社團文件的製作,上傳以及活動舉辦的說明與操作
 
Research Skills I Learned in UIUC from Pi-Cheng Hsiu
Research Skills I Learned in UIUC from Pi-Cheng HsiuResearch Skills I Learned in UIUC from Pi-Cheng Hsiu
Research Skills I Learned in UIUC from Pi-Cheng Hsiu
 
Inside VCL
Inside VCLInside VCL
Inside VCL
 
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...
Crowdsourcing beyond Mechanical Turk: Building Crowdmining Services for Your ...
 
資料科學家未曾公開之資安研究事件簿
資料科學家未曾公開之資安研究事件簿資料科學家未曾公開之資安研究事件簿
資料科學家未曾公開之資安研究事件簿
 
20160829 夢想,Loading...
20160829 夢想,Loading...20160829 夢想,Loading...
20160829 夢想,Loading...
 
Network and Multimedia QoE Management
Network and Multimedia QoE ManagementNetwork and Multimedia QoE Management
Network and Multimedia QoE Management
 
一位年輕探索者的建議
一位年輕探索者的建議一位年輕探索者的建議
一位年輕探索者的建議
 
當學術研究者遇見線上遊戲
當學術研究者遇見線上遊戲當學術研究者遇見線上遊戲
當學術研究者遇見線上遊戲
 

Similar to Borland C++Builder 進階課程

Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Liyao Chen
 
教學投影片01_Vb2005
教學投影片01_Vb2005教學投影片01_Vb2005
教學投影片01_Vb2005洋夫 葉
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式Will Huang
 
Windows Mobile 多媒體應用程式開發
Windows Mobile 多媒體應用程式開發Windows Mobile 多媒體應用程式開發
Windows Mobile 多媒體應用程式開發Chui-Wen Chiu
 
OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定菌 細
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点Bin Shao
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
 
Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Chui-Wen Chiu
 
Hcsm lect-20120913
Hcsm lect-20120913Hcsm lect-20120913
Hcsm lect-20120913lusecheng
 
分布式应用程序设计利器-ice
分布式应用程序设计利器-ice分布式应用程序设计利器-ice
分布式应用程序设计利器-iceTony Deng
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Gelis Wu
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Chui-Wen Chiu
 
Android -汇博
Android -汇博Android -汇博
Android -汇博dlqingxi
 

Similar to Borland C++Builder 進階課程 (20)

Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享Windows 8 apps dev.整理及分享
Windows 8 apps dev.整理及分享
 
C+
C+C+
C+
 
C#
C#C#
C#
 
教學投影片01_Vb2005
教學投影片01_Vb2005教學投影片01_Vb2005
教學投影片01_Vb2005
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
 
Windows Mobile 多媒體應用程式開發
Windows Mobile 多媒體應用程式開發Windows Mobile 多媒體應用程式開發
Windows Mobile 多媒體應用程式開發
 
OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定OpenCV 2.4.2在codeblocks 10.05的環境設定
OpenCV 2.4.2在codeblocks 10.05的環境設定
 
深入理解Andorid重难点
深入理解Andorid重难点深入理解Andorid重难点
深入理解Andorid重难点
 
N bear
N bearN bear
N bear
 
LLVM introduction
LLVM introductionLLVM introduction
LLVM introduction
 
Ch01
Ch01Ch01
Ch01
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
Android JNI
Android JNIAndroid JNI
Android JNI
 
Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門Windows Mobile 6 程式開發入門
Windows Mobile 6 程式開發入門
 
C++
C++C++
C++
 
Hcsm lect-20120913
Hcsm lect-20120913Hcsm lect-20120913
Hcsm lect-20120913
 
分布式应用程序设计利器-ice
分布式应用程序设计利器-ice分布式应用程序设计利器-ice
分布式应用程序设计利器-ice
 
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
Visual studio 2012 與 asp.net 4.5 (新功能與開發介紹) 第一天
 
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招Silverlight 2.0 完全新手學堂,基礎入門 10 大招
Silverlight 2.0 完全新手學堂,基礎入門 10 大招
 
Android -汇博
Android -汇博Android -汇博
Android -汇博
 

More from Sheng-Wei (Kuan-Ta) Chen

人工智慧在台灣: 產業轉型的契機與挑戰
人工智慧在台灣: 產業轉型的契機與挑戰人工智慧在台灣: 產業轉型的契機與挑戰
人工智慧在台灣: 產業轉型的契機與挑戰Sheng-Wei (Kuan-Ta) Chen
 
從 Project Theta 到台灣人工智慧學校
從 Project Theta 到台灣人工智慧學校從 Project Theta 到台灣人工智慧學校
從 Project Theta 到台灣人工智慧學校Sheng-Wei (Kuan-Ta) Chen
 
資料科學如何幫我們更瞭解捐款人?
資料科學如何幫我們更瞭解捐款人?資料科學如何幫我們更瞭解捐款人?
資料科學如何幫我們更瞭解捐款人?Sheng-Wei (Kuan-Ta) Chen
 
計算社會科學初探- 當電腦科學家遇上社會科學
計算社會科學初探-當電腦科學家遇上社會科學計算社會科學初探-當電腦科學家遇上社會科學
計算社會科學初探- 當電腦科學家遇上社會科學Sheng-Wei (Kuan-Ta) Chen
 

More from Sheng-Wei (Kuan-Ta) Chen (7)

人工智慧在台灣: 產業轉型的契機與挑戰
人工智慧在台灣: 產業轉型的契機與挑戰人工智慧在台灣: 產業轉型的契機與挑戰
人工智慧在台灣: 產業轉型的契機與挑戰
 
台灣人工智慧學校介紹
台灣人工智慧學校介紹台灣人工智慧學校介紹
台灣人工智慧學校介紹
 
聰明公益資訊平台
聰明公益資訊平台聰明公益資訊平台
聰明公益資訊平台
 
從 Project Theta 到台灣人工智慧學校
從 Project Theta 到台灣人工智慧學校從 Project Theta 到台灣人工智慧學校
從 Project Theta 到台灣人工智慧學校
 
從大數據走向人工智慧
從大數據走向人工智慧從大數據走向人工智慧
從大數據走向人工智慧
 
資料科學如何幫我們更瞭解捐款人?
資料科學如何幫我們更瞭解捐款人?資料科學如何幫我們更瞭解捐款人?
資料科學如何幫我們更瞭解捐款人?
 
計算社會科學初探- 當電腦科學家遇上社會科學
計算社會科學初探-當電腦科學家遇上社會科學計算社會科學初探-當電腦科學家遇上社會科學
計算社會科學初探- 當電腦科學家遇上社會科學
 

Recently uploaded

educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxmekosin001123
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxmekosin001123
 
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书jakepaige317
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制jakepaige317
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...黑客 接单【TG/微信qoqoqdqd】
 
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxmekosin001123
 

Recently uploaded (6)

educ6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptxeduc6506presentationtc3302771-240427173057-06a46de5.pptx
educ6506presentationtc3302771-240427173057-06a46de5.pptx
 
EDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptxEDUC6506_ClassPresentation_TC330277 (1).pptx
EDUC6506_ClassPresentation_TC330277 (1).pptx
 
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
泽兰应用科学大学毕业证制作/定制国外大学录取通知书/购买一个假的建国科技大学硕士学位证书
 
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
哪里可以购买日本筑波学院大学学位记/做个假的文凭可认证吗/仿制日本大学毕业证/意大利语CELI证书定制
 
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
1.🎉“入侵大学入学考试中心修改成绩”来袭!ALEVEL替考大揭秘,轻松搞定考试成绩! 💥你还在为无法进入大学招生系统而烦恼吗?想知道如何通过技术手段更改...
 
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptxEDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
EDUC6506(001)_ClassPresentation_2_TC330277 (1).pptx
 

Borland C++Builder 進階課程

  • 1. 陳昇瑋 ( 陳寬達 ) 中央研究院 資訊科學研究所 Borland C++Builder 進階課程
  • 2.
  • 3.
  • 4. 獨立的 4GB 位址空間- Windows 95/98 架構 0xFFFFFFFF ~ 0xC0000000 1 GB 區域。用於 VxD 、記憶體管理、系統程式碼,所有 Win32 處理程序共享。 0xBFFFFFFF ~ 0x80000000 1 GB 區域。用於記憶體對映檔案及 Win32 DLL ,所有 Win32 程序共享。 0x7FFFFFFF ~ 0x00400000 2143289344 位元組,約 2044 MB ,每個 Win32 處理程序私有區域。 0x003FFFFF ~ 0x00001000 4190208 位元組,約 4 MB ,放置 DOS 及 Win16 應用程式。 0x00000FFF ~ 0x00000000 4096 位元組,用於偵測不合法指標。
  • 5. 獨立的 4GB 位址空間- Windows NT 架構 2 GB 區域。用於作業系統、核心程式及驅動程式,應用程式無法存取。 0xFFFFFFFF ~ 0x80000000 0x7FFEFFFF ~ 0x00010000 2147352576 位元組,約 2047 MB ,每個 Win32 處理程序私有區域。 0x0000FFFF ~ 0x00000000 64 KB 區域。用於偵測不合法指標。 0x7FFFFFFF ~ 0x7FFF0000 64 KB 區域。用於偵測不合法指標。
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16. 檢視 DLL 提供的函式 E:INNTystem32>dumpbin /exports user32.dll Microsoft (R) COFF Binary File Dumper Version 5.00.7022 Copyright (C) Microsoft Corp 1992-1997. All rights reserved. Dump of file user32.dll File Type: DLL Section contains the following Exports for USER32.dll 0 characteristics 336A2A2A time date stamp Sat May 03 01:53:46 1997 0.00 version 1 ordinal base 634 number of functions 634 number of names ordinal hint name 1 0 ActivateKeyboardLayout (00015B1A) 2 1 AdjustWindowRect (0000D704) 3 2 AdjustWindowRectEx (00007D8E) 4 3 AnyPopup (00043ABB) 5 4 AppendMenuA (00011F57) 6 5 AppendMenuW (0002D7A4)
  • 17. 檢視 DLL 提供的資源
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26. 訊息處理機制 USER32.DLL 訊息迴圈 視窗函式 messages post messages send / post messages while ( GetMessage (&Msg, NULL, NULL, NULL)) { TranslateMessage (Msg); DispatchMessage (Msg); } switch (Msg.Message) { // 視窗建立時 case WM_CREATE: ... // 按下滑鼠左鍵 case WM_LBUTTONDOWN: ... // 按下按鍵時 case WM_KEYDOWN: ... // 關閉視窗時 case WM_CLOSE: ... } DefWindowProc(..)
  • 27.
  • 28. 行程、執行緒、訊息佇列及 訊息迴圈 行程 執行緒 訊息佇列 程式碼 視窗 C 視窗函式 訊息迴圈 視窗 C 視窗 D 視窗 D 視窗函式 取出 分派 執行緒 訊息佇列 程式碼 視窗 A 視窗函式 訊息迴圈 視窗 A 視窗 B 視窗 B 視窗函式 取出 分派 工作執行緒 程式碼
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71. VCL 的 Run-Time Package 面貌
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100. VCL RAD 支援類別
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134. Examine Type Info with RTTI
  • 135.
  • 136.
  • 137.
  • 138.
  • 139. Streaming Mechanism own write TWriter DFM file component TStream create WriteComponentRes function TStream.WriteComponent TStream.WriteComponentRes TStream.WriteDescent TStream.WriteDescentRes component component component component own component component component component Delphi RAD IDE / Programmer write
  • 140.
  • 141.
  • 142. Additional Data in Stream object Form1: TForm1 ... object Timer1: TTimer Left = 264 Top = 176 end object Memo1: TMemo ... Lines.Strings = ( 'Memo1' 'Line 2' 'Line 3') end object StatusBar1: TStatusBar ... Panels = < item Width = 50 end item Bevel = pbRaised Width = 50 end item Width = 50 end> end end
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148. Messaging USER32.DLL Message Loop (TApplication.ProcessMessage) TObjectInstance TObjectInstance TObjectInstance TObjectInstance TObjectInstance TObjectInstance WndProc Dispatch message method 1 message method 2 message method 3 ... DefaultHandler DefWindowProc window Forms.StdWndProc MainWndProc messages post messages send / post messages TWinControl ...
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160. 最簡單的 TThread 後代類別 __fastcall TSleepThread::TSleepThread(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } void __fastcall TSleepThread::Execute() { Sleep(10 * 1000); } void __fastcall TForm1::Button3Click(TObject *Sender) { TSleepThread* trd = new TSleepThread(true); trd->OnTerminate = SleepThreadFinish; trd->Resume(); } void __fastcall TForm1::SleepThreadFinish(TObject *Sender) { ShowMessage(&quot;Finish&quot;); }
  • 161.
  • 162. 多執行緒隱含的陷阱- 以 TTimer 元件為例
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168. 檢視 DLL 提供的函式 E:INNTystem32>dumpbin /exports user32.dll Microsoft (R) COFF Binary File Dumper Version 5.00.7022 Copyright (C) Microsoft Corp 1992-1997. All rights reserved. Dump of file user32.dll File Type: DLL Section contains the following Exports for USER32.dll 0 characteristics 336A2A2A time date stamp Sat May 03 01:53:46 1997 0.00 version 1 ordinal base 634 number of functions 634 number of names ordinal hint name 1 0 ActivateKeyboardLayout (00015B1A) 2 1 AdjustWindowRect (0000D704) 3 2 AdjustWindowRectEx (00007D8E) 4 3 AnyPopup (00043ABB) 5 4 AppendMenuA (00011F57) 6 5 AppendMenuW (0002D7A4)
  • 169. 檢視 DLL 提供的資源
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225. THE END 有緣再見! 陳昇瑋 ( 陳寬達 ) http://www.iis.sinica.edu.tw/~swc