亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lc_bcb_105.txt

?? c++ builder 的一些txt文檔
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
              表10.2    Loadlibrary返回錯誤代碼的意義 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    錯誤代碼         意        義 
-------------------------------------- 
     0        系統內存不夠,可執行文件被破壞或調用非法 
     2        文件沒有被發現 
     3        路徑沒有被發現 
     5        企圖動態鏈接一個任務或者有一個共享或網絡保護錯 
     6        庫需要為每個任務建立分離的數據段 
     8        沒有足夠的內存啟動應用程序 
     10         Windows版本不正確 
    11        可執行文件非法?;蛘卟皇荳indows應用程序,或者在.EXE映 
                     像中有錯誤 
    12        應用程序為一個不同的操作系統設計(如OS/2程序) 
       13        應用程序為MS DOS4.0設計 
    14        可執行文件的類型不知道 
    15        試圖裝載一個實模式應用程序(為早期Windows版本設計) 
       16        試圖裝載包含可寫的多個數據段的可執行文件的第二個實例 
    19        試圖裝載一個壓縮的可執行文件。文件必須被解壓后才能被裝裁 
    20        動態鏈接庫文件非法 
    21        應用程序需要32位擴展 
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   
 
  假如在應用程序用Loadlibrary調用某一模塊前,其它應用程序已把該模塊裝入內存,則Loadlibrary并不會裝載該模塊的另一實例,而是使該模塊的"引用計數"加1。 
 
  2.GetProcAddress:撿取給定模塊中函數的地址 
  語法為: 
 
  function GetProcAddress(Module: THandle; ProcName: PChar): TFarProc; 
 
    Module包含被調用的函數庫模塊的句柄,這個值由Loadlibrary返回。如果把Module設置為nil,則表示要引用當前模塊。 
  ProcName是指向含有函數名的以nil結尾的字符串的指針,或者也可以是函數的次序值。如果ProcName參數是次序值,則如果該次序值的函數在模塊中并不存在時,GetProcAddress仍返回一個非nil的值。這將引起混亂。因此大部分情況下用函數名是一種更好的選擇。如果用函數名,則
 
函數名的拼寫必須與動態鏈接庫文件EXPORTS節中的對應拼寫相一致。 
  如果GetProcAddress執行成功,則返回模塊中函數入口處的地址,否則返回nil。 
    
    3.Freelibrary:從內存中移出庫模塊 
  語法為: 
 
  procedure Freelibrary(Module : THandle); 
 
    Module為庫模塊的句柄。這個值由Loadlibrary返回。 
  由于庫模塊在內存中只裝載一次,因而調用Freelibrary首先使庫模塊的引用計數減一。如果引用計數減為0,則卸出該模塊。 
  每調用一次Loadlibrary就應調用一次FreeLibray,以保證不會有多余的庫模塊在應用程序結束后仍留在內存中。 
 
10.2.4.2 動態調用舉例 
 
  對于動態調用,我們舉了如下的一個簡單例子。系統一共包含兩個編輯框。在第一個編輯框中輸入一個字符串,而后在第二個編輯框中輸入字符。如果該字符包含在第一個編輯框的字符串中,則標簽框顯示信息:"位于第n位。",否則顯示信息:"不包含這個字符。"。如圖是程序的運 
行界面。 
 
            
 
                        圖10.1  DLL動態調用實例運行界面 
 
  輸入檢查功能的實現在Edit2的OnKeyPress事件處理過程中,程序清單如下。 
 
        procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); 
        var 
          order: Integer; 
          txt: PChar; 
          PFunc: TFarProc; 
          Moudle: THandle; 
        begin 
          Moudle := Loadlibrary('c:\dlls\example.dll'); 
          if Moudle > 32 then 
          begin 
            Edit2.text := ''; 
            Pfunc := GetProcAddress(Moudle,'Instr'); 
            txt := StrAlloc(80); 
            txt := StrPCopy(txt,Edit1.text); 
            Order := TInstr(PFunc)(txt,Key); 
            if Order = -1 then 
              Label1.Caption := '不包含這個字符 ' 
            else 
               Label1.Caption := '位于第'+IntToStr(Order+1)+'位'; 
          end; 
          Freelibrary(Moudle); 
        end; 
 
  在利用GetProcAddess返回的函數指針時,必須進行強制類型轉換: 
 
        Order := TInstr(PFunc)(text,Key); 
 
  TInStr是一個定義好了的函數類型: 
 
        type 
          TInStr = function(Source: PChar;Check: Char): Integer; 
 
10.3  利用DLLs實現數據傳輸 
 
10.3.1 DLLs中的全局內存 
 
  Windows規定:DLLs并不擁有它打開的任何文件或它分配的任何全局內存塊。這些對象由直接或間接調用DLLs的應用程序擁有。這樣,當應用程序中止時,它擁有的打開的文件自動關閉,它擁有的全局內存塊自動釋放。這就意味著保存在DLLs全局變量中的文件和全局內存塊變量在DLLs 
沒有被通知的情況下就變為非法。這將給其它使用該DLLs的應用程序造成困難。 
  為了避免出現這種情況,文件和全局內存塊句柄不應作為DLLs的全局變量,而是作為DLLs中過程或函數的參數傳遞給DLLs使用。調用DLLs的應用程序應該負責對它們的維護。 
  但在特定情況下,DLLs也可以擁有自己的全局內存塊。這些內存塊必須用gmem_DDEShare屬性進行分配。這樣的內存塊直到被DLLs顯示釋放或DLLs退出時都保持有效。 
  由DLLs管理的全局內存塊是應用程序間進行數據傳輸的又一途徑,下面我們將專門討論這一問題。 
 
10.3.2 利用DLLs實現應用程序間的數據傳輸 
 
  利用DLLs實現應用程序間的數據傳輸的步驟為: 
  1. 編寫一個DLLs程序,其中擁有一個用gmem_DDEShare屬性分配的全局內存塊; 
  2. 服務器程序調用DLLs,向全局內存塊寫入數據; 
  3. 客戶程序調用DLLs,從全局內存塊讀取數據。 
 
10.3.2.1        用于實現數據傳輸的DLLs的編寫 
 
  用于實現數據傳輸的DLLs與一般DLLs的編寫基本相同,其中特別的地方是: 
  1. 定義一個全局變量句柄: 
 
        var 
          hMem: THandle; 
 
  2. 定義一個過程,返回該全局變量的句柄。該過程要包含在exports子句中。如: 
 
        function GetGlobalMem: THandle; export; 
        begin 
          Result := hMem; 
        end; 
         
  3. 在初始化代碼中分配全局內存塊: 
         
        程序清單如下: 
 
        begin 
          hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDEShare,num); 
          if hMem = 0 then 
             MessageDlg('Could not allocate memory',mtWarning,[mbOK],0); 
        end. 
 
  num是一個預定義的常數。 
    Windows API函數GlobalAlloc用于從全局內存堆中分配一塊內存,并返回該內存塊的句柄。該函數包括兩個參數,第一個參數用于設置內存塊的分配標志。可以使用的分配標志如下表所示。 
                        表10.3  全局內存塊的分配標志 
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
                標      志                              意      義 
  --------------------------------- 
        gmem_DDEShare           分配可由應用程序共享的內存 
        gmem_Discardable                分配可拋棄的內存(只與gmem_Moveable連用) 
        gmem_Fixed                      分配固定內存 
        gmem_Moveable           分配可移動的內存 
        gmem_Nocompact          該全局堆中的內存不能被壓縮或拋棄 
        gmem_Nodiscard          該全局堆中的內存不能被拋棄 
        gmem_NOT_Banked 分配不能被分段的內存 
        gmem_Notify                     通知功能。當該內存被拋棄時調用GlobalNotify函數 
        gmem_Zeroinit           將所分配內存塊的內容初始化為零 
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
 
  有兩個預定義的常用組合是: 
 
    GHND  =  gmem_Moveable and gmem_Zeroinit 
    GPTK  =  gmem_Fixed and gmem_Zeroinit 
 
  第二個參數用于設置欲分配的字節數。分配的字節數必須是32的倍數,因而實際分配的字節數可能比所設置的要大。 
  由于用gmem_DDEShare分配的內存在分配內存的模塊終止時自動拋棄,因而不必調用GlobalFree顯式釋放內存。 
 
10.3.2.2        服務器程序的編寫 
 
  服務器程序必須包含對DLL的調用代碼,如: 
 
        function GetGlobalMem: THandle; far; external 'c:\dlls\glbmem'; 
 
  通過調用該函數,服務器可以獲得全局內存塊的句柄。 
  在寫入數據前,服務器必須鎖定全局內存,以避免在寫入過程中Windows移動該內存塊的位置。 
  函數GlobalLock鎖定全局內存并返回指向該內存塊的指針: 
 
        pMem := GlobalLock(hMem); 
 
  對pMem的任何修改都會反映到全局內存塊中。 
  對內存塊進行操作后,調用GlobalUnLock進行解鎖。內存塊操作之后盡早解鎖,有利于Windows充分利用內存資源。 
  服務器寫入數據的實現代碼如下。 
 
        var 
          hMem: THandle; 
          pMem: PChar; 
        begin 
          hMem := GetGlobalMem;             {獲得全局內存塊的句柄} 
          if hMem <> 0 then 
          begin 
            pMem := GlobalLock(hMem);    {加鎖全局內存塊} 
            if pMem <> nil then 
            begin 
              StrPCopy(pMem,Memo1.text);  {向全局內存塊寫入數據} 
              GlobalUnlock(hMem);         {解鎖全局內存塊}  
            end 
            else 
              MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0); 
          end; 
 
10.3.2.3        客戶程序的編寫 
 
  客戶程序幾乎是服務器程序的翻版。唯一的區別在于一個是寫入數據,一個是下載數據。 
        下面是客戶從全局內存塊下載數據的程序清單。 
 
        var 
          hMem: THandle; 
          pMem: PChar; 
        begin 
          hMem := GetGlobalMem;          {獲得全局內存塊的句柄} 
          if hMem <> 0 then 
          begin 
            pMem := GlobalLock(hMem);    {加鎖全局內存塊} 
            if pMem <> nil then 
            begin 
              Memo1.text := StrPas(pMem);  {從全局內存塊讀取數據} 
              GlobalUnlock(hMem);         {解鎖全局內存塊} 
            end 
            else 
              MessageDlg('Couldnot Lock memory block',mtWarning,[mbOK],0); 
          end; 
         
  服務器程序和客戶程序同時運行后的屏幕顯示如下圖所示。 
  
 
                        圖10.2  利用DLLs實現數據傳輸的屏幕顯示 
 
10.4  利用DLLs實現窗體重用 
 
  實現窗體重用是Delphi DLLs功能中一個引人注目的特色。當你創建了一個令自己滿意的通用窗體并希望能在不同應用程序中使用,特別是希望能在非Delphi 應用程序中使用時,把窗體做進一個動態鏈接庫中是最適當的。這樣即使用其它工具開發的應用程序,如C++、Visual  
Basic等,也都可以去調用它。 
  包含窗體的DLLs有100K左右的部件庫(Component Library)開銷。可以通過把幾個窗體編譯成一個DLLs來最小化這筆開銷。DLl中的不同窗體可以共享部件庫。 
 
10.4.1 利用DLLs實現窗體重用的一般步驟 
 
  利用DLLs實現窗體重用的步驟是: 
  1.在集成開發環境(IDE)中,按自己的需要設計一個窗體; 
  2.編寫一個用于輸出的函數或過程。在該函數或過程中,設計的窗體被實例化; 
  3.重復步驟1、2,直到完成所有重用窗體的設計; 
  4.打開工程文件,進行修改,以適應生成 .dll文件的需要: 
  (1).把保留字program設為library; 
  (2).從uses子句中去掉Forms單元; 
  (3).移去begin,end之間的所有代碼; 
  (4).在uses子句下,begin…end塊之前,添加保留字exprots。exports 后是輸出函數名或過程名。 
  5.編譯生成DLLs文件; 
  6.在其它應用程序中調用重用窗體。 
  重用窗體的調用同一般DLLs函數或過程的調用完全一致,不再贅述。讀者可參看下面的例子。 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人久久精品77777最新版本| 日本三级亚洲精品| 26uuu色噜噜精品一区二区| 欧美日韩精品一二三区| 欧美性色黄大片手机版| 成人小视频在线| 日韩高清国产一区在线| 国产精品一区二区三区四区| 成人激情免费网站| 欧美亚洲动漫精品| 91.com在线观看| 国产精品伦理在线| 亚洲成人一区在线| 国产一区二区三区黄视频| 欧美在线你懂的| 国产日韩欧美精品电影三级在线| 亚洲自拍偷拍图区| 韩国欧美一区二区| 欧美精品亚洲一区二区在线播放| 国产女主播在线一区二区| 日日摸夜夜添夜夜添亚洲女人| 成人午夜激情视频| 欧美va亚洲va国产综合| 亚洲猫色日本管| 91性感美女视频| 国产精品人妖ts系列视频| 精品一二线国产| 久久免费午夜影院| 国产精品一区二区在线看| 欧美成人福利视频| 国产成人精品亚洲午夜麻豆| 欧美白人最猛性xxxxx69交| 亚洲成av人片www| 欧美少妇一区二区| 午夜免费久久看| 精品欧美乱码久久久久久1区2区| 美女视频网站黄色亚洲| 久久久久久久久久久久电影 | 成人h精品动漫一区二区三区| 久久久久久免费网| av一区二区三区四区| 亚洲女同女同女同女同女同69| 欧美色综合影院| 国产一区二区三区在线观看免费视频| 久久网这里都是精品| 97精品电影院| 国产美女一区二区三区| 亚洲视频1区2区| 日韩女优制服丝袜电影| www.色综合.com| 精品一二三四在线| 亚洲第一二三四区| 欧美吻胸吃奶大尺度电影| 蜜桃久久精品一区二区| 亚洲免费在线看| 久久综合久久99| 日韩一区二区在线看| 北岛玲一区二区三区四区 | 国产精品国产三级国产aⅴ无密码| 欧美揉bbbbb揉bbbbb| 亚洲欧美日韩中文字幕一区二区三区 | 欧美人牲a欧美精品| 一本大道久久a久久综合婷婷| 狠狠色丁香婷综合久久| 免费国产亚洲视频| 蜜臀av性久久久久蜜臀aⅴ流畅 | 久久精品免视看| 久久综合狠狠综合久久激情| 日韩无一区二区| 欧美一区二区久久久| 日韩你懂的在线观看| 国产精品精品国产色婷婷| 99久久精品国产毛片| 国产精品一区二区三区99| 国产精品久久久久一区二区三区共| 国产.欧美.日韩| 中文字幕视频一区| 日韩欧美不卡一区| 日韩三级.com| 97成人超碰视| 欧美网站一区二区| 在线亚洲人成电影网站色www| 国产在线视频一区二区| 色综合久久中文字幕综合网| 成人网在线播放| 色婷婷久久99综合精品jk白丝| 成人ar影院免费观看视频| 99久久精品免费观看| 日韩一区二区三区免费观看| 久久久久久久久久久久久久久99 | 国产精品综合二区| 99久久精品费精品国产一区二区| 99精品偷自拍| 欧美主播一区二区三区| 91精品国产全国免费观看 | 在线成人免费视频| 国产欧美va欧美不卡在线| 天堂在线一区二区| 成人av影视在线观看| 337p亚洲精品色噜噜噜| 久久综合久久综合亚洲| 亚洲午夜久久久| 一本一道综合狠狠老| 国产香蕉久久精品综合网| 一区二区三区视频在线看| 久久99国产精品尤物| 欧美在线看片a免费观看| 日本一区二区三区高清不卡| 国内成人免费视频| 日韩一区二区在线观看视频| 怡红院av一区二区三区| 91蜜桃视频在线| 亚洲大片一区二区三区| 一本色道久久综合精品竹菊| 亚洲欧美精品午睡沙发| 99热在这里有精品免费| 亚洲欧美另类小说| 日韩欧美一区在线观看| 日韩中文字幕区一区有砖一区 | eeuss鲁一区二区三区| 国产精品电影一区二区| 91国产视频在线观看| 亚洲一二三专区| 日韩西西人体444www| www.亚洲色图| 亚洲一卡二卡三卡四卡五卡| 欧美性感一类影片在线播放| 亚洲va韩国va欧美va| 日韩视频在线永久播放| 国产精品白丝av| 一区二区三区在线高清| 欧美日韩国产高清一区二区三区 | 99精品视频在线播放观看| 日本不卡视频在线| 国产精品美女一区二区在线观看| 6080午夜不卡| 99视频有精品| 高清不卡在线观看| 国产成a人亚洲| 久久99国产精品成人| 最好看的中文字幕久久| 337p粉嫩大胆色噜噜噜噜亚洲| 在线观看日韩av先锋影音电影院| 国产一区二区在线影院| 亚洲bt欧美bt精品| 亚洲免费成人av| 国产精品久久久99| 国产精品精品国产色婷婷| 久久久久国产精品人| 2欧美一区二区三区在线观看视频| 一本大道av一区二区在线播放| 粉嫩av一区二区三区在线播放| 黄一区二区三区| 国产一区91精品张津瑜| 美女视频黄久久| 精品一区二区三区免费毛片爱 | 一区二区三区产品免费精品久久75| 国产午夜精品理论片a级大结局| 欧美日韩国产大片| 日韩视频免费直播| 欧美大尺度电影在线| 久久久国产精品麻豆| 亚洲日本va在线观看| 亚洲一区免费观看| 日韩avvvv在线播放| 国产风韵犹存在线视精品| av在线综合网| 欧美一区二区久久| 亚洲大尺度视频在线观看| 久久国产人妖系列| 99国产精品久久久久久久久久 | 亚洲成人手机在线| 不卡视频一二三四| 精品毛片乱码1区2区3区| 亚洲国产精品高清| 久久99最新地址| 欧洲激情一区二区| 亚洲一级片在线观看| 国产99久久久国产精品潘金网站| 欧美日本韩国一区二区三区视频 | 欧美四级电影在线观看| 欧美韩日一区二区三区| 日韩av中文字幕一区二区| 91久久精品国产91性色tv| 国产日本一区二区| 天天做天天摸天天爽国产一区| 色综合中文字幕国产 | 欧美日韩免费一区二区三区| 综合久久国产九一剧情麻豆| 国产精品1区2区| 亚洲欧洲日韩在线| 91视频精品在这里| 亚洲综合色区另类av| 91精彩视频在线| 日本强好片久久久久久aaa| 日韩一区二区在线观看| 日本免费新一区视频| 国产精品免费看片| 在线精品亚洲一区二区不卡| 亚洲国产精品一区二区尤物区|