dll et fonction en callBack
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
Tout d'abord, bonjour à tous !

Mon problème. Je suis en stage, et je dois faire un composant d'interface entre une appli et une applet JAVA. Pour cela, je dispose d'une dll "emuapi.dll"

Actuellement, je bloque sur une petite chose. Afin d'intercepter les commandes saisies au clavier par les utilisateurs dans l'applet, je dois exécuter une fonction de la dll, qui en appelle une WinDev en callBack.

Le prototype de la fonction est la suivante (C)

SABREAPICODE beginSabreTrafficListener (const SABREAPICODE trafficType, PSABRE_MESSAGE_HANDLER listener);


Le type SABREAPICODE est en fait un entier (déclaré avec un #typedef)

trafficType est le type de données que l'on veut intercepter (1 pour commande, 2 pour réponse, 3 pour les deux).

Dans PSABRE_MESSAGE_HANDLER listener, je dois faire passer ma fonction callBack, ou du moins, son adresse.

Ma fonction ressemble à ça :
FONCTION PUBLIQUE  sendAndNotifyCallBack(type est un entier, texte est une chaîne)
Info(type, texte)
RENVOYER 0

Son prototype doit en fait correspondre à ça, mais apparemment c'est le cas, étant donné que SABREAPICODE est tout simplement un entier.
typedef SABREAPICODE (__cdecl * PSABRE_MARKUP_HANDLER)( const SABREAPICODE messageType, const char * message);

Mon appel à la finction sendAndNotifyCallBack est le suivant :
ret = AppelDLL32("emuapi.dll", "beginSabreTrafficListener",3 , &sendAndNotifyCallBack, "type", "texte")

La fonction me renvoie 0, qui veut dire que c'est bien passé. Seulement, ça ne marche pas, La fonction callBack ne s'exécute pas quand j'envoie des messages dans l'émulateur. Pourtant la dll fonctionne puisque ça marche très bien avec des exemples fournis avec la dll. Pour exécuter la fonction dans ces exemples, ils utilisent le code suivant (en C)
SABREAPICODE beginListener ()
{
    SABREAPICODE ret = API_ERROR;

    if ( myBeginSabreTrafficListener == NULL )
    {
        ret = getMethod ("beginSabreTrafficListener", (FARPROC *) &myBeginSabreTrafficListener);
        if ( ret != API_SUCCESS )
        {
            printf ("notifyAndSendSample3.beginListener () : getMethod for beginSabreTrafficListener returned %d \n", ret);

            return ret;
        }

    }

    ret = (myBeginSabreTrafficListener) (SABRE_COMMAND_TYPE | SABRE_RESPONSE_TYPE, tempSabreMessageHandler);

    printf ("notifyAndSendSample3.beginListener () : beginSabreTrafficListener returned %d \n", ret);

    return ret;
}


Malheureusement il est impossible d'adapter ce genre de code en WinDev (ils utilisent des fonctions avancées de pointeurs, et il me semble qu'il n'est pas possible d'affecter un pointeur vers une fonction avec WinDev).

J'ai testé les callBack avec une api Windows (EnumWindows, qui renvoie le handle de toutes les fenêtres ouvertes), et là ça fonctionne très bien. Peut-être un problème avec la déclaration de ma fonction?

Aussi, il y a des headers à intégrer normalement (fichier .h en C) contenant la définition de toutes les constantes, la déclarations des types (#typedef) et les prototypes des fonctions. Je ne peux pas les intégrer, mais on peut faire sans, enfin, je pense. Cela pourrait-il venir de ça ?

Merci d'avance pour vos réponses.

Contribution le : 10/01/2006 09:35
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack

Inscrit:
19/11/2002 12:20
Post(s): 390
Deux choses :)
1°) pourrais tu mettre le code de la fonction de ton exemple C++ "myBeginSabreTrafficListener" ?
2°) j'ai constaté que si, dans le compilateur C++, le paramètre pour les fonctions était "__cdecl" ça posait des soucis de temps en temps pour les appels DLL comme (et surtout) pour les callback (j'avais fait une DLL pour les ports série et pour télécharger un fichier entre autres...), il fallait que je les compile en "__stdcall".

Contribution le : 10/01/2006 09:56
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
La fonction myBeginTrafficListener n'a pas de code, en fait. C'est une sorte de buffer, dans lequel il va rapatrier la fonction :

// déclarations
static PSABREAPI_NOTIFYANDSEND_BEGINSABRETRAFFICLISTENER_FUNC myBeginSabreTrafficListener = NULL;

// dans le code
ret = getMethod ("beginSabreTrafficListener", (FARPROC *) &myBeginSabreTrafficListener);

// code de la fonction getMethod :
SABREAPICODE getMethod (const char * methodName, FARPROC * p_proc)
{
    SABREAPICODE retcode = API_ERROR;
    FARPROC proc;
    DWORD errCode;

    printf (">>> samplesCommon.getMethod\n");
    if ( h_dll != NULL && methodName != NULL && p_proc != NULL )
    {
        printf ("samplesCommon.getMethod () : calling GetProcAddress with name %s\n", methodName);

        proc = GetProcAddress (h_dll, methodName);
        printf ("samplesCommon.getMethod () : GetProcAddress with name %s returned %d\n", methodName, proc);

        if ( proc == NULL )
        {
            errCode = GetLastError ();

            printf ("samplesCommon.getMethod () : GetProcAddress with name %s returned error %d\n", methodName, errCode);

            retcode = API_ERROR;
        }
        else
        {
            * p_proc = proc; 

            printf ("samplesCommon.getMethod () : method with name %s = %d\n", methodName, proc);

            retcode = API_SUCCESS;

        }
    }

    return retcode;


Si le problème est celui exposé dans ton 2e point, alors je suis bloqué. Si windev supporte pas le "_cdecl", je ne peux pas avancer vu que je n'ai pas accès au code source de la dll (émise par une grande compagnie de gestion du traffic aérien). J'ai envoyé un mail au support de la dll (tout en anglais technique, c'te galèère ^^), mais ils ne m'ont pas encore répondu (alors que j'ai envoyé le message vendredi).
Enfin, il est bien précisé dans la doc de la dll qu'il faut que le compilo supporte le _cdecl, donc je risque d'avoir des soucis.

Je suis une quiche lorraine en C, donc je ne serai pas capable d'écrire un programme qui me permettrait de tester ^^ (j'arrive a peu près a comprendre ce qui se passe dans un programme en C, mais je serai incapable d'écrire quelque chose d'aussi complexe qu'un appel à un callBack).

Enfin, merci pour ta réponse (qui me permet d'y voir un peu plus clair :))

//EDIT--------------------------------------------------
Voilà ce qui est écrit dans la doc :

API Standards and Calling Conventions -

MySabre API is developed for the Microsoft Windows standard platform. The DLL is developed for the C programming language and other languages that can dynamically load and unload the DLL.
To facilitate development, MySabre API is written in C. Your C compiler must support the __cdecl calling convention.

Contribution le : 10/01/2006 10:20
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack

Inscrit:
19/11/2002 12:20
Post(s): 390
Hummmm en théorie (si c'est bien à cause du __cdecl) il suffirait, de leur côté, d'un coup de compilo et hop (à moins qu'ils n'en aient besoin pour autre chose, mais là aussi, moi et le C++...)...

Peut être faudrait'il envoyer un mini exemple au support PCSoft, ou en tous cas leur demander leur opinion à ce sujet?

Sinon il faudrait écrire une DLL en C++ qui appelle la DLL en question et qui renvoie ce qu'il faut à Windev (donc style l'exemple livré avec la DLL), mais bon...

Contribution le : 10/01/2006 11:19
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
Oki, mais ça m'étonnerait que du coté de la boite qui fournit la dll, ils fassent une release de la dll rien que pour mes beaux yeux ^^

L'applet JAVA avec qui je dois communiquer est utilisée par des milliers d'agences de voyage dans le monde. La dll, elle est moins utilisée, mais c'est quand même le fruit du travail d'une grosse boite. Ce serait un peu comme demander à Microsoft de recompiler une API parce qu'elle ne correspondrait pas exactement à nos attentes :)

Sinon, concernant la possibilité de créer une dll d'interface avec l'interface (:p) en C a été évoquée, mais ni lui, ni moi ne connaissons assez bien le C. Il y aurait bien toujours le possibilité de réutiliser les exemples fournis, mais j'aurais beaucoup de modifications à y appliquer, et vu que je ne connais pas le C et que je n'ai pas d'EDI C (genre visual C++) ça risque d'être difficile. Je suis meilleur avec C#, mais C# et les pointeurs ne font pas bon ménage...

Sinon, j'ai un autre petit soucis. Ca concerne les évènements. La dll émet 3 évènements : MYSABRE_API_READY quand l'applet est bien chargée, MYSABRE_API_RELEASE pour une MAJ de le dll,, MYSABRE_API_RESUME quand l'utilisateur est parti naviguer plus loin puis revenu sous l'applet.

J'ai donc branché 3 gestionnaires d'évènements dans mon composant :
Evénement("miseAJourDll","*.*", "MYSABRE_API_RELEASE")
Evénement("pret","*.*", "MYSABRE_API_READY")
Evénement("pret","*.*", "MYSABRE_API_RESUME")


LE problème est que les fonctions appelées ne se lancent pas lorsque un évènement part. J'ai fait un test, avec un mini projet qui envoie un postMessage à ma fenetre de test de mon composant, et là, ça marche. En fait le truc c'est que la fonction évènement écoute les events envoyés uniquement sur une fenêtre ou un champ du projet. Alors que moi, j'aimerais écouter les évènements hors fenêtre (vu que le composant ne comportera aucune fenêtre au final). Une idée ???

Contribution le : 10/01/2006 11:39
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack

Inscrit:
19/11/2002 12:20
Post(s): 390
Vu le projet, je vous conseille fortement de contacter PC Soft ils pourront peut être déjà vérifier le coup du paramètre __cdecl et peut être faire une modif :)

Pour ce qui est des events, peut être une fenêtre hors écran ou invisible pourrait faire le truc?

Contribution le : 10/01/2006 19:56
Créer un fichier PDF de la contribution Imprimer


Re: dll et fonction en callBack
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
J'ai envoyé les infos concernant le problème à PCSoft. Mais ils n'ont pas encore répondu.

Vu que le temps m'est compté, j'ai décidé d'aller mettre un peu les mains dans le camboui et j'ai plongé dans l'univers mystérieux du C. En m'inspirant du code des exemples fournis avec la dll et divers cours que j'ai trouvé sur le net (developpez.com, pour ceux qui connaissent pas, allez y jeter un coup d'oeil, ça vaut le détour ^^), j'ai réussi à commencer le codage d'une dll. Et Ô miracle, j'arrive à exécuter une fonction windev à distance (en envoyant le pointeur de la fonction à ma dll).

En gros, problème à demi-résolu, mais c'est tout de même dommage de devoir passer par cette dll.

Sinon, concernant les évènements, le soucis, c'est que j'ai testé avec une fenêtre, et même là, il intercepte pas les évènements. D'où une nouvelle utilité de ma dll, qui va intercepter les évènements et exécuter un callBack dans mon composant.

Voilou, merci à vous !! (heuu, si vous avez encore des idées concernants les évènements, faites moi signe !!)

Contribution le : 11/01/2006 11:24
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2