對於大多數VB的愛好者來說,在很多情況下都想通過使用API函數來實現一些比較高級的功能或達到某種特殊效果,這就需要用到一些VC++的代碼.
本文就如何把VC++代碼轉換成VB代碼給出了一些策略和方法.
1.定義常量
我們首先看第一個例子:
#defineSTD_COPY1//COMMCTRL.H
在VC++代碼中用#define定義常量,而在VB中是用Const來定義,因此轉換成VB的代碼是:
PublicConstSTD_COPY=1
第二個例子:
#defineLB_SELECTSTRING0x018C//WINUSER.h
這有一個問題,VC++中所有以"0x"開頭的值是十六進制,而在VB中表示十六進制要用"&H"開頭.因此轉換成VB的代碼為:
ConstLB_SELECTSTRING=0x018C
第三個例子:
#defineTCN_FIRST(0U-550U)
這裡有個特別的是定義的值是以"U"結尾,這是意味著該常量的類型是"unsigned long"(在VB中不支持該數據類型).但是unsignedlong和signedlong(在VB中是Long)兩種數據類型的值在存儲方式上是一樣的,只是表現的形式不同.因此,我們只需要去掉末尾的"U"就可以了.
ConstTCN_FIRST=(0-550)這同樣適合以"L"結尾的值
另外,對於#defineCDDS_ITEMPOSTERASE(CDDS_ITEM |CDDS_POSTERASE),我們需要用"Or"來取代"|"
2.結構的定義
我們先看VC++定義的一個比較簡單的結構:
typedefstructtagTBSAVEPARAMSA{ HKEYhkr; LPCSTRpszSubKey; LPCSTRpszValueName; }TBSAVEPARAMSA,FAR*LPTBSAVEPARAMSA;
首先我們需要把第一行的"typedefstruct"轉換成"Public Type"
PublicTypetagTBSAVEPARAMSA
然後處理結構成員,
HKEYhkr; LPCSTRpszSubKey; LPCSTRpszValueName;
對於第一個成員類型HKEY.我們要知道VC++中的以"H"開頭的大部分數據類型代表的是某種句柄.在VB中每一個Form對象和許多控 加幸桓鰄Wnd屬性,它代表所屬窗口的句柄.hWnd的類型是Long,並且所有用來存儲句柄的變量類型都是Long.因此,該成員在VB中定義為:
hkrAsLong
同樣的,VC++數據類型LPSTR和LPCSTR代表指向字符串的指針,在VB中可以當作String類型.因為當你傳送結構給API時,VB將把結構中所有的String轉換成指向ANSI字符串的指針.因此後兩個成員在VB中表示為:
pszSubKeyAsString pszValueNameAsString 對於最後一行"}TBSAVEPARAMSA,FAR* LPTBSAVEPARAMSA;"我們只需要用 "EndType"取代
就可以了.轉換成VB代碼後完整的結構為:
PublicTypetagTBSAVEPARAMSA hkrAsLong pszSubKeyAsString pszValueNameAsString EndType
以下是VC++中數據類型對應到VB中的數據類型VC++數據類型VB數據類型
shortInteger intLong longLong UNITLong ULONGLong WORD,DWORDLong WPARAM,LPARAMLong WMSG,UMSGLong HRESULTLong BOOLBoolean COLORREFLong HWND,HDC,HBRUSH,HKEY,等等.Long LPSTR,LPCSTRString LPWSTR,OLECHAR,BSTRString LPTSTRString VARIANT_BOOLBoolean unsignedcharByte BYTEByte VARIANTVariant (任何以*或**結尾的數據類型)Long
3.函數的轉換
我們知道VB提供了APIVieweradd-in,但是有很多API函數它並沒有包括在內. 因此知道如何把VC++函數轉換成VB的函數格式是非常重要的.先看第一個例子:
WINCOMMCTRLAPIHWNDWINAPI CreateStatusWindowsA(LONGstyle, LPCSTRlpszTest,HWNDhwndParent,UINTwID);
這個函數創建一個StatusBar控件.從WINCOMMCTRLAPI可以得知該函數來自動態鏈接庫ComCtl32.dll.(有時,我們需要從MSDN中查找某函數對應的DLL)然後我們知道該函數的返回類型是HWND,對應VB的類型是Long.最後,根據前面提到類型對應表,很容易的轉換相應的函數參數.
PublicDeclareFunctionCreateStatusWindowALib "ComCtl32.dll"_ (ByvalstyleAsLong,_ ByvallpszTextAsString,_ ByvalhwndParentAsLong,ByvalwIDAsLong)AsLong