一般來說,VB和VC共同編程有3種方式:一種是VC生成DLL,在VB中調用DLL;一種是VC生成ActiveX控件(.ocx),在VB中插入;還有一種是在VC中生成ActiveX Automation服務器,在VB中調用。
相對而言,第一種方法對VC編程者的要求最低,但要求你的伙伴進行配合,我推薦這種方法。
先說說VC++的編程。首先在VC++中生成Win32 DLL工程。在這個工程中添加幾個函數供VB用戶調用。一個DLL中的函數要想被VB調用,必須滿足兩個條件:一是調用方式為stdcall,另一個是必須是export的。要做到第一條,只須在函數聲明前加上__stdcall關鍵字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二條,需要在*.def文件中加上如下的幾行:
EXPORTS
sample @1
這裡的sample是你要在VB中調用的函數名,@1表示該函數在DLL中的編號,每個函數都不一樣。注意這裡的函數名是區分大小寫的。至於需要傳遞大量數據,可以這樣做,在VB中用一個數組存放數據,然後將該數組的大小和地址傳給VC(至於如何在VB中編程我會在下面介紹)。就象上面的例子,nLen是數組大小,buffer是數組地址,有了這兩條,你可以象使用VC的數組一樣進行處理了。至於輸出圖形,可以生成WMF或BMP格式,讓VB調用。不過,我認為也可以直接輸出到視窗,只要VB將窗口的句柄hWnd和hDC以及視窗的繪圖位置(VB和VC采用的坐標系必須一致才行)傳給VC就行了。而VB的 AutoRedraw屬性必須為False,在Paint事件中調用VC的繪圖程序。
再談談VB的編程。VB調用DLL的方法和調用Windows API的方法是一樣的,一般在VB的書中有介紹。對於上面一個例子,先要聲明VC函數:
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
這裡mydll.dll是你的dll的名字。你可能已經注意到了兩個參數的聲明有所不同,第一個參數加上了ByVal。規則是這樣的:如果在VC中某個參數聲明為指針和數組,就不加ByVal,否則都要加上ByVal。在VB中調用這個函數采用這樣的語法:
sample 10, a(0)
這裡的a()數組是用來存放數據的,10為數組長度,這裡的第二個參數不能是a(),而必須是要傳遞的數據中的第一個。這是VB編程的關鍵。
下面在說幾個可能遇到的問題。一個問題是VB可能報告找不到dll,你可以把dll放到system目錄下,並確保VB的Declare語句正確。另一個問題是VB報告找不到需要的函數,這通常是因為在VC中*.def文件沒設置。第三種情況是VB告訴不能進行轉換,這可能是在VC中沒有加上 __stdcall關鍵字,也可能是VB和VC的參數類型不一致,注意在VC中int是4個字節(相當於VB的Long),而VB的Integer只有2 個字節。必須保證VB和VC的參數個數相同,所占字節數也一致。最後一個要注意的問題是VC中絕對不能出現數組越界的情況,否則會導致VB程序崩潰