Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
je voulais juste Runner un simple exemple de PowerBuilder qui utilise une fonction externe provenant d'une DLL
en faite j'ai créer un un projet "Dynamic Link Library" avec CodeBloks dans lequel j'ai placé mon fichier "main.cpp" contenant le code C++ est le suivant :
//main.cpp #include <windows.h> extern "C" __declspec(dllexport) __stdcall int add(int a,int b); extern "C" __declspec(dllexport) __stdcall int add(int a,int b) { return a+b; }
ensuite j'ai fais un build ; alors 3 fichiers ont été générés :"mydll.dll" , "libmydll.dll.def" et "libmydll.dll.a"
j'ai mis ces 3 fichiers sous le répertoire contenant mon projet PB.
j'ai créer ensuite un userobject uo_decoder dans lequel j'ai déclaré le Local External Function suivante :
FUNCTION integer somme(integer a,integer b) LIBRARY "mydll.dll" ALIAS FOR "add"
ensuite à partir de ma window PB j'ai tapé ce bout de code qui s'exécute lors du click du bouton "Tester_Dll" :
uo_decoder decoder decoder = create uo_decoder MessageBox("Calcul Somme",string(decoder .somme(10,20)))
mais malheureusement un message d'erreur s'affiche :
Erreur Systeme : Error calling External Function add at line...
SVP Veuillez m'aider à faire marcher cet exemple :ccool:
Merci
Hors ligne
Bonjour, est-ce que ça marche avec :
long ll_result
ll_result = somme(10,20)
Pour info, normalement tu n'as besoin que du fichier DLL.
NB :
Hors ligne
Bonjour,
Merci pour votre réponse !
Malheureusement ça marche pas
Hors ligne
long ll_result
ll_result = add(10,20)
Hors ligne
pick, il a déclaré somme PB <-> add C++
c'est quoi la correspondance int C++ avec PB ? c'est long non ? (quoique je ne pense pas que ça change qqchose)
Hors ligne
j'ai pris en compte le ALIAS FOR "add"
...peut etre que je puis parti sur une mauvaise piste....
Hors ligne
Bonjour,
Je pense simplement que ton programme ne trouve pas la dll. Tu copies la dll dans le répertoire de ton appli qui ne fait pas partie du path système (exécution à partir de Powerbuilder, je suppose).
Pour faire un test, tu devrais copier la dll dans C:\Windows\System32 par exemple.
Hors ligne
Bonjour,
Merci pour vos réponses !!!
Maintenant ça marche
En faite c'était l'alias de ma fonction, donc il faut mettre le "@numéro " dans l'alias.
dans mon cas j'aurais donc :
FUNCTION integer somme(integer a,integer b) LIBRARY "mydll.dll" ALIAS FOR "add@4"
on trouve cet alias au niveau du fichier "libDLLTEST.dll.def" généré automatiquement avec ma DLL.
Dernière modification par dydo01 (06-11-2010 14:43:40)
Hors ligne
Bizarre cette histoire d'allias.
Quoi qu'il en soit, Erasorz a raison. Int en pb est sur 2 octets.
Donc Int en C <=> Long en PB
FUNCTION long somme(long a,long b) LIBRARY "mydll.dll" ALIAS FOR "add@4"
CodeBloks est un IDE, pas un compilateur. Quel compilateur est associé ?
Logiquement, il devrait exporter en "add@8"
http://www.sybase.com/detail?id=44623
Hors ligne
Bonjour,
Normalement, en utilisant la déclaration __declspec(dllexport) permet de s'affranchir de l'utilisation du fichier .def pour trouver la déclaration du prototype de la fonction (http://msdn.microsoft.com/fr-fr/library … 80%29.aspx).
Je pense que ce comportement est due à la copie du fichier .def avec la dll alors que seul la dll est nécessaire, la déclaration du prototype de la fonction est alors recherchée par défaut dans le fichier .def.
Hors ligne