当新建IIS站点时,有可能发生端口冲突的情况,需要在此之前扫描已使用的端口。
int CIISDlg::ScanSitePort(unsigned short *SiteType, long lPort)
{
IADsContainer* pContainer = NULL;
HRESULT hr;
char Port[256];
sprintf(Port,"%d",lPort);
bool bCoInit = false;
hr = ::CoInitialize(NULL);
if SUCCEEDED(hr)
bCoInit = true;
hr = ADsGetObject(SiteType,IID_IADsContainer,(void**)&pContainer);
if FAILED(hr)
{
printf("Error in get web3svc object \n");
return -1;
}
IUnknown *pUnk;
hr = pContainer->get__NewEnum(&pUnk);
pContainer->Release();
if FAILED(hr)
{
printf("Error in getting the enumeration \n");
return -2;
}
IEnumVARIANT *pEnum;
hr = pUnk->QueryInterface(IID_IEnumVARIANT,(void**)&pEnum);
pUnk->Release();
if FAILED(hr)
{
printf("Error in getting the enumeration variant/n");
return -3;
}
BSTR bstr;
VARIANT var;
IADs *pADs;
ULONG lFetch;
IDispatch *pDisp;
VariantInit(&var);
hr= pEnum->Next(1, &var, &lFetch);
while(hr == S_OK)
{
if (lFetch == 1)
{
pDisp = V_DISPATCH(&var);
pDisp->QueryInterface(IID_IADs, (void**)&pADs);
pADs->get_Name(&bstr);
VARIANT var1;
VariantInit(&var1);
HRESULT hr1;
hr1 = pADs->Get(L"ServerBindings", &var1 );
if( SUCCEEDED(hr1))
{
LONG lstart, lend;
SAFEARRAY *sa = V_ARRAY(&var1);
VARIANT varItem;
hr1 = SafeArrayGetLBound(sa, 1, &lstart);
hr1 = SafeArrayGetUBound(sa, 1, &lend);
VariantInit(&varItem);
for(long idx = lstart; idx <= lend; idx++)
{
hr1 = SafeArrayGetElement( sa, &idx, &varItem);
CString str,temp;
str.Format("%S\n",V_BSTR(&varItem));
MessageBox(str,NULL,MB_OK);
AfxExtractSubString(temp,str,1,':');
if(Port==temp)
{
AfxMessageBox("该端口已存在");
return 1;
}
VariantClear(&varItem);
}
VariantClear(&var1);
}
if (pADs)
pADs->Release();
SysFreeString(bstr);
}
VariantClear(&var);
hr=pEnum->Next(1, &var, &lFetch);
}
if (pEnum)
pEnum->Release();
if (bCoInit)
::CoUninitialize();
return 0;
}
AfxExtractSubString();函数的用法见上一篇