本文就如何把VC++代碼轉換成VB代碼給出了一些策略和方法.
1.定義常量
我們首先看第一個例子:
#define STD_COPY1//COMMCTRL.H
在VC++代碼中用#define定義常量,而在VB中是用Const來定義,因此轉換成VB的代碼是:
Public ConstSTD_COPY=1
第二個例子:
#define LB_SELECTSTRING0x018C//WINUSER.h
這有一個問題,VC++中所有以"0x"開頭的值是十六進制,而在VB中表示十六進制要用"&H"開頭.因此轉換成VB的代碼為:
Const LB_SELECTSTRING=0x018C
第三個例子:
#define TCN_FIRST(0U-550U)
這裡有個特別的是定義的值是以"U"結尾,這是意味著該常量的類型是"unsigned long"(在VB中不支持該數據類型).但是unsignedlong和signedlong(在VB中是Long)兩種數據類型的值在存儲方式上是一樣的,只是表現的形式不同.因此,我們只需要去掉末尾的"U"就可以了.
Const TCN_FIRST=(0-550)這同樣適合以"L"結尾的值
另外,對於#define CDDS_ITEMPOSTERASE(CDDS_ITEM |CDDS_POSTERASE),我們需要用"Or"來取代"|"
2.結構的定義
我們先看VC++定義的一個比較簡單的結構:
type defstruct tagTBSAVEPARAMSA{
HKEYhkr;
LPCSTRpszSubKey;
LPCSTRpszValueName;
}TBSAVEPARAMSA,FAR*LPTBSAVEPARAMSA;
首先我們需要把第一行的"type defstruct"轉換成"Public Type"
Public Type tagTBSAVEPARAMSA
然後處理結構成員:
HKEYhkr;
LPCSTRpszSubKey;
LPCSTRpszValueName;
對於第一個成員類型HKEY.我們要知道VC++中的以"H"開頭的大部分數據類型代表的是某種句柄.在VB中每一個Form對象和許多控件都有一個hWnd屬性,它代表所屬窗口的句柄.hWnd的類型是Long,並且所有用來存儲句柄的變量類型都是Long.因此,該成員在VB中定義為:
hkrAsLong
同樣的,VC++數據類型LPSTR和LPCSTR代表指向字符串的指針,在VB中可以當作String類型.因為當你傳送結構給API時,VB將把結構中所有的String轉換成指向ANSI字符串的指針.因此後兩個成員在VB中表示為:
pszSubKeyAsString
pszValueNameAsString
對於最後一行"}TBSAVEPARAMSA,FAR*LPTBSAVEPARAMSA;"我們只需要用" EndType "取代
就可以了.轉換成VB代碼後完整的結構為:
Public Type tagTBSAVEPARAMSA
hkrAsLong
pszSubKeyAsString
pszValueNameAsString
End Type
以下是VC++中數據類型對應到VB中的數據類型
VC++ VB
short Integer
int Long
long Long
UNIT Long
ULONG Long
WORD DWordLong
WPARAM LPARAMLong
WMSG UMSGLong
HRESULT Long
BOOL Boolean
COLORREF Long
HWND,HDC,HBRUSH,HKEY,等等 Long
LPSTR LPCSTR String
LPWSTR,OLECHARBSTR String
LPTSTR String
VARIANT_BOOL Boolean
unsignedchar Byte
BYTE Byte
VARIANT Variant
(任何以*或**結尾的數據類型) Long
3.函數的轉換
我們知道VB提供了APIVIEweradd-in,但是有很多API函數它並沒有包括在內. 因此知道如何把VC++函數轉換成VB的函數格式是非常重要的.先看第一個例子:
WINCOMMCTRLAPIHWNDWINAPI
CreateStatusWindowsA(LONGstyle,
LPCSTRlpszTest,HWNDhwndParent,UINTwID);
這個函數創建一個StatusBar控件.從WINCOMMCTRLAPI可以得知該函數來自動態鏈接庫ComCtl32.dll.(有時,我們需要從MSDN中查找某函數對應的DLL)然後我們知道該函數的返回類型是HWND,對應VB的類型是Long.最後,根據前面提到類型對應表,很容易的轉換相應的函數參數.
Public Declare Function CreateStatusWindowA Lib "ComCtl32.dll" (Byvalstyle As Long, ByvallpszText As String, ByvalhwndParent As Long,ByvalwID As Long) As Long