• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      淺析VC++或MinGW—GCC的動(dòng)態(tài)鏈接庫轉(zhuǎn)為C++ Builder動(dòng)態(tài)鏈接庫的實(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)鏈接庫函數(shù)的分析,找出了它們之間的區(qū)別所在,然后針對(duì)其不同,給出了實(shí)現(xiàn)其轉(zhuǎn)化的實(shí)現(xiàn)過程。

      關(guān)鍵詞:動(dòng)態(tài)鏈接庫;轉(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 概述

      國內(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)鏈接庫可以直接為VC++使用,因此導(dǎo)致了國內(nèi)大部分的物聯(lián)網(wǎng)軟件都是用VC++開發(fā)而成。但在現(xiàn)在的社會(huì)需求中開發(fā)管理軟件,需要對(duì)大量數(shù)據(jù)的處理與存儲(chǔ),特別是物聯(lián)網(wǎng)管理軟件的設(shè)計(jì)。如果采用VC++語言開發(fā),那將對(duì)大量數(shù)據(jù)的處理帶來極大的不便,為開發(fā)具有強(qiáng)大數(shù)據(jù)管理功能的管理軟件,人們不得不采用在數(shù)據(jù)庫處理上具有大家公認(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)語言所使用,究其原因主要是其動(dòng)態(tài)鏈接庫函數(shù)不能為C++builder語言所接受,在借助硬件設(shè)備廠家的SDK程序開發(fā)包的同時(shí),如何才能突破這一瓶頸,更好地采用具有獨(dú)具匠心的C++builder開發(fā)語言平臺(tái)設(shè)計(jì)出更優(yōu)的管理軟件?

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

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

      表1 引入庫文件(*.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)鏈接庫轉(zhuǎn)換為C++builder能調(diào)用的實(shí)現(xiàn)過程與方法歸結(jié)為以下兩點(diǎn):

      3.1 將VC++、MinGW-GCC編譯的動(dòng)態(tài)鏈接庫轉(zhuǎn)換為C++builder能識(shí)別的庫的實(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)鏈接庫的具體方法

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

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

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

      其中MyDll.dll是動(dòng)態(tài)鏈接庫名稱,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)鏈接庫名稱,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

      下面是國內(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é)束語

      實(shí)踐證明,只要按照上述方法與步驟,就能將VC++、MINGW-GCC編譯鏈接的動(dòng)態(tài)庫轉(zhuǎn)換為C++builder能接受處理的動(dòng)態(tài)鏈接庫,并能如心所愿地開發(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++庫函數(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
      國有企業(yè)科技成果轉(zhuǎn)化及產(chǎn)業(yè)化中存在的問題分析
      淺談演員“第一自我”與“第二自我”的轉(zhuǎn)化
      戲劇之家(2016年19期)2016-10-31 18:33:48
      德惠市| 图片| 原平市| 崇左市| 木里| 元谋县| 十堰市| 巩留县| 本溪市| 山丹县| 廉江市| 偏关县| 乌拉特前旗| 丽水市| 崇左市| 义乌市| 杨浦区| 绍兴市| 遂昌县| 丰原市| 肃南| 镇康县| 辉县市| 泾阳县| 北流市| 嘉黎县| 铜鼓县| 呼伦贝尔市| 高密市| 长宁区| 印江| 乐陵市| 永丰县| 平乡县| 徐闻县| 林周县| 隆德县| 临清市| 廊坊市| 舞阳县| 万荣县|