📄 plugin.cpp
字号:
//////////////////////////////////////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 + -