Comment transformer un projet C++ .exe en .DLL pour exporter des fonct - C++ - Programmation
Marsh Posté le 11-02-2014 à 13:18:30
Il est techniquement possible de faire une DLL du code que tu postes, mais tu ne pourras probablement pas l'utiliser avec Windev sans modifications profondes, en particulier la gestion du thread de polling. Ta seule chance est d'écrire toi même le code pour parler SSP ou ccTalk, ce qui n'est pas complexe mais très compliqué si tu ne l'as jamais fait ...
Mon avis personnel: Contrôler un validateur I... T... avec Windev c'est du suicide
Marsh Posté le 11-02-2014 à 15:58:11
Mouais, va falloir pas mal de modification au code. Pas dramatique lorsqu'on s'y connait, mais si tu débutes en C/C++, va être un peu hardcore pour toi.
De ce que j'ai compris du programme, il utilise une API C++ (CSMARTPayout.h) pour communiquer avec un appareil. Le programme en question démarre un thread qui intéroge le bidule à intervalle régulier. Le thread principal attends les commandes depuis le clavier qui affiche les infos récupérées par le thread.
Pour communiquer avec un autre langage, il te faudra une ABI C. Une ABI C++ est un cauchemar à interfacer dans n'importe quel langage autre que le C++, pas juste Windev. Pour faire cela, il faut utiliser la déclaration :
Code :
|
Et comme tu utilises visual studio, faudra rajouter les déclarations :
Code :
|
Par exemple :
Code :
|
Les "declspec" sont nécessaires parce par défaut VisualC++ n'exporte aucun symbole des DLLs pour éviter de faire exploser les temps de compilation. Les 'extern "C"" sont pour forcer VisualC++ à utiliser une ABI C. Tu pourra récupérer l'adresse de la fonction via GetProcAddress(dll, "init_device" ).
Toute la récupération des infos via la saisie clavier dans le programme est bonne pour la poubelle, faudra découper ça en fonction C: chaque branche du "switch" = une fonction.
Reste à voir si démarer un thread ne foutra pas la merde avec Windev. À priori non, mais tu auras intérêt à faire quelques tests de stabilité...
C'est assez brut de fonderie mes explications, mais ne connaissant pas trop ton niveau, on va déjà voir si tu peux te démerder avec ça.
Marsh Posté le 11-02-2014 à 17:41:34
FCKGW a écrit : |
Fixed!
A+,
Marsh Posté le 11-02-2014 à 19:10:56
Merci pour votre réponse les gars, j'ai réussi finalement à modifier ce code, comme m'a expliqué tpierron. Bien entendu je ne dois pas faire intervenir la saisie du clavier. Le DLL que j'ai fais il a qu'une seule fonction, c'est la fonction qui démarre le thread et qui donne les paramètres de la structure SSP_COMMAND à l'appareil pour démarrer la communication. Jusqu'à là tout roule comme je veux. Mais quand j'ai voulu rajouter la fonction (par exemple: EnableValidator() mon programme Windev qui utilise cette DLL plante. je vous montre mon code dans une réponse complète.
Marsh Posté le 11-02-2014 à 21:02:28
Voilà, donc en suivant l'explication de tpierron, la dll fonctionne parfaitement avec Windev voici la partie .h :
Code :
|
Pour le .cpp voici le code:
Code :
|
La première fonction ( ConfigSmart::Configuration(void) )appelée par Windev fonctionne très bien mais quand j'appelle la deuxième fonction ( ConfigSmart::Connexion() ) qui n'est que la l'appel de la Payout->EnableValidator(); la dll plante, j'ai même éliminé Payout->EnableValidator(); de la première fonction et d'appeler la deuxième fonction le résultat est le même c a d la DLL plante????????
est ce que quel qu'un pourrait m'éclaircir la dessus svp?
Marsh Posté le 11-02-2014 à 21:43:08
Hmm, tu as déclaré ta variable "Payout" locale à ta fonction :
Code :
|
Quand bien même tu utilises "new", la référence à cet objet sera perdu au retour de la fonction.
Bref 2 solutions :
Marsh Posté le 11-02-2014 à 23:59:51
Tout à fait tpierron merci, finalement il suffit de déclarer Payout en global pour toute les fonctions de namespace MISmart:
Code :
|
Merci beaucoup tpierron pour ton aide précieuse
Marsh Posté le 08-02-2014 à 21:25:09
Bonjour,
Voilà je suis devant un problème qui m'empêche d'avancer, je vais aller step par step pour l'exposer correctement dans l’espérance de trouver de l'aide.
J'ai reçu le code source d'un programme exemple codé en C++ qui permet la communication avec un appareil, ce programme utilise des fonctions présentes dans une librairie .dll mais je n'ai pas la documentation de cette API pour pouvoir l'utiliser.
Mon but c'est de communiquer avec cette appareil en utilisant un programme qui sera fait avec Windev (Je sais utiliser WLangage de Windev si j'ai une librairie .dll à condition que cette librairie soit composée de fonctions simples e.g MaFonction(Param1,Parm2,...) et les paramètres sont de types usuels.).
Or les fonctions de l'API .dll utilisées dans l'exemple que j'ai pu le compiler et l'exécuter sous forme de .exe terminal ( code source que j'ai réussi à le compiler sous Visual Studio 10) utilise, hélas, des paramètres sous forme de structures dont WLangage ne peut pas les reproduire.
Quand j’exécute l'exemple que j'ai eu , j'arrive aisément à communiquer avec cet appareil et en plus, les fonctions présentes dans ce code ont une forme simple que si je les exporte dans une .dll je pourrais les utiliser dans mon programme Windev avec WLangage.
Ma question est la suivante: Comment je pourrait exporter les fonctions appelées dans le "main" de ce programme C++ le transformé et le compiler sous forme de .dll?
voici le main de ce programme: