Utilisation d'une DLL pour intégration à 4D - C++ - Programmation
Marsh Posté le 11-05-2012 à 11:07:44
Tu as une certaine expérience des DLL windows?
Parce qu'en fait, tu vas créer une DLL windows (chargée et utilisée par 4D suivant l'interface décrite dans la 4D Plugin API) et tu vas devoir faire en sorte d'appeler la dll de ta badgeuse depuis ta dll plugin 4D.
Bref tu vas avoir une circulation du code comme suit (pour un envoi de données/commandes à la badgeuse):
4D --> ton plug-in 4D --> la DLL badgeuse (--> le hardware badgeuse)
Bon, je sais pas trop ce que ton wizard génère, très probablement le squelette d'une dll (le 'plug-in' 4D), mais ensuite il va falloir que tu ajoutes le code de traitement spécifique à tes besoins, et pu passeras par un LoadLibrary(...)/FreeLibrary(...) pour charger/libérer ta dll badgeuse.
Tiens par exemple ici: http://4d.1045681.n5.nabble.com/Pl [...] 13446.html
J'ai trouvé du code montrant comment charger depuis le plug-in une dll située dans le même répertoire que le plug-in
*************************************
__declspec(dllexport) BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved );
char gPluginPath[_MAX_PATH] = ""; //Full path to the plugin Windows folder
BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved ) {
if ( fdwReason == DLL_PROCESS_ATTACH ) {
char *pos = NULL;
GetModuleFileName( hinstDLL, gPluginPath, sizeof( gPluginPath ) );
pos = strrchr( gPluginPath, '\\' );
gPluginPath[ pos-gPluginPath+1 ] = '\0';
}
return TRUE;
}
BOOL LoadDLL ( char* dllName, HINSTANCE* library ) {
char fullPath[_MAX_PATH];
fullPath[0] = 0;
(void *)strcpy( fullPath, gPluginPath );
(void *)strcat( fullPath, dllName );
(void *)strcat( fullPath, ".dll" );
*library = LoadLibraryEx( fullPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
if ( *library == NULL ) {
LPTSTR errorText;
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
(DWORD)GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText,
0, NULL );
PA_Alert( (char *)errorText );
LocalFree( errorText );
}
return ( *library != NULL );
}
et plus loin dans son code appel à la DLL externe nommée ici mydll.dll
HINSTANCE myLibrary;
if ( LoadDLL( "mydll", &myLibrary ) == TRUE ) {
// Do some stuff here
}
*************************************
On est dans le plug-in dont le squelette a été généré par le wizard (le DllMain est probablement généré, vide, par le wizard), comme on le voit avec l'appel PA_Alert(...) qui si j'en crois la doc ( http://4d.developpez.com/documenta [...] U84725.HTM ) va afficher une boite de dialogue windows, et on fait appel à des fonctions de l'API Windows comme LoadLibraryEx, GetModuleFileName, etc (et plus loin dans le code, à des fonctions de la dll badgeuse, une fois celle ci chargée en mémoire, en passant par GetProcAddress).
Si tu n'as aucune notion relative à l'API Windows, il va falloir que tu en acquières un minimum (avec un vieux Petzold ou c'est en C par exemple, ou sur le Web) avant de te lancer la dedans.
A+,
Marsh Posté le 11-05-2012 à 11:19:32
Toujours aussi efficace gilou
En fait, je ne comprends pas pourquoi je me retrouve chargé de ce projet (urgent qui plus est et mal documenté à la base... bref j'ai reçu un cadeau empoisonné). J'ai expliqué à mon boss que je ne serai sûrement pas capable de le faire dans les temps. Ma foi, au moins il est prévenu. Développer ne s'apprend pas en 1 mois (et même un mois, je ne l'ai pas visiblement).
Je vais essayer de faire sous traiter par qqn qui s'y connaîtra + car notre client va s'impatienter. Par contre je vais bosser ca de mon côté : pour ma gueule. Ca a l'air intéressant et je compte bien apprendre. Je veux mourir le moins idiot possible. Donc va falloir que je commence par la VRAIE base du développement plutôt que de m'atteler à tenter de piger 4D direct d'emblée. Dur de jouer sur les 2 tableaux ^^
Merci pour ces pistes. le forum de 4D ne m'a pas éclairci au 10ème de ce que tu as fait.
Ah, j'ai également un fichier .tlb dans lequel sont stockées toutes les commandes. Il n'est pas importable directement dans 4D évidemment. Le TLB permet d'accéder aux commandes (genre NetE_relay) et la DLL permet de traduire ca en langage "badgeuse" ? C'est ca ?
Marsh Posté le 11-05-2012 à 13:53:40
Sans Doc, je ne peux pas te dire.
L'architecture est assez standard:
Tu as une appli (ici 4D).
Elle charge (au départ, ou à la volée) un ensemble de DLLs (les plug-ins) [il y a probablement un fichier de config qui lui dit quoi charger, ou alors les plug-ins doivent être dans un répertoire spécial...] qui obéissent à des règles de communication précises pour communiquer avec l'appli de base (a la base, c'est: une commande activée par un menu, trigger, ... de l'appli va être envoyée au plug-in qui va exécuter du code pour traiter la commande, mais ce modèle de base peut s'étoffer et devenir complexe).
Donc un plug-in sert à étendre ce que fait l'appli de base, sans avoir à la recompiler pour chaque nouvelle extension.
Quand on veut s'interfacer avec un device ou une autre appli, qui fournit sa propre DLL pour ce faire, on "encapsule" la DLL ainsi fournie dans un plug-in afin de
1) recevoir les commandes venant de l'appli
2) traduire ca en une suite d'actions a effectuer par la DLL
3) effectuer ces actions
A+,
Marsh Posté le 14-05-2012 à 09:12:49
Ouip, pour le principe du fonctionnement du plugin, d'une DLL, j'ai pigé. Je n'ai simplement pas la base qui me permettrait de mettre des lignes de code sur un projet tel que celui là. Mon patron est pressé d'avoir le résultat... Je ne suis pas magicien. J'aime apprendre et je trouve que la démerde aide à avancer puisqu'on est obligé de se sortir les doigts, mais quand on est en temps limité, faut parfois s'avouer "vaincu" et passer la main.
Ca fait quand même un petit bout de temps que je fais des recherches sur ce bidule... Et ca me parait trop simple pour y passer autant de temps (sans pour autant que je sois à la hauteur ^^).
Merci en tout cas pour les tuyaux, je vais regarder ca de mon côté de toute facon. Les références de bouquins que tu donnes me serviront sans doute prochainement...
Marsh Posté le 14-05-2012 à 13:52:09
J'ai trouvé DLL Wizard, un générateur de plugin qui date un peu et qui a été supprimé donc.
Il fonctionne visiblement puisqu'il me donne un plugin faisant référence à une DLL (choisie au moment de la création). En gros, je fais "nouveau plugin", je le nomme, je crée une nouvelle commande, là il me demande quelle DLL je veux utiliser (il faut la placer à la racine du dossier où est l'exécutable de 4D), et il est censé donner la liste des commandes contenues dans la DLL. Sauf que là, j'ai un truc étrange : une seule commande " FwSB2: ". Avec les espaces à ces endroits. Si j'essaie de charger une autre DLL, au pif dans windows, il m'affiche bien la liste des commandes dispos, j'ai pu voir des commandes de manipulation de fichiers zip par exemple...
Cette commande, " FwSB2: ", ne correspond à rien. J'ai exploré un peu l'intérieur de la DLL avec Visual Studio, les commandes sont bien dans la DLL, en assembleur. On peut voir la traduction à côté, bref, elles y sont. Quand on regarde le tlb dont je parlais plus haut, c'est encore différent, là on a carrément une librairie des commandes (elles apparaissent en liste avec 1 class SB2, puis sous class SB2Actions et SB2ActionsStr). De ce que j'ai compris du manuel, il faut que j'utilise les commandes de cette façon : SB2.SB2ActionsStr.NetE_IdentificationRequest (arg1;arg2) si je veux avoir une réponse en string (sinon c'est un entier 64 bits).
Il ne me reste plus qu'un tout petit bout de truc à débloquer, je touche au but argh !
Si dans le DLL wizard je choisis (manuellement, en tapant la commande, sans me fier à la liste indiquée) "SB2.SB2ActionsStr.NetE_IdentificationRequest", que je lui mets les bons arguments au bon format, ainsi que le bon format de retour (string), il m'indique une fois le plugin chargé dans 4D que la méthode que j'ai créée n'existe pas. Je sais qu'il a bien chargé la librairie dans 4D (avant ca, la DLL n'était pas dans le bon dossier et il la réclamait), j'ai mis le bon format à la commande, indiqué la bonne DLL, le plugin se charge dans 4D mais malgré ca, la commande reste inutilisable.
Quelque chose me dit qu'il y a un petit détail que j'ai oublié
Marsh Posté le 11-05-2012 à 09:09:55
Bonjour !
Comme je l'ai déjà expliqué, je suis un peu tout nouveau dans le monde de la programmation, donc je risque de poser des questions stupides, veuillez m'en excuser. Je suis embauché depuis peu dans une entreprise qui me demande des choses pas forcément à ma portée (le cas échéant, je ferai autrement plutôt que d'y passer des mois...), mais j'essaie d'apprendre sur le tas en fonction de ce qu'on me demande, ce qui n'est pas forcément simple.
Enfin, voilà ma problématique :
Nous développons un programme de gestion d'entreprise en 4D. Ce logiciel fonctionne plutôt bien, et ma boite essaye de répondre au maximum aux demandes des clients. Là, je dois développer un moyen de communiquer avec des badgeuses reliées en ethernet avec le serveur du logiciel de gestion. Le but c'est de récupérer les pointages automatiquement et de traiter les données ensuite.
Les badgeuses sont assez simples à configurer (ca c'est fait, et c'était pas un problème), les fournisseurs des badgeuses nous ont fourni une DLL ainsi qu'une librairie où sont stockées les commandes que l'on peut envoyer aux machines depuis l'ordinateur. Mon but est de permettre à 4D d'utiliser ces commandes pour créer une interface dans notre soft pour commander les badgeuses.
J'en suis à ce point :
J'ai la badgeuse configurée correctement (visible sur le réseau, interrogeable via le logiciel propriétaire du fabricant des badgeuses)
J'ai la DLL ainsi que la librairie ouvertes dans Visual Studio, donc je vois clairement les commandes correspondant au descriptif papier fourni par le fabricant.
Je sais qu'il est possible de développer des plugins pour 4D en C++ (d'où la catégorie de ce post) mais je n'ai aucune indication supplémentaire à ce sujet. C'est à dire que je ne sais pas du tout à quoi doit ressembler un plugin, et je ne suis pas sûr que ce soit LA solution pour intégrer la DLL à 4D.
En gros, est-ce qu'à tout hasard vous savez comment je peux utiliser une DLL externe dans 4D, et sinon avez vous une piste vers laquelle je puisse me tourner ? 4D parlait de DLL Wizard à l'époque de la version 2004, mais remplacé maintenant par plugin Wizard, je l'ai, c'est en fait une sorte de conformateur dans lequel il faut rentrer une page de code en C ou C++, le wizard se débrouille pour générer les ressources... ca simplifie sans doute le travail, mais ca ne me dit pas par où ni comment commencer.
Merci
---------------
Elle n'était pas vraiment pour. Je ne lui demandais pas vraiment son avis.