元件與過程呼叫

2021-04-16 07:05:19 字數 1554 閱讀 2019

每乙個exe中都有其自己的程序空間,因而不用的exe中的元件和客戶將在不同的程序中執行。dll則與exe不同,它將被對映到鏈結它們的exe檔案的程序空間中。因而,dll也被稱作程序中伺服器,exe則被稱作是程序外伺服器。在某些情況下,exe也被稱作是本地伺服器,以同另外一種型別的執行於另外乙個不同機器上的程序外伺服器「遠端伺服器」相區別。

元件將把乙個介面傳給客戶。乙個介面實際上是乙個函式指標的陣列,為呼叫介面中的函式,客戶必須能夠訪問同介面相關聯的記憶體。若元件是乙個dll,這一點是很容易實現的,因為元件和客戶處於相同的位址空間中。但如果元件和客戶在不同的位址空間中,客戶將無法訪問元件程序的位址空間。

在某些情況下,我們需要呼叫exe而不是dll來實現元件,原因之一是應用程式可能已經是乙個exe檔案了。對於跨越程序邊界的介面,我們需要考慮如下一些條件:

(1)乙個程序需要能夠呼叫另外乙個程序中的函式;

(2)乙個程序需要能夠將資料傳遞給另外乙個程序;

(3)客戶無需關心它所訪問的伺服器是程序內還是程序外伺服器。

本地過程呼叫

對於程序間的通訊,有幾種不同的方法如:動態資料交換(dde)、命名管道以及共享記憶體等。com所用的方法則是本地過程呼叫(lpc),lpc是同一機器上不同程序間通訊的一種方法,是基於遠端過程呼叫(rpc)的用於單機上程序間通訊的專利技術。這種技術使得不同機器上的程序可以使用各種網路傳輸技術進行通訊。lpc是由作業系統實現的,由於作業系統知道每乙個程序邏輯位址空間相對應的實體地址,因此作業系統可以呼叫任意程序中的任意函式。

調整

呼叫exe中的函式知識第一步。我們還需要一種方法將函式呼叫的引數從乙個程序的位址空間傳到另外乙個程序的位址空間。這種方法稱作「調整」。

若兩個程序都在用一台及其上,則呼叫過程是比較直接的:只需要將引數資料從乙個程序的位址空間複製到另外乙個程序的位址空間就可以了。若參與引數傳遞的兩個程序在不同的位址空間中,那麼考慮到不同機器在資料表示方面的不同,如整數的位元組順序可能會不一樣,必須將引數資料轉換成標準的格式。

lpc技術可以將資料從乙個程序複製到另外乙個程序中。但為完成這一點,僅需要乙個c++標頭檔案是不夠的,還需要其他的一些資訊以將引數打包並傳送給其他程序。

為對元件進行調整,可以實現乙個名為imarshal的介面。在com建立元件的過程中,它將查詢元件的imarshal介面,然後呼叫此介面的成員函式已在呼叫函式的前後調整或反調整有關的引數。com庫中實現了乙個可以供大多數介面使用的imarshal的標準版本。如果需要優化程序效能,可以對imarshal進行定製。

**/殘根dll

在com中,客戶將同乙個稱為**的模仿元件的dll進行通訊,以為客戶完成引數的調整及lpc呼叫。乙個**就是同另外乙個元件行為相同的元件。**必須是dll形式的,因為它們需要訪問客戶程序的位址空間以便對傳給介面函式的資料進行調整。此外,元件還需要乙個被稱作是殘根的dll,以對從客戶傳來的資料進行反調整。殘根已將對傳回給客戶的資料進行調整。

呼叫元件Feign

有服務消費方呼叫提供方,之前採用的是resttemplate。1 在pom.xml中引入openfeign的啟動器 org.springframework.cloud spring cloud starter openfeign feign hystrix enabled true 開啟feign的...

元件呼叫方式

元件可通過以下兩種方式呼叫,你可以選擇其中一種方式使用topjui元件1 通過html標籤呼叫 大部分場景下,你可以使用html標籤的方式呼叫元件,此方式不需要寫js 即在html元素中增加屬性data toggle 元件名稱 的方式呼叫,引數通過屬性data options 引數名1 引數值1,引...

React Native父元件呼叫子元件

用元件化寫的 import react,from react import from react native import greeting1 from greeting.js class greeting extends component console.log foo console.war...