Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Аналог 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.064 c
11-1103779933
DVK
2004-12-23 08:32
2005.07.31
Лишняя начальная строка в ListView


4-1117809351
iskatel
2005-06-03 18:35
2005.07.31
пульт avermedia


1-1121265337
Delphi_is_cool
2005-07-13 18:35
2005.07.31
TWebBrowser.Перехватить открытие страницы в новом окне


3-1119572382
akhmadey
2005-06-24 04:19
2005.07.31
Как сохранить изменеия в таблице, используя UpdateSQL?


3-1118912565
Лиса
2005-06-16 13:02
2005.07.31
Разграничение прав пользователей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский