用VC++6.0編寫撥號程式 撥接是編寫網路應用軟體常用的操作,程式在運行某些遠程網上操作前,需要先撥號與網路連接,完成操作後由必須收線斷開。在Windows 95/98的"撥號網路"中,雖然提供撥號功能,但無法直接讓自己開發的應用程式來調。而在系統註冊的常用的控制項當中又沒有提供。 本方法是利用VC++製作一個撥號控制項,提供撥號與收線功能。VC++ 6.00提供控制項的建立引導(MFC ActiveX ControlWizard)可以快速產生ActiveX 控制項的程式架構。撥號功能是由VC++提供的 rasapi32.lib 的函數庫支援的,函數及變數在 ras.h 檔案頭定義。函數RasDial()實現撥號功能,RasHangUp()用來終止撥號連線。函數調用方法: DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn ); DWORD dwRet = RasHangUp( hRasConn ); 其中: rdParams 為 RASDIALPARAMS 結構, 主要參數定義如下: DWORD dwSize 結構變數的大小; TCHAR szEntryName[] 撥號網路中建立的串連名; TCHAR szPhoneNumber[] 電話號碼, 若採用 szEntryName 中定義的號碼,置為NULL 值; CHAR szCallbackNumber[] 回撥號碼,不用時置為NULL; TCHAR szUserName[] 使用者名稱; TCHAR szPassword[] 使用者口令; TCHAR szDomain[] 使用者權限驗證域, 若為'*'採用szEntryName 中定義的域進行驗證。 HRasConn 是 HRASCONN 結構,作遠程撥號連線控制代碼。 一、 建立工程項目 啟動CV++整合式開發環境,開啟"New"對話方塊,選中Projects中的 "MFC ActiveX Control Wizard", 在Project name 項輸入"Dialer" ,在Location 項會產生相應的路徑。單擊OK鈕進入第二步,保留預設值。單擊Next 進入最後一步,選中 Invisible at run time (運行時視窗不可見),其餘保持預設。按Finish 鈕,彈出一個資訊對話方塊,按OK鈕完成工程項的建立。 二、修改控制項表徵圖
工程項自動產生一個15 X 15 Bitmap 的位元影像,該圖將在VB 的資源工具箱中顯示為一個表徵圖。實際標可以顯示到 25 X 25 大小尺寸的位元影像。您需要將該位元影像改為自己的位元影像。VC++整合式開發環境提供繪圖工具讓您修改。 三、 制控制項介面
在應用程式設計時,嵌入的控制項會顯示一個介面。工程項建立時自動產生一個橢圓例圖。在這裡我們要去掉畫橢圓的代碼,並增加如下代碼來限制控制項視窗的大小及畫出控制項設計時的顯示表徵圖: void CDialerCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { // TODO: Replace the following code with your own drawing code. //pdc- >FillRect(rcBounds,CBrush::FromHandle ((HBRUSH)GetStockObject(WHITE_BRUSH))); //pdc->Ellipse(rcBounds); //限制控制項視窗大小 if (rcBounds.Height!=25 || rcBounds.Width!=25)SetControlSize(25,25); //顯示位元影像 CBitmap bitmap; CBitmap* pOldBitmap; CDC MemDC; MemDC.CreateCompatibleDC(pdc); bitmap.LoadBitmap(IDB_DIALER); pOldBitmap=MemDC.SelectObject(&bitmap); pdc->BitBlt(0,0,48,48,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); } 四、 添加撥號庫及標頭檔---- 將rasapi32.lib 及 ras.h 加到工程項。 五、 添加控制項屬性 我們要在控制項中設定一些屬性來實現應用程式與控制項的傳遞參數及控制動作。在Class Wizard 的 Automation 標籤中 , Class name 項選中 CDialerCtrl ,單擊 Add Property 按鈕,增加控制項屬性。 六、 增加撥號及收線函數 bool CDialerCtrl::DialUp(){ //撥號函數 RASDIALPARAMS rdParams; rdParams.dwSize = sizeof(RASDIALPARAMS); lstrcpy( rdParams. szEntryName, m_netWorking); lstrcpy( rdParams.szPhoneNumber, m_phone); rdParams.szCallbackNumber[0] = '/0'; lstrcpy( rdParams.szUserName, m_userName ); lstrcpy( rdParams.szPassword, m_passWord ); rdParams.szDomain[0] = '*'; hRasConn = NULL; //hRasConn 為 HRASCONN 類型的變數; DWORD dwRet = RasDial( NULL, NULL, &rdParams, 0L, NULL, &hRasConn ); if ( dwRet == 0 ) {m_message="OK!"; m_returnCode = deRet; return true;} //這裡省去出錯處理代碼 return false; } bool CDialerCtrl::HandUp(){ //收線函數 DWORD dwRet = RasHangUp( hRasConn ); //這裡省去出錯處理代碼 return true; } 七、 增加動作函數 控制項的Action 的值一有改變將自動運行該函數,Action 有兩個動作:1.撥號 2.收線。 void CXiaXinDialCtrl::OnActionChanged() { // TODO: Add notification handler code if (m_action==1) DialUp(); //調用撥號函數 if (m_action==2) HandUp(); //調用收線函數 SetModifiedFlag(); } 八、 編譯,連結,自動註冊 啟動VC++的建立(build)動作,將實行編譯,連結產生 Dialer.ocx 並自動註冊到本機。這時您可以啟動VB 開發平台 開啟 Components 就可以看到剛註冊的 Dialer ActiveX Control Module 。 九、 VB 的調用方法 在VB的開發中,您可以和通用的控制項一樣使用Dialer.ocx。調用方法如下: Private Sub Command1_Click() Dialer1.NetWorking = Text1.Text Dialer1.UserName = Text2.Text Dialer1.PassWord = Text3.Text Dialer1.Phone = Text4.Text Label5.Caption = "撥號中..." Dialer1.Action = 1 Labe15.Caption = Dialer1.Message ' 如果接通 視窗最小化 If XiaXinDial1.ReturnCode = 0 Then Form1.WindowState = 1 End Sub |