VB調(diào)用C程序的方法-動態(tài)鏈接庫法_第1頁
VB調(diào)用C程序的方法-動態(tài)鏈接庫法_第2頁
VB調(diào)用C程序的方法-動態(tài)鏈接庫法_第3頁
VB調(diào)用C程序的方法-動態(tài)鏈接庫法_第4頁
VB調(diào)用C程序的方法-動態(tài)鏈接庫法_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

精品文檔-下載后可編輯VB調(diào)用C程序的方法—動態(tài)鏈接庫法文中介紹了一種實現(xiàn)VB調(diào)用C語言程序的方法-動態(tài)連接庫法,給出了動態(tài)鏈接庫制

作的一般框架,通過實例描述了動態(tài)連接庫的實現(xiàn)及其制做方法、編程步驟,這種方法具有

普遍的意義。

關鍵詞VB動態(tài)連接庫DLLC程序

一、引言

VisualBasic(以下簡稱VB)是一種可視化的面向?qū)ο蟮木幊陶Z言,以其編程簡單、快捷

等特點,深受廣大WINDOWS程序員的青睞。利用VB開發(fā)界面友好、操作方便的軟件只需

很短的時間。但是VB運行速度較慢,對于龐大的科學計算問題,VB的這種慢速會使人難

以忍受。C語言是國際上非常流行的一種中級編程語言,以其靈活、高效等優(yōu)點而獲得廣

泛應用,許多的應用程序都是用C語言在DOS環(huán)境下編寫而成。那么如何發(fā)揮VB和C這兩

種語言的優(yōu)勢,用VB設計一種良好的forwindows界面來調(diào)用C語言程序,即實現(xiàn)VB調(diào)用C

語言程序呢?現(xiàn)有的文獻只提到動態(tài)鏈接庫(以下簡稱DLL)可以將這兩種語言連接起來,

但有講動態(tài)鏈接庫DLL的制做及其編程方法。本文詳細介紹了BorlandC環(huán)境下制作動態(tài)鏈

接庫以及VB調(diào)用fordos動態(tài)鏈接庫的的方法、步驟,并通過實例描述VB調(diào)用C程序的全過

程。

二、用BorlandC編寫DLL程序的方法

要想實現(xiàn)VB調(diào)用C程序,首先需要用BorlandC編寫動態(tài)連接庫DLL程序(假設DLL程序

取名為example)。動態(tài)鏈接庫包含四個文件:C語言源程序(.C)、模塊定義文件

(.DEF)、原型函數(shù)文件(.H)和工程文件(.PRJ)。下面分別詳細介紹一下這四種文件

的具體結構。

1、編寫C語言源程序的框架:

C語言源程序(example.C),它包括三種函數(shù):入口函數(shù)、輸出函數(shù)和終止函數(shù)。其具體

結構如下:

/*************************************/

/*文件名:example.C*/

/*************************************/

#includewindows.h

/***********入口函數(shù)***********/

intFARPASCALLibMain(HANDLEhInstance,

WORDwDataSeg,

WORDcbHeapSize,

LPSTRlpszCmdLine)

{

if(cbHeapSize!=0)

UnlockData(0);

return(1);

}

/***********輸出函數(shù)***********/

intFARPASCALexample(intparam1,...,charparamn)

{

/*C語言應用程序*/

}

/***********終止函數(shù)***********/

intFARPASCALWEP(int/*SystemExit*/)

{

return(1);

}

以上各組成部分參數(shù)的含義:Windows.h頭文件,它包含有數(shù)據(jù)類型的定義、API入口

點定義和其它有用的參數(shù)信息。PASCAL說明符定義該程序的傳遞參數(shù)和凈化堆棧的協(xié)定

(注意:DLL外部傳送的指針必須是遠指針FAR)。LibMain帶四個參數(shù):

hInstance、wDataSeg、cbHeapSize和lpszCmdLine。第一個參數(shù)hInstance是DLL事例句

柄,wDataSeg參數(shù)是數(shù)據(jù)段(DS)寄存器值,cbHeapSize參數(shù)是在模塊定義文件中定義

的堆的大小,LibMain使用該值使本地堆初始化。lpszCmdLine參數(shù)包括命令行信息,但

很少被DLL使用。一般來說,這四個參數(shù)是制作DLL通用的參數(shù)。

如果不想讓DLL數(shù)據(jù)被封住,那么必須調(diào)用unlockdata恢復正常的非鎖狀態(tài),如果DLL初始

化已經(jīng)成功,DLL則返回1,若不成功則返回0值,且DLL退出系統(tǒng)。

DLL的輸出函數(shù)實現(xiàn)用戶所要完成的任務,這部分是DLL的核心。它與一般C語言程序不同

之處在于無scanf函數(shù)。所有的外部指針都是遠指針FAR。畫直線函數(shù)要用lineto函數(shù)。

DLL包括一個終止函數(shù),終止函數(shù)有時稱為退出函數(shù),它的名字必須是WEP。且它可以被

包括在DLL模塊定義文件的EXPORTS段中。

2、模塊定義文件(.DEF)的結構和各段的意義

模塊定義文件的結構如下:

/*************************************/

/*文件名:example.DEF*/

/*************************************/

LIBRARYexample/*DLLname*/

DESCRIPTION''''example.DLL''''

EXETYPEWINDOWS

CODEPRELOADMOVEABLEDISCARDABLE

DATAPRELOADMOVEABLESINGLE

HEAPSIZE1024

EXPORTS

example@1

WEP@2

關鍵字LIBRARY是把這個模塊視為一個DLL,庫的名字example跟在其后,且必須與該庫

的名字、DEF中的DLL的文件名相一致。DESCRIPTION語句采用一個字符串,其長度可達

128個字符,通常用它來保存模塊描述的信息。EXETYPEwindows語句每個windows應用程

序和DLL都需要。DATA語句定義該庫數(shù)據(jù)段的內(nèi)存屬性,關鍵字MOVEABLE允許內(nèi)存管

理程序在必要時移動內(nèi)存段,關鍵字SINGLE是DLL必要,因為DLL總是有一個單一數(shù)據(jù)段,

而不管訪問它的應用程序的數(shù)量。HEAPSIZE語句用來定義一個DLL局部堆的初始規(guī)模,

執(zhí)行局部內(nèi)存分配的DLL必須在庫啟動時使該堆初始化,堆的大小被傳送給DLL的LiEntry

的程序。然后用該堆的大小調(diào)用Locallnit使DLL的局部堆初始化。

EXEPORTS語句定義將被用作來自應用程序或來自其它DLL入口點的程序,windows利用

這個信息建立一個序數(shù)入口值,序數(shù)入口值是一個優(yōu)化的值,允許動態(tài)連接機制更快塊操

作且使用較少的內(nèi)存。

一般來說,模塊定義文件(.DEF)的結構除取動態(tài)庫的名字不同外,其它結構都是固定

的。

3.建立原形函數(shù)文件(.H)

原形函數(shù)的功能是進一步聲明調(diào)用函數(shù)的函數(shù)名和傳遞的參數(shù),其形式為:

/*************************************/

/*文件名:example.H*/

/*************************************/

extern"C"int_exportFARPASCALexample(intparam1,...,charparamn);

4.建立工程文件(.PRJ)

工程文件中包含有example.C、example.DEF兩個文件后,然后編譯連接生成動態(tài)鏈接

庫即可。

以上是制作動態(tài)連接庫的框架,現(xiàn)在通過一個實例介紹制作動態(tài)鏈接庫的方法。如要

求程序完成功能為:打開一個數(shù)據(jù)文件讀出前兩個數(shù)據(jù),將這兩個數(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項中打開openprojectfile項并建立ADD.prj,在add

item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。

第二步,在BorlandC的options項的Applation中選擇WindowsDLL,再在Compile中選擇

Buildall,這樣就可生成動態(tài)鏈接庫ADD.DLL供VB調(diào)用。

三、VB3.0調(diào)用動態(tài)鏈接庫DLL方法

制作好DLL之后,就可以用VB調(diào)用它,實現(xiàn)VB調(diào)用C程序。VB程序要使用DLL中的函

數(shù),首先必須要有特殊的聲明,用Declare聲明語句在窗體級或模塊級或全局模塊的代碼

聲明段進行聲明,將動態(tài)鏈接庫中的函數(shù)聲明到VB中,供VB程序調(diào)用。

語句格式為:DeclareSub過程名Lib摽鈹黚_n[Alias"別名]([ByVal參數(shù)AS類型]),

或為DeclareFunction函數(shù)名Lib摽鈹黚_衃Alias"別名]([ByVal參數(shù)AS類型])AS

類型在聲明中首先用Declare關鍵字表示聲明DLL中的函數(shù)。在C語言中有的函數(shù)類型為

VOID,它表示不具有返回值,則必須用關鍵字Sub將其聲明成過程。有的函數(shù)具有返回

值,則必須用關鍵字Function將其聲明成函數(shù),并且在聲明語句的最后要用AS關鍵字指明

函數(shù)返回值的類型。

例如上面的ADD.DLL在VB中就可以聲明

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論