Buscar

Como achar um modem e sua porta?

Código

{Todas as informações sobre o modem instalado estão contidas no registro do Windows. Usando TRegistry podemos, facilmente, ter acesso à essas informações. Porém, dependendo do modem, ele pode não especificar em qual porta está instalado. Então devemos primeiro
descobrir quantas portas serial existem no sistema, criar um Handle para receber a Porta e depois fazer tentativas de abertura em cada uma delas no modo Leitura/Escrita (GENERIC_READ or GENERIC_WRITE). Se tentarmos, por exemplo, abrir a COM1 (que, geralmente, está o mouse), não conseguiremos abrí-la e retornará erro (INVALID_HANDLE_VALUE). Podemos então manipular o retorno. A forma ideal é criar um loop para que todas as portas sejam checadas.
 
O Procedure abaixo, pega as informações contida nas chaves: HKEY_LOCAL_MACHINE....SerialComm e ....modem000
A chave ...modem000, refere-se ao primeiro modem encontrado, caso existir mais que um, este será ..modem001, 0002... e assim por diante.
 
Veja bem, poderemos ir diretamente apenas na chave do modem para saber em que porta ele está instalado. Esta informação estará na Subsecção "AttachedTO", porém, nem todos os modems registram esta informação. Portando, o modo mais seguro, e eficaz, é usar tentativas
de abertura como descrito abaixo. }

  unit PegaPorta;


interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, Registry;
 
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PegaModem(porta: string);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
procedure TForm1.PegaModem(porta : string);
var
FHandle : THandle;
Reg : TRegistry;
Lista : TStrings;
i : integer;
varPorta, varModelo : string;
begin
Reg :=TRegistry.Create;
 
//Procurar na secção...
Reg.RootKey :=HKEY_LOCAL_MACHINE;
 
//SubSecção onde estão as Portas de comunicação disponíveis
if Reg.OpenKey('HardwareDeviceMapSerialComm', false) then begin
 
//Cria a uma 'lista' das portas encontradas (mouse, modem... etc..)
lista := TStringList.Create;
 
//Adiciona à 'lista' as portas encontradas
Reg.GetValueNames(lista);
for i := 0 to lista.count -1 do begin
if trim(porta) = '' then
begin
varPorta := Reg.ReadString(lista[i]);// Lê nome da porta
combobox1.Items.Add(varPorta);
end
else
varPorta := porta;
 
{Cria o Handle para receber a(s) porta(s) e faz tentativa de abertura em todas encontradas, no modo leitura ou escrita (modem) }
FHandle := CreateFile(
PChar('\.' + varPorta),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
 
// Se for uma porta válida para modem...
if FHandle <> INVALID_HANDLE_VALUE then begin
CloseHandle(FHandle); // Fecha o Handle e a porta
 
//Pega o nome/modelo do modem instalado na porta existente
if Reg.OpenKey('SystemCurrentControlSet'+
'ServicesClassModem000', false)then begin
varModelo := Reg.ReadString('Model');
Label2.Caption := varModelo+' - Instalado na porta '+varPorta;
Combobox1.Text := varPorta;
end;
end
else
Label2.Caption := 'Não há modem instalado na porta '+varPorta;
end;
//Fecha e libera variáveis
Reg.CloseKey;
Lista.Free;
Reg.Free;
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
porta : string;
begin
Combobox1.Clear;
PegaModem(porta);
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
var
porta : string;
begin
//Verificar se existe mais de um modem...
porta := combobox1.text;
PegaModem(porta);
end;
 
end.

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Windows
Adicionada dia: 04/06/03
Por: Felipe Monteiro
Visualizada: 4530 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009