現(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:\program files\devstudio\wjfprojects\Hr0506dllMnsr\debug\Hr0506dllMnsr.dll″(CmdNum As Integer) As Boolean 聲明以后,函數(shù)SendCommand 就可以當(dāng)作VB自己的函數(shù)使用了。 但是,怎樣將VC中的各種消息(例如各種底層的狀態(tài))及時(shí)通知VB并且VB能夠及時(shí)處理呢?這是VB的一個(gè)缺陷:不能方便地處理自定義的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以上的版本中,可以定義自己的事件(EVENT),但比較麻煩。這里介紹一種簡單的方法,讓VB巧妙地處理自定義的消息: 1.首先將VB窗體中TextBox控件Text1的句柄傳遞給DLL(注意:VB中的TextBox控件有hWnd屬性)。 VB中: ′聲明DLL中的函數(shù) Declare Function SendhWnd Lib ″c:\program files\devstudio\wjfprojects\Hr0506dllMnsr\debug\ 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_DATACOME ″); 3.在Text1_Change事件中處理消息: Private Sub Text1_Change() Select case Text1.text case W_TAPI_DATACOME: ′消息處理語句 case MW_TAPI_BUSY: ′消息處理語句 default: ′其他處理語句 End Select End Sub 以上方法在作者編寫的“TAPI遠(yuǎn)程監(jiān)控系統(tǒng)”中使用,效果很好。
|