編寫軟件的時候經常要遇到的情況就是需要從互聯網上下載文件(比如升級程序或者獲取程序信息等),一般來說我們使用的都是URLDownloadToFile函數,函數原型如下:
HRESULT URLDownloadToFile(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
其中的pCaller、dwReserved和lpfnCB這三個參數都不重要,最主要的是szURL(要下載的文件url地址)和szFileName(要保存的文件路徑和文件名)這兩個參數,這個函數很方便,在哪種語言中調用都比較簡單,但目前這個函數已經被多款防病毒軟件盯上了,我之前寫的一個程序A中只要調用該函數馬上就會被瑞星誤報,原因主要是太多的下載者程序和木馬軟件使用該函數下載病毒文件,雖然我的這個程序沒什麼危害但總被這樣誤報心裡也確實不舒服,查了下msdn,找到了一個類似的函數:URLDownloadToCacheFile,可以實現同樣的功能,但由於該函數在IE本身中就有很多調用,所以肯定不會被誤殺,這個函數的原型如下:
HRESULT URLDownloadToCacheFile(
LPUNKNOWN lpUnkcaller,
LPCSTR szURL,
LPTSTR szFileName,
DWORD dwBufLength,
DWORD dwReserved,
IBindStatusCallback *pBSC
);
其實跟URLDownloadToFile是很相似的,其中的lpUnkcaller、dwReserved和*pBSC參數可以不指定,一定要有的參數是szURL(要下載的文件url地址)、szFileName(保存文件名的指針)、dwBufLength(文件名緩沖區長度),該函數會默認下載文件到ie緩存目錄裡(看函數名就能想到),szFileName中保存的是文件路徑,調用的時候可以直接獲取szFileName打開文件。
用URLDownloadToCacheFile替換URLDownloadToFile函數再編譯我之前所說的程序A,使用VIRUSTOTAL查毒,誤報現象得以解除。