国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - VB - 分享如何在VB中調(diào)用VC編寫的DLL

分享如何在VB中調(diào)用VC編寫的DLL

2021-10-07 23:01VB教程網(wǎng) VB

一般來說,VB和VC共同編程有3種方式:一種是VC生成DLL,在VB中調(diào)用DLL;一種是VC生成ActiveX控件(.ocx),在VB中插入;還有一種是在VC中生成ActiveX Automation服務(wù)器,在VB中調(diào)用

一般來說,VB和VC共同編程有3種方式:一種是VC生成DLL,在VB中調(diào)用DLL;一種是VC生成ActiveX控件(.ocx),在VB中插入;還有一種是在VC中生成ActiveX Automation服務(wù)器,在VB中調(diào)用。相對而言,第一種方法對VC編程者的要求最低,但要求你的伙伴進行配合,我推薦這種方法。
先說說VC++的編程。首先在VC++中生成Win32 DLL工程。在這個工程中添加幾個函數(shù)供VB用戶調(diào)用。一個DLL中的函數(shù)要想被VB調(diào)用,必須滿足兩個條件:一是調(diào)用方式為stdcall,另一個是必須是export的。要做到第一條,只須在函數(shù)聲明前加上__stdcall關(guān)鍵字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二條,需要在*.def文件中加上如下的幾行:

EXPORTS
sample @1
這里的sample是你要在VB中調(diào)用的函數(shù)名,@1表示該函數(shù)在DLL中的編號,每個函數(shù)都不一樣。注意這里的函數(shù)名是區(qū)分大小寫的。至于你說的需要傳遞大量數(shù)據(jù),可以這樣做,在VB中用一個數(shù)組存放數(shù)據(jù),然后將該數(shù)組的大小和地址傳給VC(至于如何在VB中編程我會在下面介紹)。就象上面的例子,nLen是數(shù)組大小,buffer是數(shù)組地址,有了這兩條,你可以象使用VC的數(shù)組一樣進行處理了。至于輸出圖形,可以生成WMF或BMP格式,讓VB調(diào)用。不過,我認為也可以直接輸出到視窗,只要VB將窗口的句柄hWnd和hDC以及視窗的繪圖位置(VB和VC采用的坐標系必須一致才行)傳給VC就行了。而VB的AutoRedraw屬性必須為False,在Paint事件中調(diào)用VC的繪圖程序。
再談?wù)刅B的編程。VB調(diào)用DLL的方法和調(diào)用Windows API的方法是一樣的,一般在VB的書中有介紹。對于上面一個例子,先要聲明VC函數(shù):
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
這里mydll.dll是你的dll的名字。你可能已經(jīng)注意到了兩個參數(shù)的聲明有所不同,第一個參數(shù)加上了ByVal。規(guī)則是這樣的:如果在VC中某個參數(shù)聲明為指針和數(shù)組,就不加ByVal,否則都要加上ByVal。在VB中調(diào)用這個函數(shù)采用這樣的語法:
sample 10, a(0)
這里的a()數(shù)組是用來存放數(shù)據(jù)的,10為數(shù)組長度,這里的第二個參數(shù)不能是a(),而必須是要傳遞的數(shù)據(jù)中的第一個。這是VB編程的關(guān)鍵。
下面在說幾個可能遇到的問題。一個問題是VB可能報告找不到dll,你可以把dll放到system目錄下,并確保VB的Declare語句正確。另一個問題是VB報告找不到需要的函數(shù),這通常是因為在VC中*.def文件沒設(shè)置。第三種情況是VB告訴不能進行轉(zhuǎn)換,這可能是在VC中沒有加上__stdcall關(guān)鍵字,也可能是VB和VC的參數(shù)類型不一致,注意在VC中int是4個字節(jié)(相當(dāng)于VB的Long),而VB的Integer只有2個字節(jié)。必須保證VB和VC的參數(shù)個數(shù)相同,所占字節(jié)數(shù)也一致。最后一個要注意的問題是VC中絕對不能出現(xiàn)數(shù)組越界的情況,否則會導(dǎo)致VB程序崩潰

1. 調(diào)用DLL的優(yōu)越性

  動態(tài)鏈接庫(DLL)作為Windows操作系統(tǒng)的基礎(chǔ),具有優(yōu)越的應(yīng)用性能:
  DLL擴展了應(yīng)用程序的特性。由于DLL能夠動態(tài)地裝入進程的地址空間,因此應(yīng)用程序能夠在運行時確定需要執(zhí)行什么操作,然后裝入相應(yīng)的代碼,以便根據(jù)需要執(zhí)行這些操作。
  DLL可以用多種語言進行編寫。例如用VB來編寫應(yīng)用程序的界面,而用C++來編寫諸如算法、通訊之類的底層操作。
  DLL簡化了軟件項目的管理。如果在軟件開發(fā)過程中不同的工作小組在不同的模塊上工作,那么這個項目管理起來比較容易。
  DLL有助于節(jié)省內(nèi)存。如果兩個或多個應(yīng)用程序使用同一個DLL,那么該DLL的頁面只要放入RAM一次,所有的應(yīng)用程序都可以共享它的各個頁面。
  DLL有助于資源的共享。DLL可以包含對話框模板、字符串、圖標和位圖等資源,多個應(yīng)用程序能夠使用DLL來共享這些資源。
  DLL有助于應(yīng)用程序的本地化。例如,只包含代碼而不包含用戶界面組件的應(yīng)用程序可以加載包含本地化用戶界面組件的DLL 。
  DLL有助于解決平臺差異。不同版本的Windows配有不同的函數(shù),開發(fā)人員常常想要調(diào)用新的函數(shù)。但是,如果源代碼包含了對一個新函數(shù)的調(diào)用,而應(yīng)用程序?qū)⒁诓荒芴峁┰摵瘮?shù)的Windows版本上運行,那么操作系統(tǒng)的加載程序?qū)⒕芙^運行該進程。如果將這些新函數(shù)保存在DLL中,那么應(yīng)用程序就能夠?qū)⑺鼈兗虞d到Windows的老版本上,就可以成功地調(diào)用該函數(shù)。

2.找到DLL的入口點

  初次接觸DLL的用戶經(jīng)常會遇到一個問題:在VC環(huán)境下創(chuàng)建的DLL,在VC里運行的好好的,可在VB應(yīng)用程序中調(diào)用時卻老是出現(xiàn)"調(diào)用約定錯誤"、"找不到入口點"之類的錯誤。這主要是由以下疏漏造成的。
  首先,要注意DLL中的函數(shù)和VB中的函數(shù)聲明在名稱、返回類型、參數(shù)類型、參數(shù)個數(shù)等方面必須完全相同,尤其要注意大小寫的問題。
  其次,在DLL的.def文件中必須加上入口函數(shù)。
  最后,在函數(shù)定義前必須加上extern "c",_stdcall關(guān)鍵字。
  具體格式可參看應(yīng)用實例。


3.?dāng)?shù)組參數(shù)在DLL中的傳遞

  由于DLL經(jīng)常用來進行一些底層的運算操作,因此應(yīng)用程序常需要傳遞大量的數(shù)據(jù)給DLL。在C++中,指針是進行數(shù)組操作的最佳選擇,但VB中沒有指針的概念。這通常可用兩種方法來解決。
  其一,在VB中聲明DLL時,用byref來代替byval,即可將數(shù)組指針傳遞給DLL。
  另外,將數(shù)組聲明為變體型(variant),即可直接將數(shù)組傳遞給DLL。


4.應(yīng)用實例

  以下通過一具體實例來說明在VB中調(diào)用VC環(huán)境下創(chuàng)建的DLL的過程。
  創(chuàng)建一用于信號處理的DLL,"SigPro.dll",其中有一個用于富氏計算的函數(shù)"Fourier"。

VC中的聲明:

在"SigPro.h"中加入以下代碼,

復(fù)制代碼 代碼如下:


extern "C"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
在"SigPro.cpp"中加入以下代碼,
extern "C"
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int i;
double result=0.0;

 

if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
else
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
result =result*2/NumSam;
return result;
}

 

在"SigPro.def"中加入以下代碼,
  EXPORTS
  Fourier

VB中的調(diào)用聲明:
  Public Declare Function Fourier Lib "SigPro" (ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕一区二区三区精彩视频 | 婷婷激情综合 | 欧美日韩一区在线 | 欧美成人精品激情在线观看 | 天天操人人干 | 男女免费视频 | 亚洲伊人久久综合 | 国产真实乱全部视频 | 直接看av的网站 | 91精品国产欧美一区二区成人 | 国产精品第一国产精品 | 欧美一区二区黄色 | 国产精品夜间视频香蕉 | 天天操天天干天天 | 久草毛片 | 久久久久黑人 | 国产精品免费视频观看 | 久久久成人精品 | 亚洲视频在线免费观看 | www.一区| 国产中文字幕一区 | 午夜视频在线观看网站 | 亚洲视频精品 | 综合亚洲精品 | 婷婷中文字幕 | a视频网站| 一区二区三区视频在线观看 | 黄网在线观看 | 中文字幕亚洲二区 | 亚洲日韩中文字幕在线播放 | av看片| 免费看黄色一级电影 | 老色批影院 | 日韩成人在线播放 | 国产精品极品美女在线观看免费 | 国产成人综合av | 91麻豆精品国产91久久久更新资源速度超快 | 成人aaa | 91精品国产综合久久久久 | 日本激情视频 | 亚洲毛片在线 |