Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

CreateFile для привода CD   Найти похожие ветки 

 
Users   (2004-06-21 14:34) [0]

Имеется CD на D:, пытаюсь получить на него Handle:

hDrive:=CreateFile("\\.\D:", GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, Nil, OPEN_EXISTING, 0, 0);


получаем INVALID_HANDLE_VALUE

причем диск точно есть ! Система XP, права администратора.

Может проблема из за LPSECURITY_ATTRIBUTES - они выставлены в nil.


 
Игорь Шевченко ©   (2004-06-21 14:39) [1]

Что говорит GetLastError ?
(И маленький такой вопрос - зачем GENERIC_WRITE для CD ?)


 
Users   (2004-06-21 14:52) [2]

SysErrorMessage(GetLastError) говорит что :

"процесс не может получить доступ к файлу, т.к. этот файл занят другим процессом". Такое впеч-е, что блокирует что то :( хотя не понятно что, попробую перезагрузить машину.

GENERIC_WRITE - прочитал, что это нужно для доступа к CD для Win2000 и выше.


 
Anatoly Podgoretsky ©   (2004-06-21 14:59) [3]

GENERIC_WRITE это запись, что ты собираешься писать на CD


 
Users   (2004-06-21 15:22) [4]

по поводу GENERIC_WRITE :

Вот что написано в оригинале :

/*
* Universal function to get a file handle to the CD device.  Since
* NT 4.0 wants just the GENERIC_READ flag, and Win2K wants both
* GENERIC_READ and GENERIC_WRITE (why a read-only CD device needs
* GENERIC_WRITE access is beyond me...), the easist workaround is to just
* try them both.
*/

http://cvs.sourceforge.net/viewcvs.py/cdexos/cdexos/CDRip/NTScsi.cpp?rev=1.15


 
Игорь Шевченко ©   (2004-06-21 16:07) [5]

А попробовать убрать GENERIC_WRITE - ситуация изменится ?
Потому как такой код прекрасно открывает:
unit main;

interface
uses
 Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TfMain = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   FCDRom: THandle;
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

procedure TfMain.FormCreate(Sender: TObject);
begin
 FCDRom := CreateFile("\\.\H:", GENERIC_READ, FILE_SHARE_READ, nil,
   OPEN_EXISTING, 0, 0);
 if FCDRom = INVALID_HANDLE_VALUE then
   RaiseLastWin32Error;
 ShowMessageFmt("CD_ROM opened, its handle is %.8x", [FCDRom]);
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
 CloseHandle(FCDRom);
end;

end.


 
Игорь Шевченко ©   (2004-06-21 16:08) [6]

Справедливости ради надо сказать, что с GENERIC_WRITE тоже открывает, когда диска в устройстве нет.


 
Users   (2004-06-21 19:13) [7]

GENERIC_WRITE - нужен только для XP,2000. А так проверял, заработало.


 
Users   (2004-06-21 19:21) [8]

Кстати, еще была проблема :

если загружена библиотка WNASPI32.DLL - она создает монопольный доступ к CD.


 
Alex Konshin ©   (2004-06-22 07:56) [9]

А диск SCSI?

Посмотри исходники на http://akrip.sourceforge.net/
Возможно ничего и писать не придется.


 
Users   (2004-06-22 13:07) [10]

Нет диск обычный IDE.

В общем я с этой проблемой разобрался:

Если грузим библиотеку WNASPI32.DLL, т.е. хотим пользоваться ASPI интерфейсом, или какая либо др. программа ее использует - нет возможности использовать STPI - CreateFile возвращает ошибку - блокировка др. процессом.

По этому нужно использовать ASPI или STPI интерфейс.



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
1-1090426260
ko
2004-07-21 20:11
2004.08.01
TSaveDialog


4-1087375133
Awod
2004-06-16 12:38
2004.08.01
Отлов смены расскладки клавиатуры.


3-1089030764
R.O.O.T
2004-07-05 16:32
2004.08.01
Проблемы при работе с DAO


11-1078153729
Dentall
2004-03-01 18:08
2004.08.01
Создание нескольких экземпляров форм


3-1088662449
Alexsandr
2004-07-01 10:14
2004.08.01
блокировка записей