VB與VC混合編程中處理消息的方法

字號:

現(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)"中使用,效果很好.