文章編號: 154093 - 上次校閱: 2006年11月21日 - 版次: 3.3 如何從 Windows 95、 Windows 98 或 Windows 千禧版下 16 位元程式碼呼叫 32 位元的程式碼
在此頁中結論它是通常需要將連接埠 Win16 應用程式和 DLL Win32 有點一次而非一次。比方說您可以連接埠 Win32 的 16 位元 DLL,但是仍然能夠從 16 位元程式碼呼叫。本文將告訴您,16 位元 DLL 可以呼叫 32 位元 DLL 的機制。機制稱為一個 Thunk 和方法實作下 Microsoft Windows 95,Windows 98 或 Windows 千禧版 (Me) 稱為平面 Thunk。 在撰寫 Thunk 程式碼三個主要步驟如下:
其他相關資訊平面 Thunk 是由 16 位元和 32 位元 DLL,一起工作所組成。16 位元 DLL 和 16 位元 DLL 呼叫中 32 位元 DLL 匯出的函式 A Win16 應用程式呼叫。在 32 位元 DLL 函式傳回時, 它會傳回回到 16 位元 DLL 會輪流傳回回到 Win16 應用程式。16 位元和 32 位元 DLL 工作藉由呼叫 Windows 95、 Windows 98 或 Windows Me 16 位元和 32 位元 kernels 來處理所有讓從 16 位元到 32 位元的程式碼轉換以及備份所需的低階詳細資料。 設計新的平面 Thunk 牽涉到建立 Thunk 指令碼 (.THK 檔案)。 此指令碼以 Thunk 編譯器編譯到組件語言檔案的兩次 ; 一次與每個兩個旗標組合:-DIS_16 和-DIS_32。結果是 16 位元和 32 位元物件模組。這些物件模組會分別連結至 16 位元和 32 位元 DLL。下列圖表摘要了參與建置 DLL 檔案:
+------------+
| 16to32.THK |
+------------+
|
+------------+
| 16to32.ASM |
+------------+
/ \
-DIS_16 / \ -DIS_32
/ \
+-----------+ +-----------+
| 16THK.OBJ | | 32THK.OBJ |
+-----------+ +-----------+
/ \
+-------+ +-------+ +-------+
| APP16 | -> | DLL16 | -- THUNK -- | DLL32 |
+-------+ +-------+ +-------+
建置平面 Thunk 所需的工具
正在建立 Thunk 指令碼您需要建立 Thunk 編譯器所用來建立一個 Thunk 的指令碼。Thunk 指令碼是包含型別定義您想要透過 Thunk 呼叫之函式的函式原型和每個函式的參數方向規格的文字檔。比方說有些函數則需要輸入和輸出參數而有些則可能只需要輸入的參數。Thunk 指令檔使用特殊的語法來描述是否輸入參數、 輸出,或輸入和輸出。16-32 Thunk > 的 Thunk 指令碼從下列的陳述式開始: enablemapdirect1632 = true ; 預設情況下,只時第一次執行到它的 Thunk,被載入 32 位元 DLL。因為使用此晚期繫結 16 位元的程式碼必須依據任何 32 位元 DLL 的初始化,所採取的動作不是。因為 32 位元 DLL 會載入當第一個 thunk 要它執行時,在 32 位元 DLL 載入問題將會無法偵測 16 位元 DLL 第一次載入時。若要停用 32 位元 DLL 的晚期繫結,請 Thunk 指令碼中加入下列行: preload32 = true ; Thunk 編譯器必須將 Thunk 的 16 位元側邊宣告為 __far __pascal 和 32 位元側邊是 __stdcall。(WINAPI 宣告負責這兩面)。Thunk 編譯器不支援 __cdecl 和 __fastcall 呼叫慣例。但是,注意 Thunk 編譯器不會實際接受 __far、 __pascal 或 __stdcall 關鍵字 ; 它們會假設。 下列的 Thunk 指令碼說明沒有參數的函式: C language: void WINAPI MyThunk32(void); C++ Language: extern "C" void WINAPI MyThunk32(); 下列的 Thunk 指令碼會使用更複雜的參數型別,例如結構。本範例也示範如何指定輸入和輸出參數: 使用 Thunk 編譯器Thunk 編譯器使用方式是,如下所示:thunk.exe/選項 <inputfile>-o <outputfile> 下面這一行會示範如何編譯-32 Thunk 指令碼 > 16。這一行會採用名為 16to32.thk 指令碼,並產生名為 16to32.asm 的組件語言檔案: Thunk-t thk 16to32.thk-o 16to32.asm 在"-t thk 」 選項是告訴 Thunk 編譯器 Thunk 函式組件語言檔案與 thk_ 」 中的前置詞。這個前置詞時,連結到一組 DLL 的多個 Thunk 指令碼使用,且有助於建立一組包含兩個 16-32 和 32-16 Thunk > 的 DLL。 建置 16 位元 DLL
建置 32 位元 DLL
?考這篇文章中的資訊適用於:
機器翻譯重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。 按一下這裡查看此文章的英文版本:154093?
(http://support.microsoft.com/kb/154093/en-us/
)
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。 | 其他資源 其他支援網站社群文章翻譯 |






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email



回此頁最上方