![VB調(diào)用C程序的方法-動(dòng)態(tài)鏈接庫法_第1頁](http://file4.renrendoc.com/view4/M00/18/1E/wKhkGGaCOjeAO0HqAAHXTa6tung277.jpg)
![VB調(diào)用C程序的方法-動(dòng)態(tài)鏈接庫法_第2頁](http://file4.renrendoc.com/view4/M00/18/1E/wKhkGGaCOjeAO0HqAAHXTa6tung2772.jpg)
![VB調(diào)用C程序的方法-動(dòng)態(tài)鏈接庫法_第3頁](http://file4.renrendoc.com/view4/M00/18/1E/wKhkGGaCOjeAO0HqAAHXTa6tung2773.jpg)
![VB調(diào)用C程序的方法-動(dòng)態(tài)鏈接庫法_第4頁](http://file4.renrendoc.com/view4/M00/18/1E/wKhkGGaCOjeAO0HqAAHXTa6tung2774.jpg)
![VB調(diào)用C程序的方法-動(dòng)態(tài)鏈接庫法_第5頁](http://file4.renrendoc.com/view4/M00/18/1E/wKhkGGaCOjeAO0HqAAHXTa6tung2775.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精品文檔-下載后可編輯VB調(diào)用C程序的方法—?jiǎng)討B(tài)鏈接庫法文中介紹了一種實(shí)現(xiàn)VB調(diào)用C語言程序的方法-動(dòng)態(tài)連接庫法,給出了動(dòng)態(tài)鏈接庫制
作的一般框架,通過實(shí)例描述了動(dòng)態(tài)連接庫的實(shí)現(xiàn)及其制做方法、編程步驟,這種方法具有
普遍的意義。
關(guān)鍵詞VB動(dòng)態(tài)連接庫DLLC程序
一、引言
VisualBasic(以下簡(jiǎn)稱VB)是一種可視化的面向?qū)ο蟮木幊陶Z言,以其編程簡(jiǎn)單、快捷
等特點(diǎn),深受廣大WINDOWS程序員的青睞。利用VB開發(fā)界面友好、操作方便的軟件只需
很短的時(shí)間。但是VB運(yùn)行速度較慢,對(duì)于龐大的科學(xué)計(jì)算問題,VB的這種慢速會(huì)使人難
以忍受。C語言是國(guó)際上非常流行的一種中級(jí)編程語言,以其靈活、高效等優(yōu)點(diǎn)而獲得廣
泛應(yīng)用,許多的應(yīng)用程序都是用C語言在DOS環(huán)境下編寫而成。那么如何發(fā)揮VB和C這兩
種語言的優(yōu)勢(shì),用VB設(shè)計(jì)一種良好的forwindows界面來調(diào)用C語言程序,即實(shí)現(xiàn)VB調(diào)用C
語言程序呢?現(xiàn)有的文獻(xiàn)只提到動(dòng)態(tài)鏈接庫(以下簡(jiǎn)稱DLL)可以將這兩種語言連接起來,
但有講動(dòng)態(tài)鏈接庫DLL的制做及其編程方法。本文詳細(xì)介紹了BorlandC環(huán)境下制作動(dòng)態(tài)鏈
接庫以及VB調(diào)用fordos動(dòng)態(tài)鏈接庫的的方法、步驟,并通過實(shí)例描述VB調(diào)用C程序的全過
程。
二、用BorlandC編寫DLL程序的方法
要想實(shí)現(xiàn)VB調(diào)用C程序,首先需要用BorlandC編寫動(dòng)態(tài)連接庫DLL程序(假設(shè)DLL程序
取名為example)。動(dòng)態(tài)鏈接庫包含四個(gè)文件:C語言源程序(.C)、模塊定義文件
(.DEF)、原型函數(shù)文件(.H)和工程文件(.PRJ)。下面分別詳細(xì)介紹一下這四種文件
的具體結(jié)構(gòu)。
1、編寫C語言源程序的框架:
C語言源程序(example.C),它包括三種函數(shù):入口函數(shù)、輸出函數(shù)和終止函數(shù)。其具體
結(jié)構(gòu)如下:
/*************************************/
/*文件名:example.C*/
/*************************************/
#includewindows.h
/***********入口函數(shù)***********/
intFARPASCALLibMain(HANDLEhInstance,
WORDwDataSeg,
WORDcbHeapSize,
LPSTRlpszCmdLine)
{
if(cbHeapSize!=0)
UnlockData(0);
return(1);
}
/***********輸出函數(shù)***********/
intFARPASCALexample(intparam1,...,charparamn)
{
/*C語言應(yīng)用程序*/
}
/***********終止函數(shù)***********/
intFARPASCALWEP(int/*SystemExit*/)
{
return(1);
}
以上各組成部分參數(shù)的含義:Windows.h頭文件,它包含有數(shù)據(jù)類型的定義、API入口
點(diǎn)定義和其它有用的參數(shù)信息。PASCAL說明符定義該程序的傳遞參數(shù)和凈化堆棧的協(xié)定
(注意:DLL外部傳送的指針必須是遠(yuǎn)指針FAR)。LibMain帶四個(gè)參數(shù):
hInstance、wDataSeg、cbHeapSize和lpszCmdLine。第一個(gè)參數(shù)hInstance是DLL事例句
柄,wDataSeg參數(shù)是數(shù)據(jù)段(DS)寄存器值,cbHeapSize參數(shù)是在模塊定義文件中定義
的堆的大小,LibMain使用該值使本地堆初始化。lpszCmdLine參數(shù)包括命令行信息,但
很少被DLL使用。一般來說,這四個(gè)參數(shù)是制作DLL通用的參數(shù)。
如果不想讓DLL數(shù)據(jù)被封住,那么必須調(diào)用unlockdata恢復(fù)正常的非鎖狀態(tài),如果DLL初始
化已經(jīng)成功,DLL則返回1,若不成功則返回0值,且DLL退出系統(tǒng)。
DLL的輸出函數(shù)實(shí)現(xiàn)用戶所要完成的任務(wù),這部分是DLL的核心。它與一般C語言程序不同
之處在于無scanf函數(shù)。所有的外部指針都是遠(yuǎn)指針FAR。畫直線函數(shù)要用lineto函數(shù)。
DLL包括一個(gè)終止函數(shù),終止函數(shù)有時(shí)稱為退出函數(shù),它的名字必須是WEP。且它可以被
包括在DLL模塊定義文件的EXPORTS段中。
2、模塊定義文件(.DEF)的結(jié)構(gòu)和各段的意義
模塊定義文件的結(jié)構(gòu)如下:
/*************************************/
/*文件名:example.DEF*/
/*************************************/
LIBRARYexample/*DLLname*/
DESCRIPTION''''example.DLL''''
EXETYPEWINDOWS
CODEPRELOADMOVEABLEDISCARDABLE
DATAPRELOADMOVEABLESINGLE
HEAPSIZE1024
EXPORTS
example@1
WEP@2
關(guān)鍵字LIBRARY是把這個(gè)模塊視為一個(gè)DLL,庫的名字example跟在其后,且必須與該庫
的名字、DEF中的DLL的文件名相一致。DESCRIPTION語句采用一個(gè)字符串,其長(zhǎng)度可達(dá)
128個(gè)字符,通常用它來保存模塊描述的信息。EXETYPEwindows語句每個(gè)windows應(yīng)用程
序和DLL都需要。DATA語句定義該庫數(shù)據(jù)段的內(nèi)存屬性,關(guān)鍵字MOVEABLE允許內(nèi)存管
理程序在必要時(shí)移動(dòng)內(nèi)存段,關(guān)鍵字SINGLE是DLL必要,因?yàn)镈LL總是有一個(gè)單一數(shù)據(jù)段,
而不管訪問它的應(yīng)用程序的數(shù)量。HEAPSIZE語句用來定義一個(gè)DLL局部堆的初始規(guī)模,
執(zhí)行局部?jī)?nèi)存分配的DLL必須在庫啟動(dòng)時(shí)使該堆初始化,堆的大小被傳送給DLL的LiEntry
的程序。然后用該堆的大小調(diào)用Locallnit使DLL的局部堆初始化。
EXEPORTS語句定義將被用作來自應(yīng)用程序或來自其它DLL入口點(diǎn)的程序,windows利用
這個(gè)信息建立一個(gè)序數(shù)入口值,序數(shù)入口值是一個(gè)優(yōu)化的值,允許動(dòng)態(tài)連接機(jī)制更快塊操
作且使用較少的內(nèi)存。
一般來說,模塊定義文件(.DEF)的結(jié)構(gòu)除取動(dòng)態(tài)庫的名字不同外,其它結(jié)構(gòu)都是固定
的。
3.建立原形函數(shù)文件(.H)
原形函數(shù)的功能是進(jìn)一步聲明調(diào)用函數(shù)的函數(shù)名和傳遞的參數(shù),其形式為:
/*************************************/
/*文件名:example.H*/
/*************************************/
extern"C"int_exportFARPASCALexample(intparam1,...,charparamn);
4.建立工程文件(.PRJ)
工程文件中包含有example.C、example.DEF兩個(gè)文件后,然后編譯連接生成動(dòng)態(tài)鏈接
庫即可。
以上是制作動(dòng)態(tài)連接庫的框架,現(xiàn)在通過一個(gè)實(shí)例介紹制作動(dòng)態(tài)鏈接庫的方法。如要
求程序完成功能為:打開一個(gè)數(shù)據(jù)文件讀出前兩個(gè)數(shù)據(jù),將這兩個(gè)數(shù)與所傳遞的兩個(gè)參數(shù)
相加,返回它們的和。設(shè)該DLL程序的名字為ADD。
第一步:在BorlandC++環(huán)境下編輯.C文件、.DEF文件和.H文件,并建立.PRJ文件。如
(1)編寫C語言源程序清單:
/*************************************/
/*文件名:ADD.C*/
/*************************************/
#includeiostream.h
#includeconio.h
#includeio.h
#includealloc.h
#includestdlib.h
#includewindows.h
#includemath.h
#includestdio.h
#include"c:\ADD.h"
/*入口函數(shù)*/
intFARPASCALLibMain(HANDLEhInstance,
WORDwDataSeg,
WORDcbHeapSize,
LPSTRlpszCmdLine)
{
if(cbHeapSize!=0)
UnlockData(0);
return1;
}
/*輸出函數(shù)*/
intFARPASCALADD(intx,inty,char*filein)
{inta,b;
fp=fopen(filein,"r");
if(fp==NULL){exit(0);}
inttemp1=0,temp2=0;
fscanf(fp,"%d",a);
fscanf(fp,"%d",b);
temp1=x+a;
temp2=y+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1);
}
/*退出函數(shù)*/
intFARPASCALWEP(int/*SystemExit*/)
{
return(1);
}
2)ADD.DEF文件的程序清單:
/*************************************/
/*文件名:ADD.H*/
/*************************************/
LIBRARYADD
DESCRIPTION''''ADD.DLL''''
EXETYPEWINDOWS
CODEPRELOADMOVEABLEDISCARDABLE
DATAPRELOADMOVEABLESINGLE
HEAPSIZE1024
EXPORTS
ADD@1
WEP@2
(3)ADD.H程序清單:
/*************************************/
/*文件名:ADD.H*/
/*************************************/
extern"C"int_exportFARPASCALadd(intx,inty,char*filein);
(4)建立工程文件:
在BorlandC++環(huán)境下的project項(xiàng)中打開openprojectfile項(xiàng)并建立ADD.prj,在add
item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。
第二步,在BorlandC的options項(xiàng)的Applation中選擇WindowsDLL,再在Compile中選擇
Buildall,這樣就可生成動(dòng)態(tài)鏈接庫ADD.DLL供VB調(diào)用。
三、VB3.0調(diào)用動(dòng)態(tài)鏈接庫DLL方法
制作好DLL之后,就可以用VB調(diào)用它,實(shí)現(xiàn)VB調(diào)用C程序。VB程序要使用DLL中的函
數(shù),首先必須要有特殊的聲明,用Declare聲明語句在窗體級(jí)或模塊級(jí)或全局模塊的代碼
聲明段進(jìn)行聲明,將動(dòng)態(tài)鏈接庫中的函數(shù)聲明到VB中,供VB程序調(diào)用。
語句格式為:DeclareSub過程名Lib摽鈹黚_n[Alias"別名]([ByVal參數(shù)AS類型]),
或?yàn)镈eclareFunction函數(shù)名Lib摽鈹黚_衃Alias"別名]([ByVal參數(shù)AS類型])AS
類型在聲明中首先用Declare關(guān)鍵字表示聲明DLL中的函數(shù)。在C語言中有的函數(shù)類型為
VOID,它表示不具有返回值,則必須用關(guān)鍵字Sub將其聲明成過程。有的函數(shù)具有返回
值,則必須用關(guān)鍵字Function將其聲明成函數(shù),并且在聲明語句的最后要用AS關(guān)鍵字指明
函數(shù)返回值的類型。
例如上面的ADD.DLL在VB中就可以聲明
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度體育賽事贊助合同匯編
- 2025年度空調(diào)銷售安裝合同書-二零二五年度品質(zhì)保障
- 2025年度跨境電子商務(wù)平臺(tái)居間服務(wù)合同范本
- 2025年度科技項(xiàng)目居間合作合同參考
- 2025年度智慧城市基礎(chǔ)設(shè)施建設(shè)合同-@-20
- 2025年度虛擬現(xiàn)實(shí)(VR)技術(shù)研發(fā)與應(yīng)用合同-@-1
- 2025年度智能安防監(jiān)控系統(tǒng)集成合同
- 2025年度城市配送電動(dòng)車租賃服務(wù)合同
- 2025年度供配電工程監(jiān)理合同規(guī)范正本
- 2025年度智能穿戴設(shè)備研發(fā)與生產(chǎn)勞動(dòng)合同
- 2025年魯泰集團(tuán)招聘170人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024-2025學(xué)年成都高新區(qū)七上數(shù)學(xué)期末考試試卷【含答案】
- 企業(yè)員工食堂管理制度框架
- 《辣椒主要病蟲害》課件
- 電力溝施工組織設(shè)計(jì)-電纜溝
- 2024年煤礦安全生產(chǎn)知識(shí)培訓(xùn)考試必答題庫及答案(共190題)
- 《法律援助》課件
- 小兒肺炎治療與護(hù)理
- GB/T 36547-2024電化學(xué)儲(chǔ)能電站接入電網(wǎng)技術(shù)規(guī)定
- 學(xué)校物業(yè)管理投標(biāo)書范本
- 《高處作業(yè)安全》課件
評(píng)論
0/150
提交評(píng)論