Консультация № 178520
20.05.2010, 16:46
0.00 руб.
0 7 1
Доброго времени суток, уважаемые!
Пишу программу записи дисков, использующую IMAPI. В общем и целом все работает, но не могу получить список доступных скоростей привода (MsftDiscFormat2Data.SupportedWriteSpeeds; PSafeArray).
Подскажите, пожалуйста, каким образом занести эти данные в массив и вытащить их оттуда.
С уважением, Савенко В.

Приложение:
http://www.interface.ru/home.asp?artId=21190

Обсуждение

Неизвестный
21.05.2010, 03:42
общий
это ответ
Здравствуйте, Савенко Вадим Иванович.
Посмотрите здесь: http://kodenet.ru/212-zapis-cd-dvd-diskov-v-delphi.html
давно
Профессионал
153662
1070
22.05.2010, 12:38
общий
Савенко Вадим Иванович:
А можете выложить свои наработки здесь? Что бы не начинать с нуля.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
22.05.2010, 21:54
общий
to Евгений/Genia007/
Пробовал таким образом получить поддерживаемые скорости, но получаю только одну цифру - 3.
Практически тот же код приведен в уроках по работе с COM/DCOM на сайте www.delphikingdom.com.
давно
Профессионал
153662
1070
23.05.2010, 17:40
общий
Савенко Вадим Иванович:
Чего то не хочет работать это пример http://forum.sources.ru/index.php?showtopic=299874 (неизвестные идентификаторы и всё, хоть тресни, в частности SafeArrayGetVartype), дайте Ваш этот код процедуры.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
24.05.2010, 08:44
общий
to Евгений/Genia007/

// Разработчики модуля ActiveX почему-то забыли импортировать функцию
// SafeArrayGetVartype, поэтому делаем это сами
function SafeArrayGetVartype(psa: PSafeArray; out vt: TVarType): HResult; stdcall;
external 'oleaut32.dll';

procedure TMainForm.Button1Click(Sender: TObject);
type
TVarDataArray = array[0..MaxInt div SizeOf(TVarData) - 1] of TVarData;
PVarDataArray = ^TVarDataArray;
var
PNumbers: PIntegerArray;
VNumbers: TVarType;
I, Bound: Integer;
Result: HResult;
begin
MsftDiscRecorder.Disconnect;
MsftDiscRecorder.InitializeDiscRecorder
(MsftDiscMaster.Item[RecordersComboBox.ItemIndex]);
MsftDiscFormat2Data.Recorder := MsftDiscRecorder.DefaultInterface;
MsftDiscFormat2Data.ClientName := 'IMAPI';
// Проверяем, что нижний индекс массива равен нулю
Result := SafeArrayGetLBound(MsftDiscFormat2Data.SupportedWriteSpeeds, 1, Bound);
if Failed(Result) then
Exit;
if Bound <> 0 then
begin
ShowMessage('нижний индекс массива не равен нулю');
Exit;
end;
Result := SafeArrayGetVartype(MsftDiscFormat2Data.SupportedWriteSpeeds, VNumbers);
if Failed(Result) then
Exit;
if VNumbers <> vt_variant then
Exit;
// Получаем верхнюю границу массива
Result := SafeArrayGetUBound(MsftDiscFormat2Data.SupportedWriteSpeeds, 1, Bound);
if Failed(Result) then
Exit;
// Получаем доступ к данным массива
Result := SafeArrayAccessData(MsftDiscFormat2Data.SupportedWriteSpeeds, PPointer(@PNumbers)^);
if Failed(Result) then
Exit;
for I := 0 to Bound do
Memo1.Lines.Add(IntToStr(PNumbers^[I]));
MsftDiscRecorder.Disconnect;
end;
Неизвестный
24.05.2010, 08:46
общий
to Евгений/Genia007/
Да, еще в uses нужно ActiveX добавить
давно
Профессионал
153662
1070
24.05.2010, 15:05
общий
Савенко Вадим Иванович:
в uses ActiveX я добавил сразу, а вот с SafeArrayGetVartype и была засада, и в нете не нашёл нормального разъяснение этого момента. Пока не пойму почему у меня выскакивает либо переполнение стека, либо ошибка ole.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа