64,647
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <locale.h>
#include <Iads.h>
#include <ActiveDS.h>
#include <AdsHlp.h>
#include <map>
#define SAFE_RELEASE(p) { if(p) { p->Release(); p = NULL; } }
#pragma comment(lib, "adsiid.lib")
#pragma comment(lib, "activeds.lib")
using namespace std;
const WCHAR* g_pszW3SVC = L"IIS://localhost/W3SVC";
class CWebPathMap : public map<BSTR, BSTR>
{
public:
CWebPathMap();
~CWebPathMap();
VOID Destroy();
VOID MoveData(CWebPathMap & dest);
};
typedef CWebPathMap::iterator WPM_ITERATOR;
CWebPathMap g_lastWPM;
CWebPathMap::CWebPathMap()
{
}
CWebPathMap::~CWebPathMap()
{
Destroy();
}
void CWebPathMap::Destroy()
{
WPM_ITERATOR it = begin();
while (it != end())
{
SysFreeString(it->first);
SysFreeString(it->second);
it = erase(it);
}
//clear();
}
VOID CWebPathMap::MoveData(CWebPathMap & dest)
{
dest.Destroy();
WPM_ITERATOR it = begin();
while (it != end())
{
dest.insert( CWebPathMap::value_type(it->first, it->second) );
it++;
}
clear();
}
BSTR GetWebsitePath(BSTR bstrADsPath)
{
BSTR rtn = NULL;
HRESULT hr;
IADs * pADs = NULL;
hr = ADsGetObject(bstrADsPath, IID_IADs, (VOID **)&pADs);
if (FAILED(hr))
return NULL;
VARIANT var;
VariantInit(&var);
hr = pADs->Get(L"Path", &var);
if (FAILED(hr))
return NULL;
rtn = SysAllocString(var.bstrVal);
VariantClear(&var);
return rtn;
}
VOID AddToMap(BSTR bstrChild, CWebPathMap& wpm)
{
BSTR bstrWebSiteName = NULL;
HRESULT hr;
VARIANT var;
VariantInit(&var);
IADs * pADs = NULL;
IADsContainer * pADsContainer = NULL;
ULONG lFetch;
IEnumVARIANT * pEnum = NULL;
LPUNKNOWN pUnk = NULL;
BOOL bFound = FALSE;
WCHAR wszPath[200] = {0};
wcscpy_s(wszPath, g_pszW3SVC);
wcscat_s(wszPath, L"/");
wcscat_s(wszPath, bstrChild);
hr = ADsGetObject(wszPath, IID_IADs, (void **)&pADs);
if (FAILED(hr))
return;
hr = pADs->Get(L"ServerComment", &var);
if (FAILED(hr))
{
goto FUNC_RTN;
}
bstrWebSiteName = SysAllocString(var.bstrVal);
VariantClear(&var);
if (!bstrWebSiteName)
{
goto FUNC_RTN;
}
hr = pADs->QueryInterface(IID_IADsContainer, (void **)&pADsContainer);
SAFE_RELEASE(pADs);
if (FAILED(hr))
{
goto FUNC_RTN;
}
hr = pADsContainer->get__NewEnum(&pUnk);
SAFE_RELEASE(pADsContainer);
if (FAILED(hr))
{
goto FUNC_RTN;
}
hr = pUnk->QueryInterface(IID_IEnumVARIANT, (VOID **)&pEnum);
SAFE_RELEASE(pUnk);
if (FAILED(hr))
{
goto FUNC_RTN;
}
hr = pEnum->Next(1, &var, &lFetch);
while (SUCCEEDED(hr) && lFetch > 0 && !bFound)
{
IDispatch *pDisp = NULL;
IADs *pADsTmp = NULL;
pDisp = V_DISPATCH(&var);
hr = pDisp->QueryInterface(IID_IADs, (void **)&pADsTmp);
if (SUCCEEDED(hr))
{
BSTR bstrName = NULL;
BSTR bstrClass = NULL;
pADsTmp->get_Name(&bstrName);
pADsTmp->get_Class(&bstrClass);
SAFE_RELEASE(pADsTmp);
if (_wcsicmp(bstrName, L"ROOT") == 0 && _wcsicmp(bstrClass, L"IIsWebVirtualDir") == 0)
{
bFound = TRUE;
WCHAR szTmp[200] = {0};
wsprintf(szTmp, L"%s/%s", wszPath, bstrName);
BSTR path = GetWebsitePath(szTmp);
if (path)
{
wpm.insert( CWebPathMap::value_type(bstrWebSiteName, path) );
bstrWebSiteName = NULL;
}
else
{
}
}
SysFreeString(bstrClass);
SysFreeString(bstrName);
}
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
}
FUNC_RTN:
SysFreeString(bstrWebSiteName);
VariantClear(&var);
SAFE_RELEASE(pADs);
SAFE_RELEASE(pADsContainer);
SAFE_RELEASE(pUnk);
SAFE_RELEASE(pEnum);
}
void GetWebPathMap(CWebPathMap& wpm)
{
HRESULT hr;
IADsContainer * pADsContainer = NULL;
hr = ADsGetObject(g_pszW3SVC, IID_IADsContainer, (VOID **)&pADsContainer);
if (FAILED(hr))
return;
IEnumVARIANT * pEnum = NULL;
LPUNKNOWN pUnk = NULL;
hr = pADsContainer->get__NewEnum(&pUnk);
SAFE_RELEASE(pADsContainer);
if (FAILED(hr))
return;
hr = pUnk->QueryInterface(IID_IEnumVARIANT, (VOID **)&pEnum);
SAFE_RELEASE(pUnk);
if (FAILED(hr))
return;
ULONG lFetch;
VARIANT var;
VariantInit(&var);
hr = pEnum->Next(1, &var, &lFetch);
while (SUCCEEDED(hr) && lFetch > 0)
{
IDispatch *pDisp = NULL;
IADs *pADs = NULL;
pDisp = V_DISPATCH(&var);
hr = pDisp->QueryInterface(IID_IADs, (void **)&pADs);
if (SUCCEEDED(hr))
{
BSTR bstrName = NULL;
BSTR bstrClass = NULL;
pADs->get_Name(&bstrName);
pADs->get_Class(&bstrClass);
SAFE_RELEASE(pADs);
if (_wcsicmp(bstrClass, L"IIsWebServer") == 0)
{
AddToMap(bstrName, wpm);
}
SysFreeString(bstrClass);
SysFreeString(bstrName);
}
VariantClear(&var);
hr = pEnum->Next(1, &var, &lFetch);
}
SAFE_RELEASE(pEnum);
}
void main()
{
//#if defined(_UNICODE) || defined(UNICODE)
const char * c = setlocale(LC_ALL, "chs");
//#endif
CoInitialize(NULL);
while (true)
{
CWebPathMap wpm;
GetWebPathMap(wpm);
WPM_ITERATOR this_it = wpm.begin();
while (this_it != wpm.end())
{
WPM_ITERATOR last_it = g_lastWPM.begin();
while ( last_it != g_lastWPM.end())
{
if (_wcsicmp(this_it->first, last_it->first) == 0)
{
if (_wcsicmp(this_it->second, last_it->second) != 0)
{
WCHAR wszBuf[200] = {0};
wsprintf(wszBuf, L"网站%s的物理路径从\"%s\"变为\"%s\"\n", this_it->first, last_it->second, this_it->second);
wprintf(wszBuf);
}
break;
}
last_it++;
}
this_it++;
}
wpm.MoveData(g_lastWPM);
Sleep(2000);
}
CoUninitialize();
}
BSTR GetWebsitePath(BSTR bstrADsPath)
{
BSTR rtn = NULL;
HRESULT hr;
IADs * pADs = NULL;
hr = ADsGetObject(bstrADsPath, IID_IADs, (VOID **)&pADs);
if (FAILED(hr))
return NULL;
VARIANT var;
VariantInit(&var);
hr = pADs->Get(L"Path", &var);
SAFE_RELEASE(pADs);
if (FAILED(hr))
return NULL;
rtn = SysAllocString(var.bstrVal);
VariantClear(&var);
return rtn;
}
这个函数我修改了一下,但内存还是有不断增加,不过就是增加的相对慢一点了[/quote]虽然修改了,程序现在运行了一段时间,占用内存还是越来越多
pDisp = V_DISPATCH(&var); //多处
估计这个也是要释放滴,不会因为你destroy了var,就不用释放了。不是说用了引用计数嘛,你怎么知道V_DISPATCH这个宏或函数就不会导致pDisp的引用计数加1呢?
BSTR GetWebsitePath(BSTR bstrADsPath)
{
BSTR rtn = NULL;
HRESULT hr;
IADs * pADs = NULL;
hr = ADsGetObject(bstrADsPath, IID_IADs, (VOID **)&pADs);
if (FAILED(hr))
return NULL;
VARIANT var;
VariantInit(&var);
hr = pADs->Get(L"Path", &var);
SAFE_RELEASE(pADs);
if (FAILED(hr))
return NULL;
rtn = SysAllocString(var.bstrVal);
VariantClear(&var);
return rtn;
}
这个函数我修改了一下,但内存还是有不断增加,不过就是增加的相对慢一点了