//—————————————————————————
//为本机的IIS的默认站点的虚拟目录增加/更新MIME类型.
//参数说明: lpszVirtualDirName:虚拟目录, pExtension:带”.”的扩展名, pType:对该扩展名的描述
//Note:由于限制, 将所有小于号和大于号都使用了全角(注:已修改).
bool AddMimeType( LPCWSTR lpszVirtualDirName, LPWSTR pExtension, LPWSTR pType )
{
CComPtr〈IADs> iAds;
HRESULT hr;
_bstr_t bstrExt( pExtension );
/* WebSever */
wchar_t szPath[ MAX_PATH ] = { 0 };
wcscat( szPath, L"IIS://localhost/W3SVC/1/ROOT/" ); //w3svc后的1表示为默认站点, 如果为其它站点,请相应设置
wcscat( szPath, lpszVirtualDirName );
bool bRet = false;
if ( ADsGetObject( szPath, IID_IADs, ( void** )&iAds ) == S_OK )
{
VARIANT vMimeMap;
::VariantInit( &vMimeMap );
if ( S_OK == iAds->GetEx( _bstr_t( "MimeMap" ), &vMimeMap ) )
{
if ( vMimeMap.vt & VT_ARRAY )
{
long lIdx;
long lLow;
long lHigh;
_bstr_t bstrBuff;
BSTR bstrRaw;
CComQIPtr<IISMimeType> MimeType;
VARIANT vElem;
::VariantInit( &vElem );
SAFEARRAY* pArrMimeMap = vMimeMap.parray;
//Get the upper and lower bounds of the array
::SafeArrayGetLBound( pArrMimeMap, 1, &lLow );
::SafeArrayGetUBound( pArrMimeMap, 1, &lHigh );
//Loop through the array
bool bFound = false;
lIdx = lLow;
while ( lIdx <= lHigh )
{
hr = ::SafeArrayGetElement( pArrMimeMap, &lIdx , &vElem );
if( SUCCEEDED( hr ) )
{
if ( vElem.vt & VT_DISPATCH )
{
//Each element in array should be of type IISMimeType
MimeType = vElem.pdispVal;
if ( MimeType != NULL )
{
MimeType->get_Extension( &bstrRaw );
bstrBuff = bstrRaw;
//Check if the extension matches
if( bstrExt == bstrBuff )
{
bFound = true;
break;
}
}
//MimeType.Release();
}
}
lIdx++;
} // Loop through elements
if ( bFound )
{
MimeType->put_MimeType( pType );
MimeType.Release();
bRet = true;
}
else
{
MimeType.Release();
hr = MimeType.CoCreateInstance( L"MimeMap", NULL, CLSCTX_INPROC_SERVER );
if ( SUCCEEDED( hr ) )
{
MimeType->put_Extension( pExtension );
MimeType->put_MimeType( pType );
SAFEARRAYBOUND Bound[ 1 ];
Bound[ 0 ].lLbound = lLow;
Bound[ 0 ].cElements = lHigh - lLow + 2;
SafeArrayRedim( pArrMimeMap, Bound );
vElem.pdispVal = MimeType;
VARIANT *pvtData;
SafeArrayAccessData( pArrMimeMap, reinterpret_cast<void** >( &pvtData ) );
pvtData[ lHigh - lLow + 1 ] = vElem;
hr = iAds->PutEx( ADS_PROPERTY_UPDATE, _bstr_t( "MimeMap" ), vMimeMap );
if ( SUCCEEDED( hr ) )
{
if ( S_OK == iAds->SetInfo() )
{
bRet = true;
}
}
SafeArrayUnaccessData( pArrMimeMap );
MimeType.Release();
} // if ( S_OK == hr )
} //if ( bFound )
} //if ( vMimeMap.vt & VT_ARRAY )
} //if ( S_OK == iAds->GetEx( _bstr_t( "MimeMap" ), &vMimeMap ) )
} //if ( ADsGetObject( szPath, IID_IADs, ( void** )&iAds ) == S_OK )
return bRet;
}
本文介绍了一种使用 C++ 为 IIS 的虚拟目录增加或更新 MIME 类型的方法。通过示例代码展示了如何操作 IIS 中的 MIME 映射,包括查找指定扩展名的 MIME 记录以及更新或添加新的 MIME 类型。
3410

被折叠的 条评论
为什么被折叠?



