Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись на CD 
:(
    Опции темы
Демидрол
Дата 31.10.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



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

Помогите,пожалуйста, и не отсылайте в погуглиться - искал, инфы много, но исходников почти нет. smile 
PM MAIL   Вверх
Демидрол
Дата 10.11.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

Читать тут
PM MAIL   Вверх
Демидрол
Дата 10.11.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Например, пишу:
Код

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, 14:21
PM MAIL   Вверх
Демидрол
Дата 10.11.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



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

    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 
PM MAIL   Вверх
Демидрол
Дата 10.11.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Косяк опять из-за рук =)
меняем местами строчки
Код

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

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

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

P.S. помогит пожалуйста голову не ломать и помогите примером, как копировать из директории в директорию. ПОЖАЛУЙСТА!!!
PM MAIL   Вверх
xvr
Дата 10.11.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Демидрол @ 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());

PM MAIL   Вверх
mrbrooks
Дата 10.11.2008, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



А может еще есть смысл покурить SDK на тот же Nero - это все есть на его офф. сайте.
PM MAIL   Вверх
SVN74
Дата 10.11.2008, 22:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 11
Всего: 18



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

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

 smile 

PM MAIL WWW   Вверх
Демидрол
Дата 13.11.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Всем спасибо большое за оказанную помощь, Тему закрываю. smile  smile 
PM MAIL   Вверх
Демидрол
Дата 27.11.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



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

    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 

Это сообщение отредактировал(а) Демидрол - 27.11.2008, 18:00
PM MAIL   Вверх
xvr
Дата 27.11.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Демидрол @ 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);

PM MAIL   Вверх
Демидрол
Дата 27.11.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



 smile 
xvr, спасибо за помощь!!!Твои ответы мне всегда помогают!!Спасибо ОГРОМНОЕ!!! smile 

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

Это сообщение отредактировал(а) Демидрол - 28.11.2008, 12:43
PM MAIL   Вверх
Демидрол
Дата 15.12.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 7.6.2008
Где: СПб

Репутация: нет
Всего: нет



Ау...никто не знает, как решить проблему с возвращаемым значением функции GetRecorderDriveLetter?
PM MAIL   Вверх
xvr
Дата 15.12.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



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

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

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


Это сообщение отредактировал(а) xvr - 15.12.2008, 17:32
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.