IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Intégration d'une API dans un programme C#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut Intégration d'une API dans un programme C#
    Je cherche à intégrer une dll dans un programme écrit en c#. J'essaie de convertir un programme en C déjà existant et qui fonctionne en du c#. Plusieurs fonctions de l'API fonctionnent mais la fonction ScanAndRecognize() ne fonctionne pas. Cette fonction est appelée mais je ne récupère pas les données.


    programme en C (qui fonctionne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //////// In a File.h:
     
    MOCRAPI_USAGE bool ScanAndRecognize(char *cData, int nDataSz); 
     
     
     
    //////// In a File .c:
     
    char cMrzData[1000];
    memset(cMrzData, NULL, sizeof(cMrzData)); 
     
    if (ScanAndRecognize(cMrzData, sizeof(cMrzData) - 1) == false)
    PrintError();
    else
    {
    // Print the result
    cout << "Received recognition output:" << endl << endl;
    for (int i = 0 ; cMrzData != 0 ; i++)
    if (cMrzData != '\r')
    cout << cMrzData;
    else
    cout << endl;
    }


    Programme que j'essaie de faire en c#:

    1) J'ai essayé avec un pointeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
     
    public unsafe static extern bool ScanAndRecognize(char *cData, int nDataSz);


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsafe
     
    {
     
    char[] mrz_data = new char[100];
     
    fixed (char* mrz = mrz_data)
     
     
    bool1 = ScanAndRecognize(mrz, 99);
     
    }
    2) J'ai essayé avec un type IntPtr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public IntPtr cData;
    [DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
    public unsafe static extern bool ScanAndRecognize(ref IntPtr cData, int nDataSz); 
     
    // Call:
     
    bool1 = ScanAndRecognize(ref cData, 1000);
    textBox1.Text = Marshal.PtrToStringAnsi(cData);


    Dans les 2 cas, j'ai un message d'erreur lorsque la dll me retourne les données. Je pense que le problème vient du type (pointeur) que je n'interprète pas comme il faut. Message d'erreur :

    An unhandled exception of type 'System.AccessViolationException' occurred in Essai_api_desko.exe. Additional information: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Par défaut
    Salut,

    J'ai deja eu un message d'erreurs similaire au tien, mais cela venait du fait que j'avais défini un mauvais EntryPoint dans mon DllImport.
    Ici, tu n'en utilises pas. Peut-être que ça changerait quelque-chose ?

    Sinon, essaie d'utiliser un string ou un StringBuilder au lieu d'un char * ou IntPtr !

    HED

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut
    bonjour,
    je ne suis pas expert, et je commence avec c# surtout avec les pointeurs
    mais d apres les imports que j ai fait
    j essayerai plutot ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char[] mrz_data = new char[100];
     
    [DllImport("mOcrApi_dbg.dll", CharSet=CharSet.Auto)]
    public unsafe static extern bool ScanAndRecognize(IntPtr cData, int DataSz); 
     
    unsafe
    { 
    // Call:
    // recuperer le pointeur de ton tableau de caractere
    fixed (char* mrz = mrz_data)
    bool1 = ScanAndRecognize(mrz, 100);
    textBox1.Text = Marshal.PtrToStringAnsi(mrz);
    }
    voila c est un melange des 2 solutions que tu as essayer
    quand tu declare ton import avec la fonction tu lui indique ce que tu attend et tu ne lui passe pas directement le pointeur.
    ensuite avant l appel il faut un pointeur sur un tableau de caractere
    c est la ou je suis moins dans le code (char* mrz= mrz_data)
    bon courage

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut
    re
    je viens de m apercevoir que dans ton premier code tu avais ecris
    (char *cdata, ...) au lieu de (char* cdata, ...)
    c est peut etre juste une erreur lors de la frappe du message mais verifie
    car ce code avais l air logique

    et tiens nous au courant
    merci

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Regarde ce lien, cela devrait t'aider: http://morpheus.developpez.com/dlldotnet/

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Merci pour vos réponses.
    Marinz, ta première suggestion ne compile pas : "cannot convert from 'char*' to 'System.IntPtr'"
    Pour ce qui est de ta deuxième suggestion, effectivement la petite étoile * n'est pas où il faut. Une fois remise à sa place, j'ai toujours le même problème, comme si le compilateur ne faisait pas la différence entre les 2 positions de *.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Merci pour vos réponses.

    J'ai trouvé mon erreur. Il fallait envoyer une commande Initialize() inclue dans l'API de mon composant avant de lui envoyer une demande de scan, comme pour le préparer à envoyer des données. Ce forum m'a cependant aidé pour ce qui est de la conversion du char 1 octet en char 2 octet : je passe par un type byte puis je fais un cast vers du char.

    Merci à tous pour votre participation!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mettre une pause dans un programme
    Par PNL dans le forum Général Java
    Réponses: 12
    Dernier message: 28/01/2016, 00h54
  2. Faire une pause dans le programme
    Par shinobi dans le forum Access
    Réponses: 6
    Dernier message: 13/06/2005, 16h37
  3. Integrer une musique dans mon programme
    Par Tutux84 dans le forum C
    Réponses: 2
    Dernier message: 29/01/2005, 12h41
  4. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo