シリアルポート(COMポート)の自動取得について

解決


GLT  2008-05-27 03:57:17  No: 30801

コンピーターで使用できるシリアルポート(COMポート)を自動的に取得しコンボボックスに表示する方法をネットで見つけWindowsXPでは問題無く表示していたのですが、WindowsVistaでは表示が出ません。

http://mojeld.blog41.fc2.com/blog-category-2.html
上記のホームページを参考にしてみたのですが、こちらはXPでも表示しませんでした。
XPとVista両方でシリアルポートの一覧を表示できる方法を教えていただけませんか?

XPでは問題無く表示してたソース
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Borland.Vcl.Registry, System.ComponentModel, Borland.Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.nfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Reg:TRegistry;
  i:integer;
begin
 with TRegistry.create do
  try
   rootkey:=HKEY_LOCAL_MACHINE;
   if keyexists('HARDWARE') then begin
    if openkey('HARDWARE',false)then begin
     if keyexists('DEVICEMAP') then begin
      if openkey('DEVICEMAP',false)then begin
       if keyexists('SERIALCOMM') then begin
        if openkey('SERIALCOMM',false)then begin
         GetValueNames(ComboBox1.Items);
         for i:=0 to ComboBox1.items.count-1 do
          begin
           ComboBox1.items[i]:=ReadString(ComboBox1.items[i]);
          end;
         end
        end;
       end;
      end;
     end;
   end;
  finally free;
  end;
end;
end.


kkk  2008-05-27 14:50:12  No: 30802

VistaではRegistryにアクセス制限が入るようになったためです。
表示するだけなら TRegistry.Create(KEY_READ) として読み込みのみモードにすると大丈夫です。
また上記のように長々と書かなくて

    with TRegistry.Create(KEY_READ) do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM', False);
      GetValueNames(ComboBox1.Items);
      ・・・

でOK


GLT  2008-05-27 21:26:58  No: 30803

kkkさんありがとうございました。
XPとVista両方で表示できました。
\Device\Serial0など名前が表示されるので、データを表示することは可能でしょうか?
再度よろしくお願いします。


GLT  2008-05-28 19:34:36  No: 30804

解決しました。
アドバイスされたリストの下に

for i:=0 to ComboBox1.items.count-1 do
begin
  ComboBox1.items[i]:=ReadString(ComboBox1.items[i]);
end;

を付けたらCOM1,COM2,・・・と表示するようになりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加