API CreateFile

Résolu
Baguauda Messages postés 219 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 28 novembre 2008 - 4 sept. 2007 à 17:57
Baguauda Messages postés 219 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 28 novembre 2008 - 6 sept. 2007 à 11:47
Bonjour,

J'utilise le code (allégé) suivant

constUInt32 OPEN_EXISTING = 3;
const UInt32 GENERIC_READ = 0x80000000;
constUInt32 GENERIC_WRITE = 0x40000000;
const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000;

[DllImport("coredll.dll",CharSet=CharSet.Auto, SetLastError=true)]
private static externIntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode,
            IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes,
            IntPtr hTemplateFile);

 publicIntPtr CreateFile(String FileName)
        {
            return  CreateFile(FileName, GENERIC_WRITE | GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);
        }

[DllImport("coredll.dll")]
private static externbool CloseHandle(IntPtr handle);

public void Kill(IntPtr hdl)
        {
            CloseHandle(hdl);
        }

avec dans ma form
string portName = "COM6:";
IntPtr hdl;

public void Open_click(object sender, EventArgs e)
{
    hdl = CreateFile(portName);
}


public void Close_click(object sender, EventArgs e)

{

    Kill(hdl);

}

Cela fonctionne bien.

Maintenant imaginons que je lance une première instance de mon application.
Je fait un Open()
Je lance une second fois mon application.
Je fais un Open() qui me retourne -1, ce qui est normal.

En fait l'idée serait de pouvoir récupérer le handle de l'ojbet qui utilise mon port, pour pouvoir le passer dans le close et donc réutilisé mon Port.
Comme je sais pas habitude que je ne suis pas très clair.

Une application A que je ne contrôle pas, ce lance fait un CretaFile sur le COM6 disons de le handle soit x.

Je lande mon application et j'ai besoin du port COM6 - Si je fais un CreatFile je récupère -1.
Donc voici enfin la question : est ce qu'il y a un param pour le CreateFile ou une autre méthode qui me permettrais de recupérer le variable x ?

Merci
Baguauda

4 réponses

Baguauda Messages postés 219 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 28 novembre 2008 1
6 sept. 2007 à 11:47
3
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
5 sept. 2007 à 09:09
Excuse moi, je voudrais bien t'aider mais j'aimerai savoir quelle est le but de la manoeuvre de ton code ? car j'voue que je comprend pas tout.
0
Baguauda Messages postés 219 Date d'inscription mercredi 31 août 2005 Statut Membre Dernière intervention 28 novembre 2008 1
5 sept. 2007 à 11:07
En fait c'est pour un développement sur PDA.

Mon client souhaite(exige) que le lecteur du code à barres soit piloté par une application fournie avec le PDA.
Le lecteur de code barres utilise un port qui ne peux être changer (COM6)
Ce client a également fait le choix d'un modem RTC qui utilise le même port.
Donc je me retrouve face a un gros problème car lorsque je lance ma demande de connexion, il me dit que le port est utilisé.

Il faut donc que je stop depuis mon application le logiciel qui pilote le lecteur de code à barres.
Je ne connais malheureusent qu'un méthode pour stopper ce logiciel.
les methodes TerminateProcess suivit du CloseHandle de coreDll.
Mais cette technique ne libère pas le port.

la manoeuvre de mon code ?
Je suppose que le logiciel qui pilote le code à barres utilise le CreateFile pour utilisé le port et le CloseHandle lors de sa fermeture. Mais lorsque je kill le process le CloseHandle n'est pas éxécuté.
Comme le CreateFile retourne un Handle. Je me demandais si il n'y avait pas moyen de le récupéré, pour faire un CloseHandle par la suite et donc pouvoir lancé ma connexion RTC.
Si il n'y pas de possibilité de retourvé l'info, je suis prenneur de n'importe quelle solution que ce soit une technique pour stopper l'application en lui précisant de libérer le port, ou bien un moyen de "réinitialiser" le port.

Merci

 
0
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
5 sept. 2007 à 13:15
effectivement, désolé je ne pourrais pas trop t'aider sur ce coup là.
Il n'y a pas un support Web pour le lecteur de code bare ou le modem RTC ? Peut être qu'il aurait une solution ou même encore mieux : une API ? ^^
Je te dis vraiment ça au pif et au cas où.

bon courage

RodCobalt22, vous salue bien ;-)
0
Rejoignez-nous