How can I find serial port(SUNIX PCI Serial I/O Card)

I'm using WMI to list serial port (com1~ ...)

Dev Environment: Vista + Delphi2009
Run Environment: Win7 (with pci card)

Here is wmi query:
SELECT DeviceID,Description FROM Win32_SerialPort

But it list only default COM1, not work for SUNIX pci serial i/o card. (COM3~COM10)

Windows device manager show correctly serial ports like this:
COM1 (default in bios)
SUNIX COM Port(COM3 - 10)

any idea?

byunghoAsked:
Who is Participating?
 
epasquierConnect With a Mentor Commented:
try this
procedure ScanDOSDevices(Var List:TStringList);
var
  Str: string;
  Size, i, j: dword;
begin
 if Not Assigned(List) then List:=TStringList.Create Else List.Clear;
 i:=10000;
 Setlength(Str, i) ;
 Size := QueryDosDevice(nil, @Str[1], i) ;
 While (Size=0) And (GetLastError=ERROR_INSUFFICIENT_BUFFER) do
  begin
   Inc(i,10000);
   Setlength(Str, i) ;
   Size := QueryDosDevice(nil, @Str[1], i) ;
  end;
 for j := 1 to Size-1 do if Str[j] = #0 then Str[j] := ',';
 List.CommaText := Str;
end;

procedure ScanCOMDevices(Var List:TStringList);
Var
 i:integer;
begin
 ScanDOSDevices(List);
 for i := List.Count - 1 downto 0 do if Copy(List[i],1,3)<>'COM' then List.Delete(i);
 List.Sort;
end;

Open in new window

0
 
Ephraim WangoyaCommented:
Have you tried this solution from sergeworks

procedure TForm3.Button1Click(Sender: TObject);
 var
   Locator:  ISWbemLocator;
   Services: ISWbemServices;
   ObjSet:   ISWbemObjectSet;
   SObject:  ISWbemObject;
   PropSet:  ISWbemPropertySet;
   SProp:    ISWbemProperty;
   sValue:   String;
   Enum:     IEnumVariant;
   Value:    Cardinal;
   TempObj:  OleVariant;
 begin
   Memo1.Lines.Clear;
   Locator:= CoSWbemLocator.Create;
   Services:=  Locator.ConnectServer('.', 'root\cimv2', '', '', '','', 0, nil);
   ObjSet:= Services.InstancesOf('Win32_SerialPort', wbemFlagReturnWhenComplete, nil);
   Enum:= (ObjSet._NewEnum) as IEnumVariant;
   while (Enum.Next(1, tempObj, Value) = S_OK) do
   begin
     SObject:= IUnknown(tempObj) as SWBemObject;
     PropSet := SObject.Properties_;
     SProp:= PropSet.Item('DeviceID',0);
     sValue:= SProp.Get_Value;
     Memo1.Lines.Add(sValue);
   end;
 end;
0
 
jimyXCommented:
Is the device enabled in the Device Manager (ports) ?
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
byunghoAuthor Commented:
to ewangoya//  It's same result.

to jimyX// Yes, I connected one port COM4.

0
 
byunghoAuthor Commented:
to epasquier// It works,  thank you.

Is it right method to this? I want prefer to use WMI.
0
 
epasquierCommented:
WMI is just an extensive layer to get hardware information , among other things.
but it is heavy to use and sometimes it does not return what we need.

The code above is based on Windows API to get all devices as enumerated in the hardware manager. I don't know if it is the only one, but that is one that works on all windows systems and quickly.
It is up to you then to decide if it is "the right" method
0
 
byunghoAuthor Commented:
to epasquier//

Yes! It is "right method" to list serial port names.

If available by wmi to detail information, it's perfact for me.
0
All Courses

From novice to tech pro — start learning today.