IDiscRecorder* enumCDBurners (StringArray* list, int indexToOpen, IDiscMaster** master) { CoInitialize (0); IDiscMaster* dm; IDiscRecorder* result = nullptr; if (SUCCEEDED (CoCreateInstance (CLSID_MSDiscMasterObj, 0, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IDiscMaster, (void**) &dm))) { if (SUCCEEDED (dm->Open())) { IEnumDiscRecorders* drEnum = nullptr; if (SUCCEEDED (dm->EnumDiscRecorders (&drEnum))) { IDiscRecorder* dr = nullptr; DWORD dummy; int index = 0; while (drEnum->Next (1, &dr, &dummy) == S_OK) { if (indexToOpen == index) { result = dr; break; } else if (list != nullptr) { BSTR path; if (SUCCEEDED (dr->GetPath (&path))) list->add ((const WCHAR*) path); } ++index; dr->Release(); } drEnum->Release(); } if (master == 0) dm->Close(); } if (master != nullptr) *master = dm; else dm->Release(); } return result; }
BOOL GetIMAPIBurningDevices(CArray<LPWSTR>& aDevicePaths) { CRegKey RegKey; if (RegKey.OpenKey(HKCR,"IMAPI.MSDiscMasterObj\\CLSID",CRegKey::defRead)!=ERROR_SUCCESS) return FALSE; WCHAR szCLSID[50]; if (RegKey.QueryValue(L"",szCLSID,50)==0) return FALSE; CLSID clsid; if (CLSIDFromString(szCLSID,&clsid)!=NO_ERROR) return FALSE; HRESULT hRes; IDiscMaster* pdm; hRes=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,IID_IDiscMaster,(void**)&pdm); if (FAILED(hRes)) return FALSE; hRes=pdm->Open(); if (FAILED(hRes)) { pdm->Release(); return FALSE; } IEnumDiscRecorders* pedr; hRes=pdm->EnumDiscRecorders(&pedr); if (SUCCEEDED(hRes)) { IDiscRecorder* pdr; DWORD dwReturned; while ((hRes=pedr->Next(1,&pdr,&dwReturned))==S_OK) { BSTR bPath; hRes=pdr->GetPath(&bPath); if (SUCCEEDED(bPath)) { if (bPath[0]=='\\') { WCHAR szName[MAX_PATH]; WCHAR szTemp[MAX_PATH]=L""; WCHAR drive[]=L" :"; GetLogicalDriveStringsW(MAX_PATH,szTemp); LPWSTR pPtr=szTemp; while (*pPtr!='\0') { *drive=*pPtr; if (QueryDosDeviceW(drive, szName,MAX_PATH)) { if (wcscmp(szName,bPath)==0) aDevicePaths.Add(alloccopy(pPtr)); } pPtr+=istrlenw(pPtr)+1; } } else aDevicePaths.Add(alloccopy(bPath)); } pdr->Release(); } pedr->Release(); } pdm->Close(); pdm->Release(); return TRUE; }