⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.cpp

📁 VLC Player Source Code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//////////////////////////////////////HRESULT VLCPlugin::onInit(void){    if( NULL == _p_libvlc )    {        // initialize persistable properties        _b_autoplay   = TRUE;        _b_autoloop   = FALSE;        _b_toolbar    = FALSE;        _bstr_baseurl = NULL;        _bstr_mrl     = NULL;        _b_visible    = TRUE;        _b_mute       = FALSE;        _i_volume     = 50;        _i_time       = 0;        _i_backcolor  = 0;        // set default/preferred size (320x240) pixels in HIMETRIC        HDC hDC = CreateDevDC(NULL);        _extent.cx = 320;        _extent.cy = 240;        HimetricFromDP(hDC, (LPPOINT)&_extent, 1);        DeleteDC(hDC);        return S_OK;    }    return CO_E_ALREADYINITIALIZED;};HRESULT VLCPlugin::onLoad(void){    if( SysStringLen(_bstr_baseurl) == 0 )    {        /*        ** try to retreive the base URL using the client site moniker, which for Internet Explorer        ** is the URL of the page the plugin is embedded into.        */        LPOLECLIENTSITE pClientSite;        if( SUCCEEDED(vlcOleObject->GetClientSite(&pClientSite)) && (NULL != pClientSite) )        {            IBindCtx *pBC = 0;            if( SUCCEEDED(CreateBindCtx(0, &pBC)) )            {                LPMONIKER pContMoniker = NULL;                if( SUCCEEDED(pClientSite->GetMoniker(OLEGETMONIKER_ONLYIFTHERE,                                OLEWHICHMK_CONTAINER, &pContMoniker)) )                {                    LPOLESTR base_url;                    if( SUCCEEDED(pContMoniker->GetDisplayName(pBC, NULL, &base_url)) )                    {                        /*                        ** check that the moniker name is a URL                        */                        if( UrlIsW(base_url, URLIS_URL) )                        {                            /* copy base URL */                            _bstr_baseurl = SysAllocString(base_url);                        }                        CoTaskMemFree(base_url);                    }                }            }        }    }    setDirty(FALSE);    return S_OK;};HRESULT VLCPlugin::getVLC(libvlc_instance_t** pp_libvlc){    extern HMODULE DllGetModule();    if( ! isRunning() )    {        /*        ** default initialization options        */        const char *ppsz_argv[32] = { };        int   ppsz_argc = 0;        char p_progpath[MAX_PATH];        {            TCHAR w_progpath[MAX_PATH];            DWORD len = GetModuleFileName(DllGetModule(), w_progpath, MAX_PATH);            if( len > 0 )            {                len = WideCharToMultiByte(CP_UTF8, 0, w_progpath, len, p_progpath,                           sizeof(p_progpath)-1, NULL, NULL);                if( len > 0 )                {                    p_progpath[len] = '\0';                    ppsz_argv[0] = p_progpath;                }            }        }        ppsz_argv[ppsz_argc++] = "-vv";        HKEY h_key;        char p_pluginpath[MAX_PATH];        if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Software\\VideoLAN\\VLC"),                          0, KEY_READ, &h_key ) == ERROR_SUCCESS )        {            DWORD i_type, i_data = MAX_PATH;            TCHAR w_pluginpath[MAX_PATH];            if( RegQueryValueEx( h_key, TEXT("InstallDir"), 0, &i_type,                                 (LPBYTE)w_pluginpath, &i_data ) == ERROR_SUCCESS )            {                if( i_type == REG_SZ )                {                    if( WideCharToMultiByte(CP_UTF8, 0, w_pluginpath, -1, p_pluginpath,                             sizeof(p_pluginpath)-sizeof("\\plugins")+1, NULL, NULL) )                    {                        strcat( p_pluginpath, "\\plugins" );                        ppsz_argv[ppsz_argc++] = "--plugin-path";                        ppsz_argv[ppsz_argc++] = p_pluginpath;                    }                }            }            RegCloseKey( h_key );        }        // make sure plugin isn't affected with VLC single instance mode        ppsz_argv[ppsz_argc++] = "--no-one-instance";        /* common settings */        ppsz_argv[ppsz_argc++] = "--no-stats";        ppsz_argv[ppsz_argc++] = "--no-media-library";        ppsz_argv[ppsz_argc++] = "--ignore-config";        ppsz_argv[ppsz_argc++] = "--intf=dummy";        // loop mode is a configuration option only        if( _b_autoloop )            ppsz_argv[ppsz_argc++] = "--loop";        libvlc_exception_t ex;        libvlc_exception_init(&ex);        _p_libvlc = libvlc_new(ppsz_argc, ppsz_argv, &ex);        if( libvlc_exception_raised(&ex) )        {            *pp_libvlc = NULL;            libvlc_exception_clear(&ex);            return E_FAIL;        }        // initial volume setting        libvlc_audio_set_volume(_p_libvlc, _i_volume, NULL);        if( _b_mute )        {            libvlc_audio_set_mute(_p_libvlc, TRUE, NULL);        }        // initial playlist item        if( SysStringLen(_bstr_mrl) > 0 )        {            char *psz_mrl = NULL;            if( SysStringLen(_bstr_baseurl) > 0 )            {                /*                ** if the MRL a relative URL, we should end up with an absolute URL                */                LPWSTR abs_url = CombineURL(_bstr_baseurl, _bstr_mrl);                if( NULL != abs_url )                {                    psz_mrl = CStrFromWSTR(CP_UTF8, abs_url, wcslen(abs_url));                    CoTaskMemFree(abs_url);                }                else                {                    psz_mrl = CStrFromBSTR(CP_UTF8, _bstr_mrl);                }            }            else            {                /*                ** baseURL is empty, assume MRL is absolute                */                psz_mrl = CStrFromBSTR(CP_UTF8, _bstr_mrl);            }            if( NULL != psz_mrl )            {                const char *options[1];                int i_options = 0;                char timeBuffer[32];                if( _i_time )                {                    snprintf(timeBuffer, sizeof(timeBuffer), ":start-time=%d", _i_time);                    options[i_options++] = timeBuffer;                }                // add default target to playlist                libvlc_playlist_add_extended(_p_libvlc, psz_mrl, NULL, i_options, options, NULL);                CoTaskMemFree(psz_mrl);            }        }    }    *pp_libvlc = _p_libvlc;    return S_OK;};void VLCPlugin::setErrorInfo(REFIID riid, const char *description){    vlcSupportErrorInfo->setErrorInfo( getClassID() == CLSID_VLCPlugin2 ?        OLESTR("VideoLAN.VLCPlugin.2") : OLESTR("VideoLAN.VLCPlugin.1"),        riid, description );};HRESULT VLCPlugin::onAmbientChanged(LPUNKNOWN pContainer, DISPID dispID){    VARIANT v;    switch( dispID )    {        case DISPID_AMBIENT_BACKCOLOR:            VariantInit(&v);            V_VT(&v) = VT_I4;            if( SUCCEEDED(GetObjectProperty(pContainer, dispID, v)) )            {                setBackColor(V_I4(&v));            }            break;        case DISPID_AMBIENT_DISPLAYNAME:            break;        case DISPID_AMBIENT_FONT:            break;        case DISPID_AMBIENT_FORECOLOR:            break;        case DISPID_AMBIENT_LOCALEID:            break;        case DISPID_AMBIENT_MESSAGEREFLECT:            break;        case DISPID_AMBIENT_SCALEUNITS:            break;        case DISPID_AMBIENT_TEXTALIGN:            break;        case DISPID_AMBIENT_USERMODE:            VariantInit(&v);            V_VT(&v) = VT_BOOL;            if( SUCCEEDED(GetObjectProperty(pContainer, dispID, v)) )            {                setUserMode(V_BOOL(&v) != VARIANT_FALSE);            }            break;        case DISPID_AMBIENT_UIDEAD:            break;        case DISPID_AMBIENT_SHOWGRABHANDLES:            break;        case DISPID_AMBIENT_SHOWHATCHING:            break;        case DISPID_AMBIENT_DISPLAYASDEFAULT:            break;        case DISPID_AMBIENT_SUPPORTSMNEMONICS:            break;        case DISPID_AMBIENT_AUTOCLIP:            break;        case DISPID_AMBIENT_APPEARANCE:            break;        case DISPID_AMBIENT_CODEPAGE:            VariantInit(&v);            V_VT(&v) = VT_I4;            if( SUCCEEDED(GetObjectProperty(pContainer, dispID, v)) )            {                setCodePage(V_I4(&v));            }            break;        case DISPID_AMBIENT_PALETTE:            break;        case DISPID_AMBIENT_CHARSET:            break;        case DISPID_AMBIENT_RIGHTTOLEFT:            break;        case DISPID_AMBIENT_TOPTOBOTTOM:            break;        case DISPID_UNKNOWN:            /*            ** multiple property change, look up the ones we are interested in            */            VariantInit(&v);            V_VT(&v) = VT_BOOL;            if( SUCCEEDED(GetObjectProperty(pContainer, DISPID_AMBIENT_USERMODE, v)) )            {                setUserMode(V_BOOL(&v) != VARIANT_FALSE);            }            VariantInit(&v);            V_VT(&v) = VT_I4;            if( SUCCEEDED(GetObjectProperty(pContainer, DISPID_AMBIENT_CODEPAGE, v)) )            {                setCodePage(V_I4(&v));            }            break;    }    return S_OK;};HRESULT VLCPlugin::onClose(DWORD dwSaveOption){    if( isInPlaceActive() )    {        onInPlaceDeactivate();    }    if( isRunning() )    {        libvlc_instance_t* p_libvlc = _p_libvlc;        IVLCLog *p_log;        if( SUCCEEDED(vlcControl2->get_log(&p_log)) )        {            // make sure the log is disabled            p_log->put_verbosity(-1);            p_log->Release();        }        _p_libvlc = NULL;        vlcDataObject->onClose();        if( p_libvlc )            libvlc_release(p_libvlc);    }    return S_OK;};BOOL VLCPlugin::isInPlaceActive(void){    return (NULL != _inplacewnd);};HRESULT VLCPlugin::onActivateInPlace(LPMSG lpMesg, HWND hwndParent, LPCRECT lprcPosRect, LPCRECT lprcClipRect){    RECT clipRect = *lprcClipRect;    /*    ** record keeping of control geometry within container    */    _posRect = *lprcPosRect;    /*    ** Create a window for in place activated control.    ** the window geometry matches the control viewport    ** within container so that embedded video is always    ** properly displayed.    */    _inplacewnd = CreateWindow(_p_class->getInPlaceWndClassName(),            TEXT("VLC Plugin In-Place Window"),

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -