コンピーターで使用できるシリアルポート(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.
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
kkkさんありがとうございました。
XPとVista両方で表示できました。
\Device\Serial0など名前が表示されるので、データを表示することは可能でしょうか?
再度よろしくお願いします。
解決しました。
アドバイスされたリストの下に
for i:=0 to ComboBox1.items.count-1 do
begin
ComboBox1.items[i]:=ReadString(ComboBox1.items[i]);
end;
を付けたらCOM1,COM2,・・・と表示するようになりました。
ありがとうございました。
ツイート | ![]() |