問題的提出:
我使用MFC編寫一個APP,要求About對話框中顯示LOGO、公司名、地址和公司的URL鏈接。使用戶點擊URL鏈接以後,啟動浏覽器訪問Web頁面,這種對話框中的熱鏈接使應用程序增色不少。我琢磨的方法是 從系統注冊表中通過查找.htm 或 .html文件的關聯程序來獲得缺省浏覽器的名字,這樣好象有很多工作要做。此外,如果浏覽器已經打開,總是開始一個新的實例替代當前已有的一個實例。想找一個容易一 點的方法,但我查過有關的資料,沒有收獲,請高手指教。
解決方法:
如果有這樣的一個API函數該多好:OpenThisHereURLForMeNowPlease(),問題不就解決了!!我告 訴你吧,有, 但它不是你所想象的那個函數。到目前為止,有關文檔中還沒有提到過這麼一個有用的函 數,它能打開桌面上的任何文件,也能打開Internet URL。唯一我能找到的參考資料是在Microsoft? Access KnowledgeBase中很暧昧地提到過這個函數。
這個不可思議的函數就是:ShellExecute,取代了WinExec。你可以給它任何文件的名字,它都能識 別出來並打開它。例如:
ShellExecute (NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
用缺省的位圖編輯器打開一個叫iloveu.bmp的位圖文件,這個缺省的位圖編輯器可能是 Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
有關ShellExecute的詳細用法自己去參考MSDN吧,重要的是你知道了這個函數能打開任何文件,甚至是桌面和URL快捷方式(.ink或.url)。ShellExecute解析系統注冊表HKEY_CLASSES_ROOT中所有的內容,判斷啟動那一個執行程序,並且啟動一個新的實例或使用DDE將文件名連到一打開的實例。然後,ShellExecute 返回打開文件的應用的實例句柄。
更奇妙的是ShellExecute不僅能打開機器上的文件,還能打開Internet的站點地址。例如:
ShellExecute(NULL, "open", "http://www.microsoft.com",
NULL, NULL, SW_SHOWNORMAL);
這個代碼使你能訪問微軟的主頁。當ShellExecute遇到文件名前面的“http:”時,可以判斷出要打開的文件是Web文件,隨之啟 動Internet Explorer 或者 Netscape Navigator 或者任何你使用的別的浏覽器打開文件。ShellExecute還能識別其它協議,象FTP、GOPHER。甚至識別“mailto”,如果文件名指向 “mailto:[email protected]”,它啟動電子郵件程序並打開一個待編輯的新郵件。總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。如果將第二個參數 “OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute將能打印文 件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功 能更強,它的用法參見有關文檔"> 或者任何你使用的別的浏覽器打開文件。ShellExecute還能 識別其它協議,象FTP、GOPHER。甚至識別“mailto:”,如果文件名指向“mailto:[email protected]”,它啟動電子郵件程序並打開一個待編輯的新郵件"> 或者任何你使用的別的浏覽器打開文件。ShellExecute還能識別其它協議,象FTP、GOPHER。甚至識別“mailto:”,如果文件名指 向“mailto:[email protected]”,它啟動電子郵件 程序並打開一個待編輯的新郵件。
總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。如果將第二個參數“OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute將能打印文 件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功 能更強,它的用法參見有關文檔。
現在,你知道了ShellExecute的秘密,用它很容易增加一個鏈接到你的About對話框。不是嗎。:)