Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Аналог Mem в Делфи [D7, Win2k]


Dadhi ©   (2005-07-10 23:06:00) 

В паскале есть функция Mem позволяющая считать значение в определенной ячейке памяти. Кто-нибудь знает подобную функцию в Делфи?


Kolan   (2005-07-11 12:36:00) [1]


> Digitman ©   (11.07.05 11:17) [9]

Доступных


y-soft   (2005-07-11 12:20:00) [2]

>Digitman ©   (11.07.05 11:17) [9]

в [4] речь идет как раз о портах, а не о принтерах

1.Сказанное в [4] частично верно в NT-системах (не учитывает например мультипортовые платы), но не в Win9X, и не факт, что будет верно в будущих версиях Windows...

2.В указанных разделах реестра перечисляются не только физические устройства

3. Если уж брать информацию из реестра, то надо просматривать и анализировать гораздо больше ключей, причем в разных версиях ОС, эти ключи будут тоже разные

Вопрос: зачем усложнять себе жизнь, если в Windows существуют специальные механизмы, непосредственно предназначенные для получения информации об установленном железе?

С уважением

>Kolan ©   (11.07.05 11:54) [10]

Тогда уж лучше делать так:

function TComPort.IsPortExists(const PortName: string): Boolean;
var
TempPortHandle: THandle;
TempName : string;
const
Prefix = '\\.\';
begin
Result := False;
 if Pos(Prefix, PortName = 1 then
   TempName := PortName
 else
   TempName := Prefix + PortName;
TempPortHandle := CreateFile(PChar(TempName), GENERIC_READ or GENERIC_WRITE,
  0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

if TempPortHandle <> INVALID_HANDLE_VALUE then
begin
  CloseHandle(TempPortHandle);
  Result := True;
end
else  
 case GetLastError of
   ERROR_ACCESS_DENIED, ERROR_GEN_FAILURE, ERROR_SHARING_VIOLATION : Result := True;

 end;  
end;


Недостаток такого подхода - иногда (например с модемами) это выполняется довольно долго...

Да, в NT системах может существовать до 255 COM-портов, а не 11 :)


Digitman   (2005-07-11 11:56:00) [3]


> Kolan ©   (11.07.05 11:54) [10]


с чего ты решил, что INVALID_HANDLE_VALUE есть достоверный факт несуществования порта ?


Kolan   (2005-07-11 11:54:00) [4]

Вот процедура проверки порта на существование:
function TComPort.IsPortExists(const PortName: string): Boolean;
var
 TempPortHandle: THandle;
begin
 Result := False;
 TempPortHandle := CreateFile(PChar(PortName), GENERIC_READ or GENERIC_WRITE,
   0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

 if TempPortHandle <> INVALID_HANDLE_VALUE then
 begin
   CloseHandle(TempPortHandle);
   Result := True;
 end;
end;


Пример использования:
procedure TComPort.FindAllAvailablePorts(var Strings: TStrings);
var
 I: Byte;
begin
 Strings.Clear;
 for I := 0 to 10 do
   if IsPortExists('COM'+ IntToStr(I)) then
     Strings.Add('COM'+ IntToStr(I));

 if IsPortExists('LPT1') then
     Strings.Add('LPT1');

 if IsPortExists('LPT2') then
     Strings.Add('LPT2');
end;


Digitman   (2005-07-11 11:17:00) [5]


> y-soft ©   (11.07.05 10:57) [8]


в [4] речь идет как раз о портах, а не о принтерах


y-soft   (2005-07-11 10:57:00) [6]

>Digitman ©   (11.07.05 10:52) [7]

принтеры-то причем ?
мало ли что к lpt м.б. подключено)


Точно. Но в сам же говоришь в [4]: и не занимайся ерундой с "определенными ячейками":)


Digitman   (2005-07-11 10:52:00) [7]


> y-soft


принтеры-то причем ?
мало ли что к lpt м.б. подключено)


y-soft   (2005-07-11 10:45:00) [8]

Да, самый простой способ, наверное, использовать EnumPrinters
(определена в winspool.pas)

function EnumPrinters(Flags: DWORD; Name: PChar; Level: DWORD;
 pPrinterEnum: Pointer; cbBuf: DWORD; var pcbNeeded, pcReturned: DWORD): BOOL; stdcall;


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_9fjn.asp


y-soft   (2005-07-11 10:15:00) [9]

>Dadhi   (11.07.05 07:47) [2]

Вариант 1 - (см. Digitman ©   (11.07.05 08:25) [4]), - так делают, хотя Microsoft рекомендует иные способы

Вариант 2 - Последовательно пробовать открывать все порты LptN с помощью CreateFile и анализировать код ошибки, если функция вернула False

Вариант 3 - На системах NT использовать QueryDosDevice и анализировать полученные имена

Вариант 4 - Использовать функцию EnumPorts (она специально задумана, чтобы возвращать список всех последовательных и параллельных портов в системе)

Вариант 5 - Использовать функции из SetupAPI (получить список устройств классов "Ports"), как это делает Диспетчер устройств Windows (можно получить вообще кучу информации, в т.ч. и о виртуальных принтерах)

Вариант 6 - использовать WMI

Последние 2 варианта самые мощные и продвинутые, причем вариант 5 работает практически в любых 32-х разрядных версиях Windows

Мало? :)

А прямое чтение из памяти (даже если работать в кольце 0) в современных условиях даже и не позволит получить список всех доступных принтеров...


Digitman   (2005-07-11 08:25:00) [10]


> Dadhi   (11.07.05 07:47) [2]


смотри реестр здесь :

HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\PARALLEL PORTS
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM

и не занимайся ерундой с "определенными ячейками"


Fay   (2005-07-11 08:20:00) [11]

2 Dadhi   (11.07.05 7:47) [2]
>> Мне нужно считать из памяти количество лпт-портов
А ты знаешь, где оно лежит в памяти, это количество?


Dadhi   (2005-07-11 07:47:00) [12]

Мне нужно считать из памяти количество лпт-портов и некоторую другую информацию.


Юрий Зотов   (2005-07-10 23:15:00) [13]

Если в своем процессе, то и функции никакой не нужно - берем значение по адресу, да и все.

Если в любом процессе - то ReadProcessMemory.

=======================

Win32 - это не DOS, обычные программы (3-го кольца) с физической памятью напрямую не работают, а виртуальная память - своя у каждого процесса. Да и часть виртуальной памяти (даже собственной) программе недоступна.


Наверх

Титульная страница Поиск, карта сайта Написать письмо