国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

淺析VC++或MinGW—GCC的動(dòng)態(tài)鏈接庫(kù)轉(zhuǎn)為C++ Builder動(dòng)態(tài)鏈接庫(kù)的實(shí)現(xiàn)過程

2015-09-11 12:10:32蔣子威趙磊唐飛琳
電腦知識(shí)與技術(shù) 2015年17期
關(guān)鍵詞:轉(zhuǎn)化

蔣子威++趙磊++唐飛琳

摘要:通過對(duì)C++builder與VC++、MinGW_GCC動(dòng)態(tài)鏈接庫(kù)函數(shù)的分析,找出了它們之間的區(qū)別所在,然后針對(duì)其不同,給出了實(shí)現(xiàn)其轉(zhuǎn)化的實(shí)現(xiàn)過程。

關(guān)鍵詞:動(dòng)態(tài)鏈接庫(kù);轉(zhuǎn)化;實(shí)現(xiàn)過程

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)17-0062-00

VC++ or MinGW-GCC Dynamic Link Library to C++ Builder Dynamic Link Library Implementation Process

JIANG Zi-wei1, ZHAO Lei2, TANG Fei-lin2

(1.Workers University of Guilin,Guilin 541002,China;2.Guilin Pilot Software Development Co., Ltd.Guilin 541004,China)

Abstract:Through the analysis of C++builder and VC++, MinGW_GCC dynamic link library function, the differences between them are found out, and then the realization of the transformation is given.

Key words: dynamic link library; implementation process; method

1 概述

國(guó)內(nèi)物聯(lián)網(wǎng)軟件的開發(fā)一般是基于硬件設(shè)備生產(chǎn)廠家提供的SDK程序開發(fā)包而開發(fā),由于絕大部分硬件設(shè)備廠家提供的SDK程序開發(fā)包都是用VC++或MinGW-GCC編譯而成,另一方面網(wǎng)絡(luò)上發(fā)布的大多數(shù)開源軟件代碼一般也是符合MinGW-GCC編譯器的編譯要求,MinGW-GCC編譯器的編譯動(dòng)態(tài)鏈接庫(kù)可以直接為VC++使用,因此導(dǎo)致了國(guó)內(nèi)大部分的物聯(lián)網(wǎng)軟件都是用VC++開發(fā)而成。但在現(xiàn)在的社會(huì)需求中開發(fā)管理軟件,需要對(duì)大量數(shù)據(jù)的處理與存儲(chǔ),特別是物聯(lián)網(wǎng)管理軟件的設(shè)計(jì)。如果采用VC++語(yǔ)言開發(fā),那將對(duì)大量數(shù)據(jù)的處理帶來極大的不便,為開發(fā)具有強(qiáng)大數(shù)據(jù)管理功能的管理軟件,人們不得不采用在數(shù)據(jù)庫(kù)處理上具有大家公認(rèn)的、獨(dú)特優(yōu)勢(shì)的Embarcadero公司產(chǎn)品--C++builder,采用C++builder開發(fā)管理軟件的公司數(shù)量遠(yuǎn)遠(yuǎn)超過采用微軟的VC++開發(fā)的數(shù)量。雖然硬件設(shè)備廠家提供的SDK開發(fā)包是用VC++或MinGW-GCC編譯的,但又不能直接為C++builder開發(fā)平臺(tái)語(yǔ)言所使用,究其原因主要是其動(dòng)態(tài)鏈接庫(kù)函數(shù)不能為C++builder語(yǔ)言所接受,在借助硬件設(shè)備廠家的SDK程序開發(fā)包的同時(shí),如何才能突破這一瓶頸,更好地采用具有獨(dú)具匠心的C++builder開發(fā)語(yǔ)言平臺(tái)設(shè)計(jì)出更優(yōu)的管理軟件?

2 C++builder與VC++、MinGW-GCC動(dòng)態(tài)鏈接庫(kù)函數(shù)的區(qū)別

基于Windows平臺(tái)下開發(fā)設(shè)計(jì)的VC++語(yǔ)言、C++語(yǔ)言或者C++builder語(yǔ)言等都會(huì)隱式地使用動(dòng)態(tài)鏈接庫(kù)所需要的三個(gè)文件,即頭文件(*.h)、動(dòng)態(tài)鏈接庫(kù)文件(*.dll)、引入庫(kù)文件(*.lib),三者缺一不可。默認(rèn)情況下,VC++與MinGW-GCC二者在編譯和使用動(dòng)態(tài)鏈接庫(kù)都是一樣的,可以通用;但C++builder卻不能使用VC++或者M(jìn)inGW-GCC產(chǎn)生的引入庫(kù)文件(*.lib),分析其原因有其兩點(diǎn):一是C++builder引入庫(kù)與VC++ 、MinGW-GCC引入庫(kù)二進(jìn)制格式不一樣,因而導(dǎo)致它們之間不兼容;見表1所示。

表1 引入庫(kù)文件(*.lib)的二進(jìn)制格式

[VC++、MinGW-GCC格式\&C++builder格式\&COFF\&OMF\&]

二是C++builder對(duì)函數(shù)的名字修飾與VC++、MinGW-GCC對(duì)函數(shù)的名字修飾不一致。如表2所示。

表2 不同調(diào)用方式的名字修飾

[調(diào)用方式\&頭文件中的函數(shù)名\&VC++\MinGW-GCC函數(shù)命名\&C++builder的函數(shù)命名\&__stdcall\&MyFunction\&_MyFunction@nn

(nn--數(shù)字)\&MyFunction\&__cdecl\&MyFunction\&MyFunction\&_MyFunction\&__fastcall\&MyFunction\&@MyFunction@nn

(nn--數(shù)字)\&@MyFunction\&]

3 實(shí)現(xiàn)過程與方法

根據(jù)上面的分析,我們可以將VC++、MinGW-GCC編譯的動(dòng)態(tài)鏈接庫(kù)轉(zhuǎn)換為C++builder能調(diào)用的實(shí)現(xiàn)過程與方法歸結(jié)為以下兩點(diǎn):

3.1 將VC++、MinGW-GCC編譯的動(dòng)態(tài)鏈接庫(kù)轉(zhuǎn)換為C++builder能識(shí)別的庫(kù)的實(shí)現(xiàn)過程

1)檢查*.h文件中函數(shù)調(diào)用方式;

2)利用tdump.exe從*.dll中導(dǎo)出函數(shù)名稱列表*.lst,并檢查*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱是不是一致;

3)若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱一樣,并且其調(diào)用方式為__stdcall,則使用工具coff2omf.exe將適合VC++、MinGW-GCC的*.lib轉(zhuǎn)換為適合C++builder的*.lib或使用工具implib.exe直接從*.dll中生成適合C++builder的*.lib;

4)若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱一樣,并且調(diào)用方式為__cdecl;若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱不一樣,并且調(diào)用方式為__stdcall.使用工具impdef.exe從*.dll中生成*.def,用文本編輯軟件按照C++builder的函數(shù)名稱的修飾要求設(shè)置別名文件*.def,最后使用工具implib.exe和函數(shù)別名文件*.def從*.dll中生成*.lib。

3.2 生成C++builder動(dòng)態(tài)鏈接庫(kù)的具體方法

3.2.1 __cdecl調(diào)用格式的*.lib生成

1)使用如下命令生成函數(shù)名稱列表*.lst

Tdump.exe –m –ee MyDll.dll>MyDll.lst

其中MyDll.dll是動(dòng)態(tài)鏈接庫(kù)名稱,MyDll.lst是函數(shù)名稱列表,可用文本編輯器打開。

2)用文本編輯器打開MyDll.lst和*.h,檢查*.dll中的函數(shù)名稱是不是與*.h的函數(shù)名稱一樣。

3)若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱一樣,使用如下命令導(dǎo)出*.def文件:

Impdef.exe mydll.def mydll.dll

按下列格式用文本編輯器編輯與C++builder兼容的別名文件*.def:

LIBRARY MyDll.DLL

EXPORTS

_函數(shù)名1 = 函數(shù)名1

_函數(shù)名2 = 函數(shù)名2

最后用如下命令生成*.lib:

Implib mydll.lib mydll.def mydll.dll

3.2.2 __stdcall調(diào)用格式的*.lib生成

1)使用如下命令生成函數(shù)名稱列表*.lst

Tdump.exe –m –ee MyDll.dll>MyDll.lst

其中MyDll.dll是動(dòng)態(tài)鏈接庫(kù)名稱,MyDll.lst是函數(shù)名稱列表,可用文本編輯器打開。

2)用文本編輯器打開MyDll.lst和*.h,檢查*.dll中的函數(shù)名稱是不是與*.h的函數(shù)名稱一樣。

3)若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱一樣,使用如下命令生成*.lib文件:

Coff2omf.exe –lib:st inputlib outputlib

或使用如下命令生成*.lib:

Implib.exe mydll.lib mydll.dll

4)若*.dll中的函數(shù)名稱與*.h中的函數(shù)名稱不一樣,使用如下命令導(dǎo)出*.def文件:

Impdef.exe mydll.def mydll.dll

按下列格式用文本編輯器編輯與C++builder兼容的別名文件*.def:

LIBRARY MyDll.DLL

EXPORTS

函數(shù)名1 = _函數(shù)名1@nn1

函數(shù)名2 = _函數(shù)名2@nn2

最后用如下命令生成*.lib:

Implib mydll.lib mydll.def mydll.dll

下面是國(guó)內(nèi)幾個(gè)物聯(lián)網(wǎng)品牌的SDK開發(fā)包在C++builder中的具體應(yīng)用

1)??蛋卜辣O(jiān)控SDK開發(fā)包

根據(jù)??蛋卜辣O(jiān)控SDK開發(fā)包的HCNetSDK.h可以知道其函數(shù)是采用__stdcall調(diào)用方式的,用tdump.exe查看HCNetSDK.dll中的函數(shù)名與的HCNetSDK.h中的函數(shù)名一樣,因此可以直接用如下命令生成適合C++builder使用的HCNetSDK.lib:

Implib HCNetSDK.lib HCNetSDK.dll

2)大華安防監(jiān)控SDK開發(fā)包

根據(jù)大華安防監(jiān)控SDK開發(fā)包的dhnetsdk.h可以知道其函數(shù)是采用__stdcall調(diào)用方式的,用tdump.exe查看dhnetsdk.dll中的函數(shù)名與dhnetsdk.h中的函數(shù)名一樣,因此可以直接用如下命令生成適合C++builder使用的dhnetsdk.lib:

Implib dhnetsdk.lib dhnetsdk.dll

3)華邁安防監(jiān)控SDK開發(fā)包

根據(jù)華邁安防監(jiān)控SDK開發(fā)包的hm_sdk.h可以知道其函數(shù)是采用__cdecl調(diào)用方式的,用tdump.exe查看hmsdk.dll中的函數(shù)名與的hm_sdk.h中的函數(shù)名一樣,使用如下命令導(dǎo)出*.def文件:

Impdef.exe hmsdk.def hmsdk.dll

按下列格式用文本編輯器編輯與C++builder兼容的別名文件hmsdk.def:

LIBRARY HMSDK.DLL

EXPORTS

_hm_audio_capture_init = hm_audio_capture_init

_hm_audio_capture_set_callback = hm_audio_capture_set_callback

_hm_audio_capture_start = hm_audio_capture_start

_hm_audio_capture_stop = hm_audio_capture_stop

_hm_audio_capture_uninit = hm_audio_capture_uninit

_hm_audio_decode = hm_audio_decode

_hm_audio_encode = hm_audio_encode

最后用如下命令生成hmsdk.lib:

Implib hmsdk.lib hmsdk.def hmsdk.dll

4 結(jié)束語(yǔ)

實(shí)踐證明,只要按照上述方法與步驟,就能將VC++、MINGW-GCC編譯鏈接的動(dòng)態(tài)庫(kù)轉(zhuǎn)換為C++builder能接受處理的動(dòng)態(tài)鏈接庫(kù),并能如心所愿地開發(fā)出所要的具有強(qiáng)大數(shù)據(jù)處理功能的物聯(lián)網(wǎng)管理軟件,本文的方法可以為同行者開發(fā)強(qiáng)大數(shù)據(jù)管理功能的物聯(lián)網(wǎng)軟件提供有益的借鑒。

參考文獻(xiàn):

[1] 陸衛(wèi)忠, 劉文亮. C++Builder 6程序設(shè)計(jì)教程[M]. 2版. 北京: 科學(xué)出版社, 2000.

[2] Herbert Schildt, Greg Guntle. C++builder技術(shù)大全[M]. 周海斌,譯. 北京: 機(jī)械工業(yè)出版社, 2002.

[3] Ivor Horton. Visual C++ 2013入門經(jīng)典[M]. 李周芳, 江凌 譯. 7版. 北京: 清華大學(xué)出版社, 2013.

[4] 湛為芳. 高效實(shí)用Visual C++庫(kù)函數(shù)設(shè)計(jì)[M]. 北京: 清華大學(xué)出版社, 2010.

猜你喜歡
轉(zhuǎn)化
孩子,不哭
東方教育(2016年16期)2016-11-25 02:36:14
農(nóng)村初中數(shù)學(xué)后進(jìn)生策略
新一代(2016年15期)2016-11-16 16:36:46
大學(xué)生外在壓力的轉(zhuǎn)化研究
引例淺談導(dǎo)數(shù)應(yīng)用中的轉(zhuǎn)化策略
對(duì)小學(xué)副班主任做好育人工作的思考
淺談年畫中人物的變化與人的自我意識(shí)覺醒
人間(2016年28期)2016-11-10 00:06:46
淺談問題學(xué)生的轉(zhuǎn)化
淺談學(xué)困生的轉(zhuǎn)化
科技視界(2016年18期)2016-11-03 23:26:59
國(guó)有企業(yè)科技成果轉(zhuǎn)化及產(chǎn)業(yè)化中存在的問題分析
淺談演員“第一自我”與“第二自我”的轉(zhuǎn)化
戲劇之家(2016年19期)2016-10-31 18:33:48
维西| 荔波县| 巴林左旗| 扎赉特旗| 大安市| 灵石县| 师宗县| 黑山县| 道孚县| 丹阳市| 徐水县| 西青区| 上犹县| 新密市| 东城区| 襄樊市| 达日县| 太仆寺旗| 四子王旗| 宁晋县| 漾濞| 大关县| 望城县| 玉林市| 梁山县| 普陀区| 保定市| 个旧市| 公主岭市| 阿图什市| 澄城县| 松原市| 廊坊市| 金乡县| 盐山县| 罗山县| 金沙县| 洪洞县| 潼关县| 重庆市| 个旧市|