現(xiàn)在越來越多的人彩VB與VC的混合編程:用VB快速開發(fā)出漂亮的界面以及外圍處理程序,再用VC編寫底層的各種操作,例如內(nèi)存的操作,IO端口的操作等,VC中還可以嵌入?yún)R編語言進(jìn)行更底層的操作.
一般的做法是將VC程序編譯成DLL,在VB中用DECLARE語句聲明DLL中的函數(shù),例如:
Declare Function SendCommand Lib "c:\windows\hr0506dllmnsr.dll" (CmdNum As Integer) As Boolean
聲明以后,函數(shù)SendCommand就可以當(dāng)作VB自己的函數(shù)使用了.
但是,怎樣將VC中的各種消息及時通知VB并且VB能夠及時處理呢?這是VB的一個缺陷:不能方便地處理定義WINDOWS的消息.例如在VC中自定義了兩條消息:MW_TAPI_DATACOME, MW_TAPI_BUSY,在C語言中,用PostMessage(hWnd,MW_TAPI_CONNECTED,0,0);語句可以很方便地將MW_TAPI_CONNECTED消息傳遞給窗體(窗體句柄為hWnd),在主回調(diào)函數(shù)中就可以處理了.但是要把這條消息傳遞給VB,并讓VB處理這條消息,并不太容易.雖然在VB5.0以上版本中,可以定義自己的事件,但比較麻煩.這里介紹一種簡單的方法,讓VB巧妙的處理自定義的消息:
1.首先將VB窗體中TextBox控件TEXT1的句柄傳遞給DLL(注意:VB中的TEXTBOX控件有hWnd屬性).
VB中:’’聲明DLL中的函數(shù)
Declare Function SendhWnd Lib "c:\windows\hr0506dllmnsr.dll" ((ByVal hWnd As Long) As Boolean
’’傳遞TEXT1的句柄
SendhWnd(text1.hWnd)
VC中://句柄接收函數(shù)
declspec(dllexport) BOOL GethWnd(HWND hWnd1)
{hWnd=hWnd1;
if (hWnd=NULL)
{return FALSE;}
return TRUE;}
2.在VC中用API函數(shù)SetWindowText取代PostMessage直接發(fā)送消息給VB中的TEXT1控件.
SetWindowText(hWnd,"MW_TAPI_DATACOM");
3.在TEXT1_CHANGE事件中處理消息:
Private Sub Text1_Change()
Select case Text1.text
case MW_TAPI_DATACOME;
case MW_TAPI_BUSY;
default;
End Select
End Sub
以上方法在作者編寫的"TAPI遠(yuǎn)程監(jiān)控系統(tǒng)"中使用,效果很好.
一般的做法是將VC程序編譯成DLL,在VB中用DECLARE語句聲明DLL中的函數(shù),例如:
Declare Function SendCommand Lib "c:\windows\hr0506dllmnsr.dll" (CmdNum As Integer) As Boolean
聲明以后,函數(shù)SendCommand就可以當(dāng)作VB自己的函數(shù)使用了.
但是,怎樣將VC中的各種消息及時通知VB并且VB能夠及時處理呢?這是VB的一個缺陷:不能方便地處理定義WINDOWS的消息.例如在VC中自定義了兩條消息:MW_TAPI_DATACOME, MW_TAPI_BUSY,在C語言中,用PostMessage(hWnd,MW_TAPI_CONNECTED,0,0);語句可以很方便地將MW_TAPI_CONNECTED消息傳遞給窗體(窗體句柄為hWnd),在主回調(diào)函數(shù)中就可以處理了.但是要把這條消息傳遞給VB,并讓VB處理這條消息,并不太容易.雖然在VB5.0以上版本中,可以定義自己的事件,但比較麻煩.這里介紹一種簡單的方法,讓VB巧妙的處理自定義的消息:
1.首先將VB窗體中TextBox控件TEXT1的句柄傳遞給DLL(注意:VB中的TEXTBOX控件有hWnd屬性).
VB中:’’聲明DLL中的函數(shù)
Declare Function SendhWnd Lib "c:\windows\hr0506dllmnsr.dll" ((ByVal hWnd As Long) As Boolean
’’傳遞TEXT1的句柄
SendhWnd(text1.hWnd)
VC中://句柄接收函數(shù)
declspec(dllexport) BOOL GethWnd(HWND hWnd1)
{hWnd=hWnd1;
if (hWnd=NULL)
{return FALSE;}
return TRUE;}
2.在VC中用API函數(shù)SetWindowText取代PostMessage直接發(fā)送消息給VB中的TEXT1控件.
SetWindowText(hWnd,"MW_TAPI_DATACOM");
3.在TEXT1_CHANGE事件中處理消息:
Private Sub Text1_Change()
Select case Text1.text
case MW_TAPI_DATACOME;
case MW_TAPI_BUSY;
default;
End Select
End Sub
以上方法在作者編寫的"TAPI遠(yuǎn)程監(jiān)控系統(tǒng)"中使用,效果很好.

