Windows的動態連結程式庫原理及使用2

來源:互聯網
上載者:User

3 利用DLLs實現資料轉送

3.1 DLLs中的全域記憶體

Windows規定:DLLs並不擁有它開啟的任何檔案或它分配的任何全域記憶體塊。這些對象由直接或間接調用DLLs的應用程式擁有。這樣,當應用程式中止時,它擁有的開啟的檔案自動關閉,它擁有的全域記憶體塊自動釋放。這就意味著儲存在DLLs全域變數中的檔案和全域記憶體塊變數在DLLs

沒有被通知的情況下就變為非法。這將給其它使用該DLLs的應用程式造成困難。

為了避免出現這種情況,檔案和全域記憶體塊控制代碼不應作為DLLs的全域變數,而是作為DLLs中過程或函數的參數傳遞給DLLs使用。調用DLLs的應用程式應該負責對它們的維護。

但在特定情況下,DLLs也可以擁有自己的全域記憶體塊。這些記憶體塊必須用gmem_DDEShare屬性進行分配。這樣的記憶體塊直到被DLLs顯示釋放或DLLs退出時都保持有效。

由DLLs管理的全域記憶體塊是應用程式間進行資料轉送的又一途徑,下面我們將專門討論這一問題。

3.2 利用DLLs實現應用程式間的資料轉送

利用DLLs實現應用程式間的資料轉送的步驟為:

1. 編寫一個DLLs程式,其中擁有一個用gmem_DDEShare屬性分配的全域記憶體塊;

2. 伺服器程式調用DLLs,向全域記憶體塊寫入資料;

3. 客戶程式調用DLLs,從全域記憶體塊讀取資料。

3.2.1 用於實現資料轉送的DLLs的編寫

用於實現資料轉送的DLLs與一般DLLs的編寫基本相同,其中特別的地方是:

1. 定義一個全域變數控制代碼:

    var
      hMem: THandle;

2. 定義一個過程,返回該全域變數的控制代碼。該過程要包含在exports子句中。如:

    function GetGlobalMem: THandle; export;
     begin
      Result := hMem;
     end;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.