在VFP中調(diào)用API實現(xiàn)撥號上網(wǎng)

字號:

在Visual FoxPro 中實現(xiàn)撥號上網(wǎng)功能,難點在于如何調(diào)用相應(yīng)的WINDOWS API函數(shù)。與撥號網(wǎng)絡(luò)相關(guān)的幾個API函數(shù)需要復(fù)雜的結(jié)構(gòu)類型的參數(shù),在VFP幫助文件“程序員指南—訪問API”中有相關(guān)說明,但較為簡單,不足以解決問題,在此作進(jìn)一步探討。希望通過本文能解決實現(xiàn)撥號上網(wǎng)的實際問題,更希望通過這個例子幫助了解如何在VFP環(huán)境下調(diào)用參數(shù)復(fù)雜的API函數(shù),以擴(kuò)展VFP的應(yīng)用。
    因篇幅所限,本文僅論述關(guān)鍵部分,相關(guān)細(xì)節(jié)說明請參閱參考文件。
    WINDOWS API中RasDial函數(shù)可實現(xiàn)撥號上網(wǎng)功能,可在MSDN幫助中查到,其參數(shù)簡述如下:
    DWORD RasDial( // 返回四字節(jié)整數(shù),對應(yīng)VFP的INTEGER型變量
    LPRASDIALEXTENSIONS lpRasDialExtensions, // 指針,置NULL即可
    LPCTSTR lpszPhonebook, // 指針,置NULL即可
    LPRASDIALPARAMS lpRasDialParams,
    // 指針,指向參數(shù)結(jié)構(gòu)變量RASDIALPARAMS
    DWORD dwNotifierType, // 四字節(jié)整數(shù),置0即可
    LPVOID lpvNotifier, // 指針,置NULL即可
    LPHRASCONN lphRasConn // 指針,指向遠(yuǎn)程訪問連接句柄HRASCONN。
    // 調(diào)用RasDial前需先置HRASCONN為NULL
    );
    其中結(jié)構(gòu)RASDIALPARAMS描述如下:
    typedef struct _RASDIALPARAMS {
    DWORD dwSize; // 4字節(jié),值為本結(jié)構(gòu)占用總字節(jié)數(shù)
    // 調(diào)用此函數(shù)前必須給此變量賦值
    TCHAR szEntryName[RAS_MaxEntryName + 1];
    // 257字節(jié),撥號網(wǎng)絡(luò)電話簿中連接名,
    // 為空則在第一個MODEM端口上,用下述電話號碼、用戶名、密碼建立連接
    TCHAR szPhoneNumber[RAS_MaxPhoneNumber + 1]; // 129字節(jié),電話號碼
    TCHAR szCallbackNumber[RAS_MaxCallbackNumber + 1];
    // 129字節(jié),回叫號碼,置空
    TCHAR szUserName[UNLEN + 1]; // 257字節(jié),用戶名
    TCHAR szPassword[PWLEN + 1]; // 257字節(jié),密碼
    TCHAR szDomain[DNLEN + 1] ; // 16字節(jié),域名,置空
    #if (WINVER >= 0x401) // 缺省情況下,WINVER=Ox400,無以下兩項
    DWORD dwSubEntry;
    DWORD dwCallbackId;
    #endif
    } RASDIALPARAMS;
    以上RAS_MaxEntryName等預(yù)定義值,可從RAS.H與LMCONS.H中查出。難點在于dwSize值的確定:將結(jié)構(gòu)中各變量字節(jié)長度累加應(yīng)為1049字節(jié),但將1049代入dwSize去調(diào)用RasDial函數(shù)卻返回錯誤。啟動VC++6.0定義了一個RASDIALPARAMS型結(jié)構(gòu)變量后,發(fā)現(xiàn)其長度為1052字節(jié),即最接近1049且能被4(DWORD所占字節(jié)數(shù))整除的值。