Entwickler-Ecke

Windows API - wie rufe ich folgende Prozedur auf? bitte um hilfe!


oOXTCOo - Mi 15.07.09 14:46
Titel: wie rufe ich folgende Prozedur auf? bitte um hilfe!
hallo!

ich brauche bitte kurz hilfe, ich versuche seit einiger zeit nun die folgene prozedur aufzurufen. ich versuche diese in ein memo darzustellen, doch es kommen immer nur wilde zeichen dabei raus.

diese funktion soll alle com ports + namen auslesen können ohne der jedi komponente (hab die jedi auch schonb getestet, doch meine modem ports werden damit nicht anzeigt, darum setzte ich meine hoffnung nun in diesem code den ich gefunden habe).


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
function GetComNames: TStrings; 
var 
  KeyNames1,KeyNames2,KeyNames3: TStrings; 
  Res: TStringList; 
  i,ii,iii: integer; 
  s,Key0: string
begin 
  KeyNames1 := TStringList.Create; 
  KeyNames2 := TStringList.Create; 
  KeyNames3 := TStringList.Create; 
  Key0 := '\SYSTEM\CurrentControlSet\Enum\';  
  Res := TStringList.Create; 
  with TRegistry.Create do begin 
    try 
      RootKey := HKEY_LOCAL_MACHINE; 
      if OpenKeyReadOnly(Key0) then begin 
        GetKeyNames(KeyNames1); 
        for i:=0 to KeyNames1.Count-1 do begin 
          OpenKeyReadOnly(Key0+KeyNames1[i]+'\'); 
          GetKeyNames(KeyNames2); 
          for ii:=0 to KeyNames2.Count-1 do begin 
            OpenKeyReadOnly(Key0+KeyNames1[i]+'\'+KeyNames2[ii]+'\'); 
            GetKeyNames(KeyNames3); 
            for iii:=0 to KeyNames3.Count-1 do begin 
              OpenKeyReadOnly(Key0+KeyNames1[i]+'\'+KeyNames2[ii]+'\'+KeyNames3[iii]+'\'); 
              if KeyExists('Device Parameters'then begin 
               s := ReadString('FriendlyName'); 
               OpenKeyReadOnly(Key0+KeyNames1[i]+'\'+KeyNames2[ii]+'\'+KeyNames3[iii]+'\Device Parameters\'); 
               if ValueExists('PortName'then begin 
                 s := ReadString('PortName')+'|'+s; 
                 if Pos('COM',s)=1 then Res.Add(s+'|'+KeyNames1[i]); 
                 end
               end
            end
          end
        end
      end
      finally 
      CloseKey; 
      Free; 
    end
  end
  //sortieren 
  Res.Sort; 
  Result := Res; 
end;



grüße
hari



ps:

wenn ich eine schleife mache und es als in einem array of char lade und dann ins memo schreibe bekomme ich so einen schrott: XüŒ´ŒP D< \8üp@d4¬ˆØÄ ô(¼äp„tü04(ØŒx(\ðd`Ü`8LP ”,üÔœÐèPd´ T4ÐXàøDèh¸¬Püt ìxÔˆ(\ì¼ Ä@h4
èH4øDL¬€¤0¤PHtt



alles klar, ist schon wieder meine blödheit warums nicht geklappt hat:

COM11|JAF Port (COM11)|FTDIBUS
COM12|HUAWEI Mobile Connect - 3G Modem|USB
COM13|HUAWEI Mobile Connect - 3G PC UI Interface (COM13)|USB
COM14|HUAWEI Mobile Connect - 3G Modem #2|USB
COM15|HUAWEI Mobile Connect - 3G PC UI Interface (COM15)|USB
COM16|HUAWEI Mobile Connect - 3G Modem #3|USB
COM17|HUAWEI Mobile Connect - 3G PC UI Interface (COM17)|USB
COM18|JAF Port (COM18)|FTDIBUS
COM19|HUAWEI Mobile Connect - 3G Modem #4|USB
COM20|HUAWEI Mobile Connect - 3G PC UI Interface (COM20)|USB
COM3|HDAUDIO Soft Data Fax Modem with SmartCP|HDAUDIO
COM4|ELTIMA Virtual Serial Port (COM4)|VSBUS
COM4|JAF Port (COM4)|FTDIBUS
COM5|JAF Port (COM5)|FTDIBUS
COM6|JAF Port (COM6)|FTDIBUS
COM7|RIM Virtual Serial Port v2 (COM7)|Root
COM8|RIM Virtual Serial Port v2 (COM8)|Root
COM9|JAF Port (COM9)|FTDIBUS



jetzt bräuchte ich avber doch noch hilfe...
da werden leider alle installierten ports angezeigt, ich will aber nur die haben die auch wirklich gerade verbunden sind. hat jemand eine gute idee?


wie mache ich am besten folgendes: ich lese alle vorhandenen comports mit enumcomport aus, dannach lese ich mit der obigen prozedur alle installierten comports aus, und verlgleiche die liste, was nicht bei enumcomport drinn ist wird rausgeschmissen...


wie stelle ich das nun am besten an?


Reinhard Kern - Mi 15.07.09 16:01

user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
hallo!
jetzt bräuchte ich avber doch noch hilfe...
da werden leider alle installierten ports angezeigt, ich will aber nur die haben die auch wirklich gerade verbunden sind. hat jemand eine gute idee?
...


Hallo,

nein, woher soll denn ein Comport wissen, ob am anderen Ende was dranhängt? Du könntest Statusleitungen abfragen, aber die werden häufig nicht verwendet, z.B. bei Xon/Xoff-Protokoll. Einfach was senden geht auch nicht, du kannst die Konsequenzen nicht abschätzen. Wenn du am Telefon nur Rauschen hörst, weisst du ja auch nicht, ob da jemand ist, und wenn du rufst "ist da wer" und keiner antwortet, beweist das andrerseits nicht, dass niemand da ist.

Gruss Reinhard


Xentar - Mi 15.07.09 16:09

@Reinhard: Das meint er nicht.
In der Liste werden alle COM Ports aufgeführt, die "irgendwann" mal am Rechner waren, also auch z.B. USB Serial Wandler, die gar nicht mehr angesteckt sind.


@Topic:
Du könntest deine Liste mit der hier abgleichen
\\\Registry\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\

Dort stehen nur die COM Nummern drin, die zur Zeit mit dem Rechner verbunden sind.


oOXTCOo - Mi 15.07.09 17:21

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
@Reinhard: Das meint er nicht.
In der Liste werden alle COM Ports aufgeführt, die "irgendwann" mal am Rechner waren, also auch z.B. USB Serial Wandler, die gar nicht mehr angesteckt sind.


@Topic:
Du könntest deine Liste mit der hier abgleichen
\\\Registry\HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM\

Dort stehen nur die COM Nummern drin, die zur Zeit mit dem Rechner verbunden sind.


danke... das kann ich mal versuchen...