Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > запись на CD


Автор: Демидрол 31.10.2008, 18:10
Доброго всем времени суток,возникла следующая проблема:
мне нужно записать на CD информацию при помощи стандартных функций виндовса.
На форме нашел исходники,но билдер на них жутко ругаецца  и топчет ногами на типы вроде CString  smile 
код брал тут: http://forum.vingrad.ru/forum/topic-95309/hl/imapi/index.html

Помогите,пожалуйста, и не отсылайте в погуглиться - искал, инфы много, но исходников почти нет. smile 

Автор: Демидрол 10.11.2008, 12:10
Вот нашел ещё:есть функции из пакета ICDBurn, с помощью которого запись на диск производится легко и непринужденно.Для тех, кто в этом разбирается.Нашел, что для записи файлов на CD используется каталог Staging area. Узнать его можно с помощью функции SHGetSpecialFolderPath, передав ей флаг CSIDL_CDBURN_AREA. Но у этой функции никак не разберусь с параметрами.
Затем в этот каталог нужно скопировать нужные данные.Простите за такой вопрос,но я только разбираюсь в С++ и не очень представляю, как это сделать.
Потом создаем объект типа ICDBurn и вызываем для него метод Burn, с параметрами которого мне тоже непонятно что к чему. Разъясните, пожалуйста, что к чему.

Автор: xvr 10.11.2008, 12:21
Цитата(Демидрол @ 10.11.2008,  12:10)
Вот нашел ещё:есть функции из пакета ICDBurn, с помощью которого запись на диск производится легко и непринужденно.Для тех, кто в этом разбирается.Нашел, что для записи файлов на CD используется каталог Staging area. Узнать его можно с помощью функции SHGetSpecialFolderPath, передав ей флаг CSIDL_CDBURN_AREA. Но у этой функции никак не разберусь с параметрами.
Затем в этот каталог нужно скопировать нужные данные.Простите за такой вопрос,но я только разбираюсь в С++ и не очень представляю, как это сделать.
Потом создаем объект типа ICDBurn и вызываем для него метод Burn, с параметрами которого мне тоже непонятно что к чему. Разъясните, пожалуйста, что к чему.

Читать http://msdn.microsoft.com/en-us/library/bb776155(VS.85).aspx

Автор: Демидрол 10.11.2008, 13:08
Например, пишу:
Код

ICDBurn *pICDBurn;
int hasRecorder = 0;
long res =pICDBurn->HasRecordableDrive(&hasRecorder);

И при выполнении программы выдает ошибку
http://pic.ipicture.ru/uploads/081110/MYCNJ4VWVS.jpg
Не мог бы кто-нбудь объяснить,чего я делаю не так?


Понял, в чем косяк - надо проинстанцировать объект. Инстанцирую:
Код

if (SUCCEEDED(CoCreateInstance(CLSID_CDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(LPVOID*)&pICDBurn)))
    {
       int hasRecorder = 0;
       if (pICDBurn->HasRecordableDrive(&hasRecorder) == S_OK)
       { pICDBurn->Release();}
       else   pICDBurn->Release();
    }


но он не инстанцируется.Не знаю почему.

Автор: Демидрол 10.11.2008, 15:33
Разобрался, почему не инстанцируется - попались при рождении руки-крюки =)
Но возникла следующая проблема:
Код

    char buf[MAX_PATH];
    SHGetSpecialFolderPath( NULL, buf, CSIDL_CDBURN_AREA, false );
    Edit1->Text=buf;

    CoInitialize(NULL);
    CLSID CLSID_ICDBurn = {0xfbeb8a05,0xbeee,0x4442,{0x80,0x4e,0x40,0x9d,0x6c,0x45,0x15,0xe9}};
    IID IID_ICDBurn =    {0x3d73a659,0xe5d0,0x4d42,{0xaf,0xc0,0x51,0x21,0xba,0x42,0x5c,0x8d}};

    if (SUCCEEDED(CoCreateInstance(CLSID_ICDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(void**)&pICDBurn)))
    {
       int hasRecorder = 0;
       if (pICDBurn->HasRecordableDrive(&hasRecorder) == S_OK)
       {
          pICDBurn->Release();
          pICDBurn->Burn(0);
       }
       else   pICDBurn->Release();
    }


 
При исполнеинии строки pICDBurn->Burn(0); возникает ошибка, причина которой для меня остается загадкой.  smile 

Автор: Демидрол 10.11.2008, 16:50
Косяк опять из-за рук =)
меняем местами строчки
Код

          pICDBurn->Release();
          pICDBurn->Burn(0);

и... ВУАЛЯ!!!!!!Работает!!!

Спасибо себе за помощь.

P.S. помогит пожалуйста голову не ломать и помогите примером, как копировать из директории в директорию. ПОЖАЛУЙСТА!!!

Автор: xvr 10.11.2008, 21:00
Цитата(Демидрол @ 10.11.2008,  16:50)
P.S. помогит пожалуйста голову не ломать и помогите примером, как копировать из директории в директорию. ПОЖАЛУЙСТА!!!

Код

String src_dir=..., dst_dir=...;

system(("xcopy /E /H /C /R /Y "+src_dir+" "+dst_dir).c_str());

Автор: mrbrooks 10.11.2008, 22:05
А может еще есть смысл покурить SDK на тот же Nero - это все есть на его офф. сайте.

Автор: SVN74 10.11.2008, 22:18
Цитата(Демидрол @  10.11.2008,  16:50 Найти цитируемый пост)
и... ВУАЛЯ!!!!!!Работает!!!

Спасибо себе за помощь.

 smile 

Автор: Демидрол 13.11.2008, 16:19
Всем спасибо большое за оказанную помощь, Тему закрываю. smile  smile 

Автор: Демидрол 27.11.2008, 16:47
ммм....народ,проблема дальше:диалог вызывается, все пучком, но почему-то диск пустой в сидюшнике не видится, пишет, что диска в сидроме нема...может,кто сталкивался, поможет...
Код

    char buf[MAX_PATH];
    SHGetSpecialFolderPath( NULL, buf, CSIDL_CDBURN_AREA, false );
    Edit1->Text=buf;

    CoInitialize(NULL);

    CLSID CLSID_ICDBurn = {0xfbeb8a05,0xbeee,0x4442,{0x80,0x4e,0x40,0x9d,0x6c,0x45,0x15,0xe9}};
    IID IID_ICDBurn =     {0x3d73a659,0xe5d0,0x4d42,{0xaf,0xc0,0x51,0x21,0xba,0x42,0x5c,0x8d}};

    if (SUCCEEDED(CoCreateInstance(CLSID_ICDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(void**)&pICDBurn)))
    {
       int hasRecorder = 0;
       if (pICDBurn->HasRecordableDrive(&hasRecorder) == S_OK)
       {
          wchar_t* buf1;
          HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,2);

          pICDBurn->Burn(0);
          pICDBurn->Release();
       }

       else   pICDBurn->Release();
    }

}


а,ещё такой вопрос: 
в строке HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,2); мы находим букву сидирома и записываем путь в buf1. А как перевести потом wchar_t *buf1 в, например, AnsiString DiscName ???
 smile 

Автор: xvr 27.11.2008, 19:36
Цитата(Демидрол @ 27.11.2008,  16:47)
ммм....народ,проблема дальше:диалог вызывается, все пучком, но почему-то диск пустой в сидюшнике не видится, пишет, что диска в сидроме нема...может,кто сталкивался, поможет...
Код

    char buf[MAX_PATH];
    SHGetSpecialFolderPath( NULL, buf, CSIDL_CDBURN_AREA, false );
    Edit1->Text=buf;

    CoInitialize(NULL);

    CLSID CLSID_ICDBurn = {0xfbeb8a05,0xbeee,0x4442,{0x80,0x4e,0x40,0x9d,0x6c,0x45,0x15,0xe9}};
    IID IID_ICDBurn =     {0x3d73a659,0xe5d0,0x4d42,{0xaf,0xc0,0x51,0x21,0xba,0x42,0x5c,0x8d}};

    if (SUCCEEDED(CoCreateInstance(CLSID_ICDBurn, NULL,CLSCTX_INPROC_SERVER,IID_ICDBurn,(void**)&pICDBurn)))
    {
       int hasRecorder = 0;
       if (pICDBurn->HasRecordableDrive(&hasRecorder) == S_OK)
       {
          wchar_t* buf1;
          HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,2);

          pICDBurn->Burn(0);
          pICDBurn->Release();
       }

       else   pICDBurn->Release();
    }

}


Смотрим в MSDN
Цитата

HRESULT GetRecorderDriveLetter(LPWSTR pszDrive, UINT cch);

Parameters

pszDrive
[out] Pointer to a string containing the drive letter, for example "F:\".

cch [in] The size of the string, in characters, pointed to by pszDrive. This value will normally be 4. Values larger than 4 are allowed, but the extra characters will be ignored by this method. Values less than 4 will generate an E_INVALIDARG error.
Смотрим в исходник:
Код

wchar_t* buf1;
HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,2);
Вывод - оба параметра неправильные, должно быть так
Код

wchar_t buf1[4];
HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,4);


Цитата

а,ещё такой вопрос: 
в строке HRESULT hr = pICDBurn->GetRecorderDriveLetter(buf1,2); мы находим букву сидирома и записываем путь в buf1. А как перевести потом wchar_t *buf1 в, например, AnsiString DiscName ???

Код

AnsiString DiscName(buf1);

Автор: Демидрол 27.11.2008, 23:10
 smile 
xvr, спасибо за помощь!!!Твои ответы мне всегда помогают!!Спасибо ОГРОМНОЕ!!! smile 

ещё такой вопрос: значения из buf1 я получил, только это числа, в ASCII коде соответствующие символам, с помощью которых название диска мне непонятно. А как же тогда извлечь нужную букву диска???

Автор: Демидрол 15.12.2008, 12:16
Ау...никто не знает, как решить проблему с возвращаемым значением функции GetRecorderDriveLetter?

Автор: xvr 15.12.2008, 17:31
Цитата(Демидрол @ 15.12.2008,  12:16)
Ау...никто не знает, как решить проблему с возвращаемым значением функции GetRecorderDriveLetter?

Не понял, что за проблема.
Цитата

pszDrive - Pointer to a string containing the drive letter, for example "F:\".
Первая буква сохраненного слова и есть буква твоего драйва. Строка в wide чарах, буква диcка явно английская, т.е. можно просто взять как char(buf[0])

Автор: Демидрол 18.12.2008, 12:40
xvr, спасибо большое,помогло.Только следующая проблема - он ссылается на диск С  smile
а как исправить эту проблему?Как сделать так, чтобы функция GetRecorderDriveLetter yf[jlbkf cd-ром, а не жесткий диск?

Автор: xvr 18.12.2008, 12:53
Цитата(Демидрол @ 18.12.2008,  12:40)
xvr, спасибо большое,помогло.Только следующая проблема - он ссылается на диск С  smile
а как исправить эту проблему?Как сделать так, чтобы функция GetRecorderDriveLetter yf[jlbkf cd-ром, а не жесткий диск?

Проверь код возврата из самогго метода GetRecorderDriveLetter, может он не смог  smile 
Цитата

The drive whose letter designation is returned by this method is the drive that has the Enable cd writing on this drive option selected. This option is found on the drive's property sheet. Only one drive on a system can have this option selected. 

If a recordable CD drive is present but that option has been deselected, the method will return an error code. 

Автор: Демидрол 18.12.2008, 13:01
он возвращает, цитирую, в переводе на символы:
C:\D
кстати,D - собственно, буква cd-рома.И как быть?

Цитата(xvr @  18.12.2008,  12:53 Найти цитируемый пост)
Проверь код возврата из самогго метода GetRecorderDriveLetter, может он не смог  

возвращает значение -2147467259, что означает E_FAIL... не очень в этом разбираюсь, поэтому что делать не знаю.  smile 

появилсь мысль о том, что в винде надо пменять чего-нибудь...а что не знаю - про опцию Enable cd writing on this drive  понял, но не нашел,где её выставлять...

Автор: xvr 18.12.2008, 13:25
Цитата(Демидрол @ 18.12.2008,  13:01)
он возвращает, цитирую, в переводе на символы:
C:\D
кстати,D - собственно, буква cd-рома.И как быть?

Цитата(xvr @  18.12.2008,  12:53 Найти цитируемый пост)
Проверь код возврата из самогго метода GetRecorderDriveLetter, может он не смог  

возвращает значение -2147467259, что означает E_FAIL... не очень в этом разбираюсь, поэтому что делать не знаю.  smile 

Вызов метода сломался. Что он там вернул - уже неважно  smile 

Цитата

появилсь мысль о том, что в винде надо пменять чего-нибудь...а что не знаю - про опцию Enable cd writing on this drive  понял, но не нашел,где её выставлять...
Видимо на вкладке со свойствами. Мой компьютер -> (Правая кн мыши) -> Свойства -> Hardware -> Device manager -> DVD/CD ROM drives -> <Твой диск> -> Properties -> ?

Автор: Демидрол 18.12.2008, 13:34
Цитата(xvr @  18.12.2008,  13:25 Найти цитируемый пост)
Вызов метода сломался. Что он там вернул - уже неважно   

и что делать, чтобы его починить? smile 


Цитата(xvr @  18.12.2008,  13:25 Найти цитируемый пост)
Видимо на вкладке со свойствами. Мой компьютер -> (Правая кн мыши) -> Свойства -> Hardware -> Device manager -> DVD/CD ROM drives -> <Твой диск> -> Properties -> ?


делаю примерно так-же:
Мой компьютер -> (Правая кн мыши) -> Свойства -> оборудование-> диспетчер устройств -> DVD и CD ROM дисководы -> <мой диск> -> свойства -> ??? А где устанавливать свойство Enable cd writing on this drive??? непонятно.... smile 

Автор: xvr 18.12.2008, 23:36
Цитата(Демидрол @ 18.12.2008,  13:34)
Цитата(xvr @  18.12.2008,  13:25 Найти цитируемый пост)
Вызов метода сломался. Что он там вернул - уже неважно   

и что делать, чтобы его починить? smile 

Увы, не знаю.

Цитата

Цитата(xvr @  18.12.2008,  13:25 Найти цитируемый пост)
Видимо на вкладке со свойствами. Мой компьютер -> (Правая кн мыши) -> Свойства -> Hardware -> Device manager -> DVD/CD ROM drives -> <Твой диск> -> Properties -> ?


делаю примерно так-же:
Мой компьютер -> (Правая кн мыши) -> Свойства -> оборудование-> диспетчер устройств -> DVD и CD ROM дисководы -> <мой диск> -> свойства -> ??? А где устанавливать свойство Enable cd writing on this drive??? непонятно.... smile
Немного не там - Мой Компьютер (открыть) -> <Диск> -> Правая кн мыши -> Запись -> Разрешить запись на этом диске

Автор: Демидрол 19.12.2008, 16:15
Цитата(xvr @  18.12.2008,  23:36 Найти цитируемый пост)
Немного не там - Мой Компьютер (открыть) -> <Диск> -> Правая кн мыши -> Запись -> Разрешить запись на этом диске

не нашёл вклдаки <Запись> ни при нажатии правой клавишей на диске, ни в его свойствах...
Может, нужно использовать cd-r, а не cd-rw? smile

Добавлено через 1 минуту и 5 секунд
Цитата(xvr @  18.12.2008,  23:36 Найти цитируемый пост)
Немного не там - Мой Компьютер (открыть) -> <Диск> -> Правая кн мыши -> Запись -> Разрешить запись на этом диске

не нашёл вклдаки <Запись> ни при нажатии правой клавишей на диске, ни в его свойствах...
Может, нужно использовать cd-r, а не cd-rw? smile 

Автор: xvr 19.12.2008, 22:31
Цитата(Демидрол @ 19.12.2008,  16:15)
Цитата(xvr @  18.12.2008,  23:36 Найти цитируемый пост)
Немного не там - Мой Компьютер (открыть) -> <Диск> -> Правая кн мыши -> Запись -> Разрешить запись на этом диске

не нашёл вклдаки <Запись> ни при нажатии правой клавишей на диске, ни в его свойствах...
Может, нужно использовать cd-r, а не cd-rw? smile

А сама XP на него пишет? (Не через Nero, а напрямую)

Автор: Демидрол 20.12.2008, 10:41
не,не пишет, пишет, что нет доступа к диску, какая-то неверная функция =)

Автор: Демидрол 13.1.2009, 16:27
ЭЙ!!!Гуру программирования!!!Помогите, плиз!!!!Может, записывать на диск можно как-нибудь другим способом?
Можно примеры????
Помогите, пожалуйста, никак не справлюсь с этим...

Автор: Sharkfire 17.1.2009, 16:39
Демидрол, XP не пишет а ты хочешь чт бы твой писал? ты шо прикалываешься? 
тем более ты пользуешься стандартными экспишными фукнциями.

Ищи альтернативы либо меняй сидюк

Автор: Демидрол 19.1.2009, 12:05
Sharkfire, дело в том, что дома у меня стоит ХР  от Зверя - она чотко при вставлеии болванки отписывается, что может на него записать чего хочешь.А на работе стоит ХР такая, что....мммм....руки пообрывать, кто её делал...Вот.Я бы с радость. переставил её, но контора решает, а не я))))Поэтому и не знаю, как справиться с проблемой.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)