The following example shows how to enumerate and select ltmmConvert object processors.
// define helper macros for using interfaces under C #ifndef COBJMACROS #define COBJMACROS #endif #include "ltmm.h" #include "resource.h" #include "tchar.h" #include "stdio.h" HINSTANCE g_hInstance; // application instance handle IltmmConvert* g_pConvert; // convert object's interface pointer // // BuildProcessorList // fills the registered processor listbox to match the contents of the collection // // pProcessors = processor collection's interface pointer // hwndListBox = listbox window handle // void BuildProcessorList(IltmmProcessors* pProcessors, HWND hwndListBox) { long i; long count; // reset the listbox contents SendMessage(hwndListBox, LB_RESETCONTENT, 0, 0); // get the collection's item count IltmmProcessors_get_Count (pProcessors, &count); for(i = 0; i < count; i++) { IltmmProcessor* pProcessor; BSTR bstr; TCHAR sz[256]; int index; // retrieve collection item IltmmProcessors_Item (pProcessors, i, &pProcessor); // get displayable name IltmmProcessor_get_FriendlyName (pProcessor, &bstr); // convert from unicode _stprintf(sz, _T("%ls"), bstr); // free name SysFreeString(bstr); // add the name to the listbox index = SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) sz); // associate the listbox item with the collection item index SendMessage(hwndListBox, LB_SETITEMDATA, index, i); // free the collection item IUnknown_Release(pProcessor); } } // // BuildSelectedProcessorList // fills the selected processor listbox to match the contents of the collection // // pSelProcessors = selected processor collection's interface pointer // hwndSelListBox = selected listbox window handle // void BuildSelectedProcessorList(IltmmProcessors* pSelProcessors, HWND hwndSelListBox) { long i; long count; // reset the listbox contents SendMessage(hwndSelListBox, LB_RESETCONTENT, 0, 0); // get the collection's item count IltmmProcessors_get_Count (pSelProcessors, &count); for(i = 0; i < count; i++) { IltmmProcessor* pProcessor; BSTR bstr; TCHAR sz[256]; // retrieve collection item IltmmProcessors_Item (pSelProcessors, i, &pProcessor); // get displayable name IltmmProcessor_get_FriendlyName (pProcessor, &bstr); // convert from unicode _stprintf(sz, _T("%ls"), bstr); // free name SysFreeString(bstr); // add the name to the listbox SendMessage(hwndSelListBox, LB_ADDSTRING, 0, (LPARAM) (LPCTSTR) sz); // free the collection item IUnknown_Release(pProcessor); } // add a blank entry at the end of the list and select it SendMessage(hwndSelListBox, LB_ADDSTRING, 0, (LPARAM) (LPVOID) _T("")); SendMessage(hwndSelListBox, LB_SETCURSEL, count, 0); } // // RemoveSelectedProcessor // removes the currently selected processor // // pSelProcessors = selected processor collection's interface pointer // hwndSelListBox = selected listbox window handle // void RemoveSelectedProcessor(IltmmProcessors* pSelProcessors, HWND hwndSelListBox) { int index; int count; // get the number of selected processor listbox items count = (int) SendMessage(hwndSelListBox, LB_GETCOUNT, 0, 0); // get the deletion point from the selected processor listbox index = (int) SendMessage(hwndSelListBox, LB_GETCURSEL, 0, 0); // if not a valid processor, then return if(index < 0 || index >= (count - 1)) return; // remove the processor from the selected processor collection IltmmProcessors_Remove(pSelProcessors, index); // remove the name from the the selected processor listbox SendMessage(hwndSelListBox, LB_DELETESTRING, index, 0); // select the next item in the listbox SendMessage(hwndSelListBox, LB_SETCURSEL, index, 0); } // // RemoveAllSelectedProcessors // removes all selected processors // // pSelProcessors = selected processor collection's interface pointer // hwndSelListBox = selected listbox window handle // void RemoveAllSelectedProcessors(IltmmProcessors* pSelProcessors, HWND hwndSelListBox) { IltmmProcessors_RemoveAll (pSelProcessors); BuildSelectedProcessorList(pSelProcessors, hwndSelListBox); } // // InsertSelectedProcessor // inserts the currently selected registerd processor into te selected processor collection // // pProcessors = registered processor collection's interface pointer // hwndListBox = registered listbox window handle // pSelProcessors = selected processor collection's interface pointer // hwndSelListBox = selected listbox window handle // void InsertSelectedProcessor(IltmmProcessors* pProcessors, HWND hwndListBox, IltmmProcessors* pSelProcessors, HWND hwndSelListBox) { int index; int selindex; long item; IltmmProcessor* pProcessor; BSTR bstr; TCHAR sz[256]; // get the selection from the registered processor listbox index = (int) SendMessage(hwndListBox, LB_GETCURSEL, 0, 0); if(index < 0) return; // get the collection item index item = (long) SendMessage(hwndListBox, LB_GETITEMDATA, index, 0); // get the actual item IltmmProcessors_Item (pProcessors, item, &pProcessor); // get the insertion point from the selected processor listbox selindex = (int) SendMessage(hwndSelListBox, LB_GETCURSEL, 0, 0); // insert the processor into the selected processor collection IltmmProcessors_Add (pSelProcessors, pProcessor, selindex); // get the displayable name IltmmProcessor_get_FriendlyName (pProcessor, &bstr); // release the processor IUnknown_Release(pProcessor); // convert from unicode _stprintf(sz, _T("%ls"), bstr); // free name SysFreeString(bstr); // insert the name into the selected processor listbox SendMessage(hwndSelListBox, LB_INSERTSTRING, selindex, (LPARAM) (LPCTSTR) sz); } // // RefreshProcessorList // called to completely rebuild the collection // // pProcessors = processor collection's interface pointer // hwndListBox = listbox window handle // void RefreshProcessorList(IltmmProcessors* pProcessors, HWND hwndListBox) { IltmmProcessor* pProcessor; long item; BSTR bstr; long i; long count; // get the currently selected item i = (int) SendMessage(hwndListBox, LB_GETCURSEL, 0, 0); if(i >= 0) { item = (long) SendMessage(hwndListBox, LB_GETITEMDATA, i, 0); // get it's unique name IltmmProcessors_Item (pProcessors, item, &pProcessor); IltmmProcessor_get_Name (pProcessor, &bstr); IUnknown_Release(pProcessor); } else { bstr = NULL; } // rebuild the collection IltmmProcessors_Refresh (pProcessors); // rebuild the listbox BuildProcessorList(pProcessors, hwndListBox); if(bstr) { // find the previously selected item IltmmProcessors_Find (pProcessors, bstr, &item); // make it the current selection if(item >= 0) { IltmmProcessors_get_Count (pProcessors, &count); // select the appropriate listbox item for(i = 0; i < count; i++) { if(item == (long) SendMessage(hwndListBox, LB_GETITEMDATA, i, 0)) { SendMessage(hwndListBox, LB_SETCURSEL, i, 0); break; } } } SysFreeString(bstr); } } // // ProcessorSelectionChanged // called when the registered processor selection has changed // // pProcessors = processor collection's interface pointer // hwndListBox = listbox window handle // hwndAddBtn = add button window handle // void ProcessorSelectionChanged(IltmmProcessors* pProcessors, HWND hwndListBox, HWND hwndAddBtn) { int index; pProcessors = pProcessors ; // get the currently selected listbox item index = (int) SendMessage(hwndListBox, LB_GETCURSEL, 0, 0); // enable add, if a filter is selected EnableWindow(hwndAddBtn, index >= 0); } // // SelectedProcessorSelectionChanged // called when the selected processor selection has changed // // pSelProcessors = processor collection's interface pointer // hwndSelListBox = listbox window handle // hwndRemoveBtn = remove button window handle // hwndRemoveAllBtn = remove all button window handle // hwndPropBtn = properties button window handle // void SelectedProcessorSelectionChanged(IltmmProcessors* pSelProcessors, HWND hwndSelListBox, HWND hwndRemoveBtn, HWND hwndRemoveAllBtn, HWND hwndPropBtn) { int index; int count; BOOL fFilter; VARIANT_BOOL fHasDialog = VARIANT_FALSE; HRESULT hr; // get the currently selected listbox item index = (int) SendMessage(hwndSelListBox, LB_GETCURSEL, 0, 0); // get the total item count count = (int) SendMessage(hwndSelListBox, LB_GETCOUNT, 0, 0); // is this a filter? fFilter = (index >= 0 && index < (count - 1)); // enable remove all button, if there is a filter in the list EnableWindow(hwndRemoveAllBtn, count > 1); // enable remove button, if it is a filter EnableWindow(hwndRemoveBtn, fFilter); if(fFilter) { // check for the availablility of a filter property dialog box IltmmProcessor* pProcessor; hr = IltmmProcessors_Item (pSelProcessors, index, &pProcessor); if(SUCCEEDED(hr)) { IltmmProcessor_HasDialog (pProcessor, ltmmProcessor_Dlg_Properties, &fHasDialog); IUnknown_Release(pProcessor); } } else { fHasDialog = VARIANT_FALSE; } // enable properties button, if dialog box is available EnableWindow(hwndPropBtn, fHasDialog != VARIANT_FALSE); } // // InvokeProcessorProperties // invokes the currently selected processor's properties dialog box // // pSelProcessors = processor collection's interface pointer // hwndSelListBox = listbox window handle // hwndParent = parent window handle // void InvokeProcessorProperties(IltmmProcessors* pSelProcessors, HWND hwndSelListBox, HWND hwndParent) { int index; int count; IltmmProcessor* pProcessor; HRESULT hr; // get the currently selected listbox item index = (int) SendMessage(hwndSelListBox, LB_GETCURSEL, 0, 0); // get the total item count count = (int) SendMessage(hwndSelListBox, LB_GETCOUNT, 0, 0); // is this a filter? if(index >= 0 && index < (count - 1)) { // invoke the processor's dialog hr = IltmmProcessors_Item (pSelProcessors, index, &pProcessor); if(SUCCEEDED(hr)) { IltmmProcessor_ShowDialog (pProcessor, ltmmProcessor_Dlg_Properties, (long) hwndParent); IUnknown_Release(pProcessor); } } } // // ProcessorDlgProc // selects object processors // BOOL CALLBACK ProcessorDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { IltmmProcessors* pProcessors; IltmmProcessors* pSelProcessors; lParam = lParam ; switch (msg) { case WM_INITDIALOG: // initialize the audio processor listbox IltmmConvert_get_AudioProcessors(g_pConvert, &pProcessors); BuildProcessorList(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS)); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS), GetDlgItem(hwnd, IDC_ADDAUDIOPROCESSOR)); IUnknown_Release(pProcessors); // initialize the selected audio processor listbox IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); BuildSelectedProcessorList(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEAUDIOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_AUDIOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); // initialize the video processor listbox IltmmConvert_get_VideoProcessors (g_pConvert, &pProcessors); BuildProcessorList(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS)); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS), GetDlgItem(hwnd, IDC_ADDVIDEOPROCESSOR)); IUnknown_Release(pProcessors); // initialize the selected video processor listbox IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); BuildSelectedProcessorList(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEVIDEOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_VIDEOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); return TRUE; break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_ADDAUDIOPROCESSOR: // insert processor into selected audio processor collection IltmmConvert_get_AudioProcessors(g_pConvert, &pProcessors); IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); InsertSelectedProcessor(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS), pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEAUDIOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_AUDIOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); IUnknown_Release(pProcessors); return TRUE; break; case IDC_REMOVEAUDIOPROCESSOR: // remove processor from the selected audio processor collection IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); RemoveSelectedProcessor(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEAUDIOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_AUDIOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_REMOVEALLAUDIOPROCESSORS: // remove all selected audio processors IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); RemoveAllSelectedProcessors(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEAUDIOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_AUDIOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_REFRESHAUDIOPROCESSORS: // rebuild the registered audio processor collection IltmmConvert_get_AudioProcessors(g_pConvert, &pProcessors); RefreshProcessorList(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS)); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS), GetDlgItem(hwnd, IDC_ADDAUDIOPROCESSOR)); IUnknown_Release(pProcessors); return TRUE; break; case IDC_AUDIOPROCESSORPROPERTIES: // invoke the selected audio processor's properties dialog box IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); InvokeProcessorProperties(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), hwnd); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_SELAUDIOPROCESSORS: if(HIWORD(wParam) == LBN_SELCHANGE) { // selection changed, update buttons IltmmConvert_get_SelectedAudioProcessors(g_pConvert, &pSelProcessors); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEAUDIOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLAUDIOPROCESSORS), GetDlgItem(hwnd, IDC_AUDIOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); } break; case IDC_AUDIOPROCESSORS: if(HIWORD(wParam) == LBN_SELCHANGE) { // selection changed, update buttons IltmmConvert_get_AudioProcessors(g_pConvert, &pProcessors); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_AUDIOPROCESSORS), GetDlgItem(hwnd, IDC_ADDAUDIOPROCESSOR)); IUnknown_Release(pProcessors); } break; case IDC_ADDVIDEOPROCESSOR: // insert processor into selected video processor collection IltmmConvert_get_VideoProcessors (g_pConvert, &pProcessors); IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); InsertSelectedProcessor(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS), pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEVIDEOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_VIDEOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); IUnknown_Release(pProcessors); return TRUE; break; case IDC_REMOVEVIDEOPROCESSOR: // remove processor from the selected video processor collection IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); RemoveSelectedProcessor(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEVIDEOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_VIDEOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_REMOVEALLVIDEOPROCESSORS: // remove all selected video processors IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); RemoveAllSelectedProcessors(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS)); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEVIDEOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_VIDEOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_REFRESHVIDEOPROCESSORS: // rebuild the registered video processor collection IltmmConvert_get_VideoProcessors (g_pConvert, &pProcessors); RefreshProcessorList(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS)); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS), GetDlgItem(hwnd, IDC_ADDVIDEOPROCESSOR)); IUnknown_Release(pProcessors); return TRUE; break; case IDC_VIDEOPROCESSORPROPERTIES: // invoke the selected video processor's properties dialog box IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); InvokeProcessorProperties(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), hwnd); IUnknown_Release(pSelProcessors); return TRUE; break; case IDC_SELVIDEOPROCESSORS: if(HIWORD(wParam) == LBN_SELCHANGE) { // selection changed, update buttons IltmmConvert_get_SelectedVideoProcessors(g_pConvert, &pSelProcessors); SelectedProcessorSelectionChanged(pSelProcessors, GetDlgItem(hwnd, IDC_SELVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_REMOVEVIDEOPROCESSOR), GetDlgItem(hwnd, IDC_REMOVEALLVIDEOPROCESSORS), GetDlgItem(hwnd, IDC_VIDEOPROCESSORPROPERTIES)); IUnknown_Release(pSelProcessors); } break; case IDC_VIDEOPROCESSORS: if(HIWORD(wParam) == LBN_SELCHANGE) { // selection changed, update buttons IltmmConvert_get_VideoProcessors(g_pConvert, &pProcessors); ProcessorSelectionChanged(pProcessors, GetDlgItem(hwnd, IDC_VIDEOPROCESSORS), GetDlgItem(hwnd, IDC_ADDVIDEOPROCESSOR)); IUnknown_Release(pProcessors); } break; case IDOK: EndDialog(hwnd, IDOK); return TRUE; break; } break; } return FALSE; } void SelectingltmmConvertObjectProcessors_Example ( HINSTANCE hInstance /*application instance handle*/ ) { HRESULT hr; g_hInstance = hInstance; // initialize COM library hr = CoInitialize(NULL); if(FAILED(hr)) goto error; // create the convert object hr = CoCreateInstance(&CLSID_ltmmConvert, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmConvert, (void**) &g_pConvert); if(FAILED(hr)) goto error; DialogBox(g_hInstance, (LPCTSTR)IDD_PROCESSORDLG, NULL, ProcessorDlgProc); error: // cleanup if(g_pConvert) IUnknown_Release(g_pConvert); CoUninitialize(); }