VB無所不能之五:建立“標準”DLL動態連結程式庫檔案(1)
作者:鐘聲
部落格地址:http://blog.csdn.net/useway 動態連結程式庫經常被認為是VC或者Dephi的專利,DLL檔案可以將你編寫的函數動態發布,並可以被其他程式很方便的調用。
有朋友會問了,在VB裡面不是有一個叫做“ActiveX DLL”的項目類型嗎,產生的檔案最終也是“DLL”檔案啊?
沒錯,最終檔案確實是DLL檔案,但其實嚴格意義上VB建立的DLL並不是像VC一樣的動態連結程式庫,VB建立的是ActiveX DLL,不能像kernel32.dll”那樣通過“Declare Function .....”來調用的。 本文中將詳細講解用VB產生一個DLL動態連結程式庫檔案的方法,請注意,本文將詳細講述產生一個像VC的動態連結程式庫檔案,並且調用方法也是用“Declare Function .....”來調用。 好,那麼我們來建立一個DLL吧。
原理講述:
VB在編譯檔案的時候,採取的是兩次編譯的方法:
編譯第一步,首先是調用c2.exe產生OBJ檔案 “c2.exe”這個檔案在“C:/Program Files/Microsoft Visual Studio/VB98”目錄中,大家可以去找找看。“c2.exe”就是VB在編譯的時候調用的命令。
編譯第二步,調用Link.exe對OBJ檔案進行連結 “link.exe”也在那個檔案夾中,這個檔案和上面的那個檔案是一樣的,都是一個命令列工具。用過命令列工具的朋友肯定知道,命令列工具一般都可以制定相應參數的,對於“link.exe”也一樣,他也可以通過改變參數來調整其編譯連結後的結果。 那麼,其參數如下: usage: LINK [options] [files] [@commandfile] options: /ALIGN:#
/BASE:{address|@filename,key}
/COMMENT:comment
/DEBUG
/DEBUGTYPE:{CV|COFF}
/DEF:filename
/DEFAULTLIB:library
/DELAY:{NOBIND|UNLOAD}
/DELAYLOAD:dll
/DLL
/DRIVER[:{UPONLY|WDM}]
/ENTRY:symbol
/EXETYPE:DYNAMIC
/EXPORT:symbol
/FIXED[:NO]
/FORCE[:{MULTIPLE|UNRESOLVED}]
/GPSIZE:#
/HEAP:reserve[,commit]
/IMPLIB:filename
/INCLUDE:symbol
/INCREMENTAL:{YES|NO}
/LARGEADDRESSAWARE[:NO]
/LIBPATH:dir
/LINK50COMPAT
/MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|S
/MAP[:filename]
/MAPINFO:{EXPORTS|FIXUPS|LINES}
/MERGE:from=to
/NODEFAULTLIB[:library]
/NOENTRY
/NOLOGO
/OPT:{ICF[,iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}
/ORDER:@filename
/OUT:filename
/PDB:{filename|NONE}
/PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
/PROFILE
/RELEASE
/SECTION:name,[E][R][W][S][D][K][L][P][X]
/STACK:reserve[,commit]
/STUB:filename
/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.
/SWAPRUN:{CD|NET}
/VERBOSE[:LIB]
/VERSION:#[.#]
/VXD
/WARN[:warninglevel]
/WINDOWSCE:{CONVERT|EMULATION}
/WS:AGGRESSIVE 顯然有點茫然,那麼多參數啊? 不用茫然,我們只要關心一個參數即可——“/EXPORT”。 加入這個參數,就是讓你產生的DLL具有輸出函數的功能的選項!! 呵呵,明白了吧?
VB在編譯後直接連結時,並沒有加入這個選項,所以,用VB提供的編譯菜單編譯時間根本就不能輸出函數。 那麼怎麼辦??還需要問我嗎??當然是手工編譯VB工程了!! 呵呵,那就手工編譯吧!!哈哈哈,等等吧先,你看好了,每次編譯的時候我們都看不到產生的那個OBJ檔案,怎麼調用Link.exe進行連結啊??!! 是的,那麼我們只有兩個選擇,要麼研究一下c2.exe怎麼使用,要麼就在其刪除OBJ檔案前將其截獲。 研究c2.exe的使用方法我覺得就省了吧,當然有興趣的朋友可以去研究,我就不想研究了,現在專攻截獲這個問題。 如何截獲,呵呵,很簡單,——把link.exe改一下名,讓系統找不到link.exe這樣就直接可以得到OBJ檔案了。 好,今天先寫到這,明天再寫後半部分。 續篇已經寫完:http://blog.csdn.net/useway/archive/2010/04/15/5489951.aspx。。。《Java程式員,上班那點事兒》:
前言,目錄
卓越網銷售連結
China-pub銷售連結
噹噹網銷售連結《Java程式員,上班那點事》紀念帖
關於下載《Java程式員,上班那點事而》的電子版