自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析C++Builder調(diào)用Visual C++ DLL

開發(fā) 后端
如果連接器不能找到它認(rèn)為是程序需要的連接名字的函數(shù),這就是C++Builder調(diào)用Visual C++ DLL的主要障礙。

使用C++Builder調(diào)用Visual C++ DLL 創(chuàng)建的DLL不會比調(diào)用C++Builder 建造的DLL 難,首先,Borland 和 Microsoft 在 OBJ 和引入庫的文件格式上不同Visual C++ 使用 COFF 庫格式,而 Borland 使用 OMF 格式。

這就意味著你不能把一個 Microsoft 生成的引入庫添加到C++Builder 的工程里。感謝 Borland IMPLIB 這個實用工具,文件格式的不同得以克服。
兩個產(chǎn)品在連接名字(linker name)習(xí)慣上也不同。

這是 C++Builder 調(diào)用 Visual C++ DLL 的主要障礙。在 DLL 或 OBJ 里的每一個函數(shù)有一個連接名字。連接器用連接名字在連接期間解決(resolve)聲明了原型的函數(shù)。如果連接器不能找到它認(rèn)為是程序需要的連接名字的函數(shù),它將產(chǎn)生一個未解決的外部錯誤(unresolved external error)。

關(guān)于函數(shù)連接名字,Borland 和 Microsoft 在下面兩點上不同:
1- Visual C++ 有時修飾導(dǎo)出的 __stdcall 函數(shù)。
2- Borland C++Builder 在引入這個被修飾的函數(shù)時,認(rèn)為是 __cdecl 函數(shù)。

那么,這件事為什么這樣重要呢?拿分歧#1 __stdcall 調(diào)用習(xí)慣來說。如果你用 Visual C++ 創(chuàng)建了一個 DLL,它包含一個 __stdcall 修飾的函數(shù)叫做 MyFunction(),Visual C++ 將給函數(shù)一個連接名字,為 _MyFunction@4。當(dāng) Borland 連接器設(shè)法解決調(diào)用構(gòu)造這個函數(shù)的時候,它認(rèn)為要找一個名為 MyFunction 的函數(shù)。因為 Visual C++ DLL 引入庫不包含叫作 MyFunction 的函數(shù),Borland 連接器報告一個未解決的外部錯誤,意識是沒有找到函數(shù)。

解決這三個問題的方法要依賴 Visual C++ DLL 的編譯方式。我把整個過程分為二步。
第1步:識別在 Visual C++ DLL 里使用的調(diào)用習(xí)慣為了與命名習(xí)慣纏結(jié)交戰(zhàn),你必須首先確定在 DLL 里函數(shù)使用的調(diào)用習(xí)慣。你可以通過查看 DLL 的頭文件來確定。在 DLL 頭文件里的函數(shù)原型形式如下

第2步:檢查 DLL 里的連接名字如果在第 1 步中顯示 DLL 利用 __stdcall 調(diào)用習(xí)慣,你需要進(jìn)一步檢查 DLL,確定 Visual C++ 在創(chuàng)建它時采用的命名習(xí)慣。Visual C++ 默認(rèn)情況下要修飾 __stdcall 函數(shù),但如果寫這個 DLL 的程序員在他們的工程里增加一個 DEF 文件,可以阻止命名修飾。如果供應(yīng)商沒有使用 DEF 文件,你的工會稍微繁瑣一些。
命令行工具 TDUMP 允許你檢查 DLL 導(dǎo)出函數(shù)的連接名字。下面向 DLL 調(diào)用 TDUMP 的命令。

TDUMP 能報告許多關(guān)于 DLL 的信息。我們僅對 DLL 的導(dǎo)出函數(shù)感興趣。-ee 命令選項指示 TDUMP 僅列出導(dǎo)出信息。-m 開關(guān)告訴 TDUMP 按 DLL 函數(shù)的原始格式顯示。如果沒有 -m 開關(guān),TDUMP 將嘗試把修飾過的函數(shù)轉(zhuǎn)化為人們易讀的格式。如果 DLL 很大的話,你應(yīng)該重定向 TDUMP 的輸出到一個文件里(通過附加的 > MYDLL.LST)。

TDUMP 為源程序清單 A 和 B 的測試 DLL 輸出如下:

  1. bo Dump Version 5.0.16.4 Copyright (c) 1988, 1998 Borland International  
  2. Display of File DLL.DLL  
  3. EXPORT ord:0000='CdeclFunction' 
  4. EXPORT ord:0002='UnknownFunction' 
  5. EXPORT ord:0001='_StdCallFunction@4' 

注意在 __stdcall 函數(shù)上的前綴下劃線和后綴 @4。__cdecl 和未指定調(diào)用方式的函數(shù)沒有任何修飾符。如果 Visuall C++ DLL 編譯的時候帶 DEF 文件,在 __stdcall 函數(shù)上的修飾符將不會出現(xiàn)。

【編輯推薦】

  1. C與C++中標(biāo)準(zhǔn)輸入實現(xiàn)方式上的一點區(qū)別
  2. C++編譯器如何對Const常量進(jìn)行分配存儲空間
  3. C++類庫設(shè)計的基本構(gòu)思與方法
  4. 玩轉(zhuǎn)C++語言的幾種方法
  5. 如何更好的進(jìn)行C++代碼編制
責(zé)任編輯:chenqingxiang 來源: CSDN
相關(guān)推薦

2010-01-26 14:04:14

C++Builder

2009-08-18 16:31:19

Visual C#編寫

2010-01-15 09:33:01

CC++Builder

2009-07-31 17:28:35

C#語言調(diào)用DLL

2010-01-18 14:25:19

使用C++Builde

2010-01-18 14:41:52

Visual C++開

2010-01-15 09:48:04

C++Builder

2010-01-14 14:17:20

Visual C++

2011-04-08 09:52:44

C++C#DLL

2010-01-21 16:33:44

C++Builder

2010-01-19 14:39:22

C++ Builder

2010-01-25 16:58:15

C++程序

2010-01-22 13:59:34

Visual C++應(yīng)

2010-01-22 18:41:32

Visual C++

2010-01-11 10:53:14

C++Builder

2010-01-21 09:34:57

C++語法

2010-01-27 16:05:06

C++堆棧

2010-01-11 10:45:43

C++Builder

2009-09-25 11:04:07

C++動態(tài)加載DLL

2010-01-20 10:19:55

C++數(shù)組
點贊
收藏

51CTO技術(shù)棧公眾號