Текущий архив: 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.48 MB
Время: 0.041 c