Port série de l'énumération en Delphi en utilisant SetupDiGetClassDevs
Je vais essayer d'énumérer les "noms" pour les ports COM. Les ports peuvent changer dynamiquement comme USB-série périphériques sont connectés et déconnectés lors de l'exécution.
Fondée sur des méthodes décrites dans cette question, j'essaie d'utiliser le SetupDiGetClassDevs méthode.
J'ai trouvé cet exemple de code, mais il est écrit pour une version plus ancienne de la setupapi l'unité (le lien d'origine de homepages.borland.com ne fonctionne pas bien sûr).
J'ai essayé d'utiliser le setupapi unité de l'actuel JVCL(JVCL340CompleteJCL221-Build3845), mais il ne semble pas être compatible avec Delphi 7. Je reçois des erreurs du compilateur:
if SetupDiGetDeviceRegistryProperty(DevInfoHandle,DeviceInfoData,
RegProperty,
@PropertyRegDataType,
@S1[1],RequiredSize,@RequiredSize) then begin
Dans l'appel à la fonction SetupDiGetDeviceRegistryProperty,
Je reçois le message d'erreur "Types réels et les paramètres formels doivent être identiques" sur les paramètres @PropertyRegDataType, et @RequiredSize.
La Delphi3000 site me dit que le code a été écrit en 2004 et est prévu pour Delphi 7, donc je ne sais pas pourquoi il ne fonctionne pas avec Delphi 7 maintenant, à moins que setupapi a changé. Est quiconque est familier avec les changements de setupapi que pourrait causer ces problèmes?
Je suis en essais avec un simple programme de console. Le utilise l'instruction est " de windows,
sysutils,
classes,
setupAPI,
Registre;"
Le programme principal est:
begin
ComPortStringList := SetupEnumAvailableComPorts;
for Index := 0 to ComPortStringList.Count - 1 do
writeln(ComPortStringList[Index]);
end;
end.
OriginalL'auteur tim11g | 2011-02-15
Vous devez vous connecter pour publier un commentaire.
Ressemble à certains arguments de type
PDWord
ont été remplacés par desvar DWord
dansSetupApi.pas
. Tous vous avez besoin est de supprimer le '@' partir de ces arguments dans votre code comme ça:OriginalL'auteur kludg
La procédure suivante fonctionne correctement pour moi (sous Windows 8.1). Il est important d'utiliser le paramètre
KEY_READ
dans leTRegistry.Constructor
.Cette procédure doit fonctionner correctement dans Windows 10 alse, mais je n'ai pas vérifié encore.
Fonctionne également sous Windows 7
OriginalL'auteur Grzegorz Skoczylas
J'ai été en mesure d'obtenir quelques suggestions spécifiques par poser la question d'une façon différente avec différents tags.
Il s'avère qu'il y avait des erreurs dans la delphi3000.com exemple de code, et, éventuellement, des erreurs dans la JVCL code. Après la fixation de l'exemple d'erreurs de code, je l'ai eu à travailler. Je n'ai pas abordé le potentiel JVCL erreurs.
Voici le code de travail (comme une simple application console) pour énumérer les noms des ports com:
OriginalL'auteur tim11g
Ne vous ont "tapé @ opérateur" est-il activé? Les options de projet, Compilateur, onglet "options de Syntaxe". Beaucoup de la troisième partie du code des pauses si cette option est activée.
OriginalL'auteur
Pour une opération plus facile que vous pourriez envisager de simplement en utilisant le registre où ces noms sont répertoriés par exemple:
(J'ai omis la main en agitant des trucs).
Vous pouvez également envisager l'utilisation de WMI - voir cet exemple de Magenta Systèmes, vous pouvez obtenir un peu près tout le matériel liés à maintenant.
OriginalL'auteur Brian Frost