[SIZE=2]HRESULT hRes;[/SIZE]
[SIZE=2][SIZE=2]ULONG num;[/SIZE]
[/SIZE][SIZE=2]IEnumDiscRecorders* pEnumRec = NULL;[/SIZE]
[SIZE=2]IDiscRecorder* pDiscRec = NULL;[/SIZE]
[SIZE=2][SIZE=2]hRes = pDiscMaster->EnumDiscRecorders(&pEnumRec);[/SIZE]
[SIZE=2][SIZE=2]hRes = pEnumRec->Next(1,&pDiscRec,&num);[/SIZE]
[SIZE=2][SIZE=2]hRes = pDiscMaster->SetActiveDiscRecorder(pDiscRec);[/SIZE]
[/SIZE][/SIZE][/SIZE]
Функции записи CD RW
Как писать CD RW (DVD RW). Есть ли какие-нибудь функции записи CD RW (DVD RW)?
Цитата: Vladimir03
Как писать CD RW (DVD RW). Есть ли какие-нибудь функции записи CD RW (DVD RW)?
Конечно есть, не только Nero записывает диски:)
http://msdn2.microsoft.com/en-gb/library/aa365379.aspx
У Nero кстати есть хороший SDK для записи.
Хотелось бы примерчиков каких-нибудь или кусочков кода.
Цитата: Vladimir03
Хотелось бы примерчиков каких-нибудь или кусочков кода.
Там речь идет о подключении службы Imapi, а у меня почему-то файл "Imapi.h" 2005 студия не находит. Ищу поиском, нигде нет. На работе Билдер стоит 2006, там есть такой файл, но оттуда он, как обычно, наверно не подойдет. Где брать заголовочный файл?
Файл подключил. Подошел из Билдера. Только тема по указанной ссылке так и не раскрыта. От нее ушли в сторону.
Там есть такой код:
IDiscRecorder* recorder;
MEDIAINFO mi;
hr = pDiskMaster->SetActiveDiscRecorder(recorder);
Или тут пропущен код или я что-то не догоняю. В функции SetActiveDiscRecorder идет обращение к неизвестному объекту. Как из объекта recordersEnum получить существующий recorder?
Цитата: Vladimir03
Файл подключил. Подошел из Билдера. Только тема по указанной ссылке так и не раскрыта. От нее ушли в сторону.
Там есть такой код:
IDiscRecorder* recorder;
MEDIAINFO mi;
hr = pDiskMaster->SetActiveDiscRecorder(recorder);
Или тут пропущен код или я что-то не догоняю. В функции SetActiveDiscRecorder идет обращение к неизвестному объекту. Как из объекта recordersEnum получить существующий recorder?
Там есть такой код:
IDiscRecorder* recorder;
MEDIAINFO mi;
hr = pDiskMaster->SetActiveDiscRecorder(recorder);
Или тут пропущен код или я что-то не догоняю. В функции SetActiveDiscRecorder идет обращение к неизвестному объекту. Как из объекта recordersEnum получить существующий recorder?
Сначала получаеш список доступных рекордеров, затем выбираеш, какой тебя устраивает, и устанавливаеш его активным.
Код:
[/SIZE]
Щас попробую
Эта часть кода прошла нормально. Приводы находятся, активизируются. Даже получилось вытащить имена и ревизии прошивок. Собственно до самой записи еще не дошел. По логике диск стереть сначала нужно. А как? Что-то в этих объектах я не нашел методов для очистки диска.
Цитата: Vladimir03
Эта часть кода прошла нормально. Приводы находятся, активизируются. Даже получилось вытащить имена и ревизии прошивок. Собственно до самой записи еще не дошел. По логике диск стереть сначала нужно. А как? Что-то в этих объектах я не нашел методов для очистки диска.
Код:
[SIZE=2][COLOR=black]hRes = pDiscRec->Erase(FALSE);[/COLOR][/SIZE]
Позволяет стереть перезаписываемый диск. Патаметр TRUE - полная очистка диска, FALSE - быстрая очистка (таблица файлов).
Перед использованием рекордер должен быть открыт для эксклюзивного использования:
Код:
[SIZE=2][COLOR=black]hRes = pDiscRec->OpenExclusive();[/COLOR][/SIZE]
Код:
HANDLE hFile;
DWORD ReadedBytes=0;
hr=pImage->CreateStream(OLESTR("Рисунок.jpg"), STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0 ,0, &pStream);
hFile=CreateFile("C:\\Рисунок.jpg", FILE_READ_DATA, NULL, NULL, OPEN_EXISTING, NULL, NULL);
ReadFile(hFile, &buf, 1024, &ReadedBytes, NULL);
do
{
pStream->Write(buf, ReadedBytes, NULL);
ReadFile(hFile, &buf, 1024, &ReadedBytes, NULL);
}
while (ReadedBytes>0);
CloseHandle(hFile);
p = NULL, Vendor = NULL, Product = NULL, Revision = NULL;
hr=joilet->AddData(pImage, 1);
hr=pDiskMaster->RecordDisc(FALSE, TRUE);
hr=pStream->Release();
hr=pImage->Release();
hr = pDiskMaster->Close();
CoUninitialize();
DWORD ReadedBytes=0;
hr=pImage->CreateStream(OLESTR("Рисунок.jpg"), STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0 ,0, &pStream);
hFile=CreateFile("C:\\Рисунок.jpg", FILE_READ_DATA, NULL, NULL, OPEN_EXISTING, NULL, NULL);
ReadFile(hFile, &buf, 1024, &ReadedBytes, NULL);
do
{
pStream->Write(buf, ReadedBytes, NULL);
ReadFile(hFile, &buf, 1024, &ReadedBytes, NULL);
}
while (ReadedBytes>0);
CloseHandle(hFile);
p = NULL, Vendor = NULL, Product = NULL, Revision = NULL;
hr=joilet->AddData(pImage, 1);
hr=pDiskMaster->RecordDisc(FALSE, TRUE);
hr=pStream->Release();
hr=pImage->Release();
hr = pDiskMaster->Close();
CoUninitialize();
Где же лажа?
Код:
[SIZE=2]HRESULT hRes;[/SIZE]
[SIZE=2]IStorage* pStorage = NULL, * pSubStorage = NULL;[/SIZE]
[SIZE=2]IStream* pStream = NULL; [/SIZE]
[SIZE=2]//корневой элемент - создается файл образа в папке с проектом[/SIZE]
[SIZE=2]hRes = StgCreateStorageEx( L[/SIZE][SIZE=2][COLOR=#800000]"write.stg"[/COLOR][/SIZE][SIZE=2], STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, [/SIZE][SIZE=2]STGFMT_STORAGE, 0, NULL, NULL, IID_IStorage, [/SIZE][SIZE=2][COLOR=#0000ff]reinterpret_cast[/COLOR][/SIZE][SIZE=2]<[/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2]**>(&pStorage));[/SIZE]
[SIZE=2]//папка - в корне образа[/SIZE]
[SIZE=2]hRes = pStorage->CreateStorage(L[/SIZE][SIZE=2][COLOR=#800000]"folder"[/COLOR][/SIZE][SIZE=2],STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,NULL,&pSubStorage);[/SIZE]
[SIZE=2]//файл в подпапке в образе[/SIZE]
[SIZE=2]hRes = pSubStorage->CreateStream(L[/SIZE][SIZE=2][COLOR=#800000]"Notepad.exe"[/COLOR][/SIZE][SIZE=2],STGM_READWRITE|STGM_SHARE_EXCLUSIVE,0,0,&pStream);[/SIZE]
[SIZE=2]IStorage* pStorage = NULL, * pSubStorage = NULL;[/SIZE]
[SIZE=2]IStream* pStream = NULL; [/SIZE]
[SIZE=2]//корневой элемент - создается файл образа в папке с проектом[/SIZE]
[SIZE=2]hRes = StgCreateStorageEx( L[/SIZE][SIZE=2][COLOR=#800000]"write.stg"[/COLOR][/SIZE][SIZE=2], STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, [/SIZE][SIZE=2]STGFMT_STORAGE, 0, NULL, NULL, IID_IStorage, [/SIZE][SIZE=2][COLOR=#0000ff]reinterpret_cast[/COLOR][/SIZE][SIZE=2]<[/SIZE][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][SIZE=2]**>(&pStorage));[/SIZE]
[SIZE=2]//папка - в корне образа[/SIZE]
[SIZE=2]hRes = pStorage->CreateStorage(L[/SIZE][SIZE=2][COLOR=#800000]"folder"[/COLOR][/SIZE][SIZE=2],STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,NULL,&pSubStorage);[/SIZE]
[SIZE=2]//файл в подпапке в образе[/SIZE]
[SIZE=2]hRes = pSubStorage->CreateStream(L[/SIZE][SIZE=2][COLOR=#800000]"Notepad.exe"[/COLOR][/SIZE][SIZE=2],STGM_READWRITE|STGM_SHARE_EXCLUSIVE,0,0,&pStream);[/SIZE]
Формируеш свой образ, а потом - прожигаеш. Посмотри, как ты создаеш свой pImage.
hr=joilet->AddData(pImage, 1) возвращает мне "Отказано в доступе". Нужен ли вообще этот код?
Код:
hr=joilet->AddData(pImage, 1);
hr=pDiskMaster->RecordDisc(FALSE, TRUE);
hr=pStream->Release();
hr=pImage->Release();
hr = pDiskMaster->Close();
hr=pDiskMaster->RecordDisc(FALSE, TRUE);
hr=pStream->Release();
hr=pImage->Release();
hr = pDiskMaster->Close();
Фрагмент hr=pStream->Release(); находится не в том месте.
Он должен бать до метода AddData(). Все прожигается.
Теперь хочу разобраться с IDiscMaster::ProgressAdvise, чтобы наглядно показывать процесс записи/очистки диска. Нет ли у тебя, Host (больше, я смотрю, этот вопрос никому не интересен) , на этот счет каких нибудь наработок?