[转]使用C++为IIS的虚拟目录增加MIME类型

本文介绍了一种使用 C++ 为 IIS 的虚拟目录增加或更新 MIME 类型的方法。通过示例代码展示了如何操作 IIS 中的 MIME 映射,包括查找指定扩展名的 MIME 记录以及更新或添加新的 MIME 类型。

 

原文链接: http://my.donews.com/andrewren/2006/11/14/kuyygfnmtleelcivyxbweybeggrqjspumoss/

 

 

 

使用C++为IIS的虚拟目录增加MIME类型

//—————————————————————————

//为本机的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;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值