// Copyright (c) 1996 - 1998 Microsoft Corporation. All Rights Reserved. #include #include #include #include "project.h" #include "mpgcodec.h" #include #include extern HINSTANCE hInst; // these lines copied from SDK\CLASSES\BASE\FILTER.H #define QueryFilterInfoReleaseGraph(fi) if ((fi).pGraph) (fi).pGraph->Release(); typedef HRESULT (STDAPICALLTYPE *LPOCPF)(HWND hwndOwner, UINT x, UINT y, LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN FAR* ppUnk, ULONG cPages, LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved); typedef HRESULT (STDAPICALLTYPE *LPOI)(LPVOID pvReserved); typedef void (STDAPICALLTYPE *LPOUI)(void); // // Release the reference count for those filters put into the configuration // listbox // void ReleaseFilters(HWND hwndListbox) { if (hwndListbox) { IBaseFilter* pFilter; for (int i=ListBox_GetCount(hwndListbox); i--;) { if (pFilter = (IBaseFilter*)ListBox_GetItemData(hwndListbox, i)) pFilter->Release(); else break; } } } INT_PTR CALLBACK ConfigDlgProc(HWND hDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) { switch (wMsg) { case WM_INITDIALOG: { IFilterGraph *pFG = (IFilterGraph *) lParam; IEnumFilters* pEF; IBaseFilter* pFilter; FILTER_INFO Info; HWND hlist = GetDlgItem(hDlg, IDC_FILTERS); if (pFG == NULL) return FALSE; // Grab an enumerator for the filter graph. HRESULT hr = pFG->EnumFilters(&pEF); // ASSERT(SUCCEEDED(hr)); // Check out each filter. while (pEF->Next(1, &pFilter, NULL) == S_OK) { int Index; hr = pFilter->QueryFilterInfo(&Info); // ASSERT(SUCCEEDED(hr)); QueryFilterInfoReleaseGraph(Info); #ifdef UNICODE Index = ListBox_AddString(hlist, Info.achName); #else CHAR aFilterName[MAX_FILTER_NAME]; WideCharToMultiByte(CP_ACP, 0, Info.achName, -1, aFilterName, MAX_FILTER_NAME, NULL, NULL); Index = ListBox_AddString(hlist, aFilterName); #endif // ASSERT(Index != LB_ERR); // ASSERT(Index != LB_ERRSPACE); // Store the IBaseFilter pointer with the listbox item. // it gets used if the properties have to be queried ListBox_SetItemData(hlist, Index, pFilter); } pEF->Release(); } return TRUE; case WM_ENDSESSION: if (wParam) { ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS)); EndDialog(hDlg, FALSE); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS)); EndDialog(hDlg, TRUE); break; case IDCANCEL: ReleaseFilters(GetDlgItem(hDlg, IDC_FILTERS)); EndDialog(hDlg, FALSE); break; case IDC_FILTERS: if (HIWORD(wParam) == LBN_SELCHANGE) { HRESULT hr = E_FAIL; HWND hlist = GetDlgItem(hDlg, IDC_FILTERS); IBaseFilter *pF; ISpecifyPropertyPages *pSPP; pF = (IBaseFilter *) ListBox_GetItemData(hlist, ListBox_GetCurSel(hlist)); if (pF) { hr = pF->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pSPP); } if (hr == S_OK) { pSPP->Release(); } EnableWindow(GetDlgItem(hDlg, IDC_PROPERTIES), hr == S_OK); } else if (HIWORD(wParam) == LBN_DBLCLK) { HWND hwndBtn = GetDlgItem(hDlg, IDC_PROPERTIES); SendMessage(hwndBtn, WM_LBUTTONDOWN, 0, 0L); SendMessage(hwndBtn, WM_LBUTTONUP, 0, 0L); } break; case IDC_PROPERTIES: { HWND hlist = GetDlgItem(hDlg, IDC_FILTERS); IBaseFilter *pF; pF = (IBaseFilter *) ListBox_GetItemData(hlist, ListBox_GetCurSel(hlist)); static const TCHAR szOleControlDll[] = TEXT("OLEPRO32.dll"); static const char szOCPF[] = "OleCreatePropertyFrame"; static const TCHAR szOleDll[] = TEXT("OLE32.dll"); static const char szOleInit[] = "OleInitialize"; static const char szOleUninit[] = "OleUninitialize"; HINSTANCE hinst = LoadLibrary(szOleControlDll); if (!hinst) break; LPOCPF lpfn = (LPOCPF)GetProcAddress(hinst, szOCPF); HINSTANCE hinstOLE = LoadLibrary(szOleDll); if (hinstOLE) { LPOI lpfnInit = (LPOI)GetProcAddress(hinstOLE, szOleInit); LPOUI lpfnUninit = (LPOUI)GetProcAddress(hinstOLE, szOleUninit); if (lpfn && lpfnInit && lpfnUninit) { (*lpfnInit) (NULL); (*lpfn)(hDlg, // Parent 0, // x coordinate 0, // y coordinate L"Filter", // Caption 1, // Number of objects (IUnknown**)&pF, // 1 object 0, // No pages :- will use NULL, // ISpecifyPropertyPages 0, // AmbientLocaleID(), 0, // Reserved NULL); // Reserved (*lpfnUninit) (); } FreeLibrary(hinstOLE); } FreeLibrary(hinst); } break; } break; } return FALSE; } BOOL CMpegMovie::ConfigDialog(HWND hwnd) { BOOL f = TRUE; f = (BOOL) DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_PROPPAGE), hwnd, ConfigDlgProc, (DWORD_PTR)m_Fg); return f; }