Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Discussion: CreateFile et GUID

  1. #1
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 20
    Points : 3
    Points
    3

    Par défaut CreateFile et GUID

    Bonjour,
    J'essaie d'ouvrir un device USB avec CreateFile (borland).
    Mon handle est toujours invalide.

    Ma fonction est de ce type:
    hUsb=CreateFile("\\?\usb#vid_05ca&pid_1834#5&349ef221&0&8#{a5dcbf10-6530-11d2-901f-00c04fb951ed}",
    GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,NULL);

    if(hUsb == INVALID_HANDLE_VALUE) .......

    Le GUID est intercepté par la variable :detail->DevicePath , donc correcte.
    J'ai essayé differents formats "\\.\usb, \\\\?\\usb, \\\\.\\usb....." mais sans succès.
    L'alignement des données sur le compilateur est en byte.
    Quelqu'un aurait il la soluce car cela fait quelques jours que je cherche à avoir un handle

    Merci

  2. #2
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    9 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 9 998
    Points : 12 781
    Points
    12 781

    Par défaut

    CreateFile (borland).
    CreateFile c'est Microsotf, la fonction borland c'est FileCreate (encapsulant Win32 ou Linux dès D6)

    L'alignement des données sur le compilateur est en byte.
    L'unité "Windows.h" force un alignement sur 8 de toute façon :

    Code :
    #pragma option push -b -a8 -pc -A- /*P_O_Push*/
    -a8 passe en 8

    Quelle version de BCB ? 3 à 2007 ? ou entre 2009 à XE3... ?
    Quel mapping wchar_t si >= 2009 indiquant CreateFileA ou CreateFileW

    je doublerais les \ ainsi :
    CreateFile("\\\\?\\usb#vid...
    Pour le reste ta chaine semble effectivement correcte

    Tu évoques DevicePath, je suppose que c'est en référence à l'exemple : How to Access a USB Device by Using WinUSB Functions (Windows Drivers) - Create a File Handle for the Device


    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  3. #3
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Merci, effectivement hUsb me retourne un pointeur int.

    char mapTemp[256];
    strcpy(mapTemp,"\\.\usb#vid_05ca&pid_1834#5&349ef221&0&8#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");
    hUsb=FileCreate(mapTemp);



    J'utilise le Borland C++ 5.0.

    Reste à savoir utilise read/write pour dialoguer sur l'usb.
    Tout de meme drole que je ne puisse pas utilise l'api de windows sous Borland.

    DevicePath provient effectivement de la librairie win api (qui elle fonctionne sur Borland).
    Je passerai le source complet lecture /ecriture sur usb lorsqu'il sera fonctionnel.
    Ca devrait etre valable sous Borland 6 et XE

  4. #4
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    J'ai tout de meme difficile à comprendre l'équivalence de "DeviceIoControl" pour lire ou écrire les trames FileWrite ou FileRead en Borland c++.

    DeviceIoControl est parametré par:
    #define IOCTL_USBIO_WRITE_PACKET

  5. #5
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    9 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 9 998
    Points : 12 781
    Points
    12 781

    Par défaut

    Citation Envoyé par Grizou0 Voir le message
    J'utilise le Borland C++ 5.0.
    J'en doute, c'est Borland C++ Builder 5 avec la bibliothèque VCL
    Borland C++ 5.0 existe aussi, il me semble qu'il utilisait la bibliothèque OWL, c'est un autre environnement de développement de Borland

    x2
    Citation Envoyé par Grizou0 Voir le message
    Code :
    1
    2
    3
    char mapTemp[256];
    strcpy(mapTemp,"\\.\usb#vid_05ca&pid_1834#5&349ef221&0&8#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");
     hUsb=FileCreate(mapTemp);
    FileCreate utilise une AnsiString, tu n'as pas besoin de char[] ou de strcpy

    ceci suffit
    Code :
    hUsb = FileCreate("\\\\.\\usb#vid_05ca&pid_1834#5&349ef221&0&8#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");
    Utilise GetLastError\SysErrorMessage après FileCreate\CreateFile

    Citation Envoyé par Grizou0 Voir le message
    Ca devrait etre valable sous Borland 6 et XE
    Sur XE faudrait faire attention à l'unicode
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  6. #6
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Retour sur CreateFile et Borland C++ ( biblio win)
    J'ai enfin réussi 'par chance' à ouvrir un handle.
    Fallait trouver la conversion, sinon rien ne va.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void __fastcall TForm1::ResumeUSBClick(TObject *Sender)
    {
    HANDLE HUSB;
    char Guid[256];
     if(DetectDevice(0xC251,0x1A01,Guid)) //IdDevice, IdVendor
       {
       //  retourne Guid:  "\\\\?\\usb#vid_c251&pid_1a01#0001a0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}\0}\0ÌqÕ\0ÌqÕ\0`\0\0\0\x10\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0 \0\0\0\x13\0\0\0\0\0\0\0\x02\0\0\00\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0@\0\0\0\x13\0\0\0\0\0\0\0\x03\0\0\0P\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0`\0\0\0\x17\0\0\0\x01\0\0\0\x04\0\0\0C251\0\0\0\0\x16\0\0\0\0\0\0\0\x04\0\0\01A01\0\0\0\0\x16\0\0\0\0\0\0\0\x04\0\0\0C251\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
       Memo->Lines->Add("Device trouvé");
       //Convertion Guid:  "\\.xsb#vid_c251&pid_1a01#0001a0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}\0}\0}\0ÌqÕ\0ÌqÕ\0`\0\0\0\x10\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0 \0\0\0\x13\0\0\0\0\0\0\0\x02\0\0\00\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0@\0\0\0\x13\0\0\0\0\0\0\0\x03\0\0\0P\0\0\0\x13\0\0\0\0\0\0\0\x01\0\0\0`\0\0\0\x17\0\0\0\x01\0\0\0\x04\0\0\0C251\0\0\0\0\x16\0\0\0\0\0\0\0\x04\0\0\01A01\0\0\0\0\x16\0\0\0\0\0\0\0\x04\0\0\0C251\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
       strcpy(Guid,"\\.\usb#vid_c251&pid_1a01#0001a0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}");
       HUSB=CreateFile(Guid  , GENERIC_READ |GENERIC_WRITE,
                              0, NULL, OPEN_EXISTING, 0, NULL);
       if(HUSB == INVALID_HANDLE_VALUE)   Memo->Lines->Add("Erreur Creation Handle");
       else
          {
           Memo->Lines->Add("Creation Handle OK");
     
           CloseHandle( HUSB );
          }
       }
     else Memo->Lines->Add("Device non trouvé");
    }
    Le Guid de base est :
    Code :
    for(int R=0;R<256;R++) Guid[R]=detail->DevicePath[R];
    La convertion adéquate se fait par strcpy....problème unicode...

    PS: ShaiLeTrollJe prends bien note de tes remarques, mais j'essaie de faire fonctionner le code en premier.
    Effectivement, c'est du Borland C++ 5.0 builder pour etre précis.
    Il me reste ce fameux DeviceIoControl à faire fonctionner.
    Merci.

  7. #7
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Finalement, le handle n'est pas correcte.
    J'ai laissé tombé après trop de temps de galère.
    Je suis passé sous nrComm et la, tout fonctionne.
    Dommage....

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •