アンチウィルスベンダーによるIOfficeAntiVirusインターフェースの実装状況
どうなんだろーと思ったので、ちょっと調べたのですが、分からなくて。この情報少なすぎ。他の方法が用意されているのかな。
でも、もしかしたら、こういうこと?
- Windows XP SP2以降に導入されたWindowsセキュリティーセンターはアンチウィルスソフトがインストールされていないことをユーザーに警告する
- アンチウィルスベンダーは自社製品がアンチウィルスソフトであることをWindowsOSに知らせる必要がある
- WindowsセキュリティーセンターはIOfficeAntiVirusをチェックしてアンチウィルスソフトがインストールされていることを確認している
- → 全てのアンチウィルスソフトにIOfficeAntiVirusインターフェースが実装される
憶測なのですが、こういうことなら、Windows様っぽいなーとか思いました。
どうなんだろ。Mozilla FireFoxが採用するくらいなので、かなり使えるはずだと思っています。
IOfficeAntiVirusインターフェースが使えるかは、次のようなコードで確認できます。(VC++6 + PSDK で確認)
#define INITGUID #include <windows.h> #define AVVENDOR #include <msoav.h> #include <comcat.h> static BOOL _HasVirusScanFunction(); BOOL HasVirusScanFunction() { HRESULT hIntializeResult = CoInitialize(NULL); BOOL bSearchResult = _HasVirusScanFunction(); if (SUCCEEDED(hIntializeResult)) { CoUninitialize(); } return bSearchResult; } static BOOL _HasVirusScanFunction() { HRESULT hResult; ULONG nReceived; ICatInformation *pCatInfo; IEnumCLSID *pEnumerator; CLSID clsid; GUID guids[1]; guids[0] = CATID_MSOfficeAntiVirus; hResult = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC, IID_ICatInformation, (LPVOID *)&pCatInfo); if (FAILED(hResult)) { // Could not create category information class return FALSE; } hResult = pCatInfo->EnumClassesOfCategories(1, guids, 0, NULL, &pEnumerator); if (FAILED(hResult)) { // Could not get class enumerator for category return FALSE; } pEnumerator->Next(1, &clsid, &nReceived); if (nReceived == 0) { // No installed Anti Virus program return FALSE; } /* // VirusScan { IOfficeAntiVirus *pAntiVirus; MSOAVINFO stAvInfo; ZeroMemory(&stAvInfo, sizeof(stAvInfo)); stAvInfo.cbsize = sizeof(MSOAVINFO); stAvInfo.fPath = TRUE; stAvInfo.fInstalled = FALSE; stAvInfo.fReadOnlyRequest = TRUE; stAvInfo.fHttpDownload = FALSE; stAvInfo.hwnd = NULL; stAvInfo.pwzHostName = NULL; stAvInfo.pwzOrigURL = NULL; stAvInfo.u.pwzFullPath = L"c:\\tmp\\virus.zip"; hResult = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IOfficeAntiVirus, (LPVOID *)&pAntiVirus); if (FAILED(hResult)) { // Could not get class enumerator for category return FALSE; } HRESULT hScanResult = pAntiVirus->Scan(&stAvInfo); } */ return TRUE; }