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

Вниз

Аналог Mem в Делфи   Найти похожие ветки 

 
Dadhi   (2005-07-10 23:06) [0]

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


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

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

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

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

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


 
Dadhi   (2005-07-11 07:47) [2]

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


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

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


 
Digitman ©   (2005-07-11 08:25) [4]


> Dadhi   (11.07.05 07:47) [2]


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

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

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


 
y-soft ©   (2005-07-11 10:15) [5]

>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) в современных условиях даже и не позволит получить список всех доступных принтеров...


 
y-soft ©   (2005-07-11 10:45) [6]

Да, самый простой способ, наверное, использовать 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


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


> y-soft


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


 
y-soft ©   (2005-07-11 10:57) [8]

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

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


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


 
Digitman ©   (2005-07-11 11:17) [9]


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


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


 
Kolan ©   (2005-07-11 11:54) [10]

Вот процедура проверки порта на существование:
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:56) [11]


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


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


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

>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 :)


 
Kolan ©   (2005-07-11 12:36) [13]


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

Доступных



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

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

Наверх




Память: 0.5 MB
Время: 0.026 c
3-1119423284
_Anton
2005-06-22 10:54
2005.07.31
динамические ADO в потоках


1-1121297550
JohnSmith
2005-07-14 03:32
2005.07.31
Как создать динамический массив потоков ?


1-1121250672
Archer84
2005-07-13 14:31
2005.07.31
Одноименные объекты


8-1111931405
ASD!
2005-03-27 17:50
2005.07.31
Посоветуйте компонент поддерживающий все графические форматы!


3-1119432152
new___
2005-06-22 13:22
2005.07.31
не найден Ehlib70.bpl