Bonjour,
J'ai besoin d'aide... Voici un résumé de mon soucis
- Je crée un programme Perl/Tk. Jusque là, je m'en sors. Cependant, pour certaines fonctions, j'ai décidé de passer par un fichier DLL appelé depuis Perl. Et c'est là que les ennuis commencent.
- Je télécharge donc Code::Blocks que je sais être un bon éditeur C/C++, et je démarre un nouveau projet de DLL.
- Afin de tester, je crée une fonction toute bête qui multiplie par 3 le nombre passé en paramètres et retourne le résultat et une autre qui retourne une simple chaine de caractères.
- Je compile ma DLL avec Code::Blocks et le compilateur Gcc (j'ai mingw 64 bits d'installé).
- Et là où ca déconne, c'est quand je tente d'utiliser ma DLL, l'appel à la fonction Win32::Api->new() de Perl retourne undef et Windows me retourne ce message d'erreur :
- Alors je creuse un peu, et je vois sur des forums qu'on recommande le logiciel Dependency Walker pour identifier les erreurs d'une DLL. J'installe donc ce logiciel, et analyse ma DLL avec
- La seule erreur que remonte DW, c'est "Error: Modules with different CPU types were found."
Voici maintenant les sources que j'utilise :
1 2 3 4 5 6 7 8 9
| #!C:/Strawberry/bin/perl.exe
use warnings;
use strict;
use Win32::API;
my $function = new Win32::API(
"genPasswd.dll", "test", "I", "I"
);
print $function->Call(4); |
et l'erreur retournée par mon programme Perl :
Can't call method "Call" on an undefined value at GestionnairePasswd.pl line 15.
Et maintenant voici les sources de ma DLL. main.h :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #ifndef __MAIN_H__
#define __MAIN_H__
#include <windows.h>
#include <string>
using namespace std;
/* To use this exported function of dll, include this header
* in your project.
*/
#ifdef BUILD_*DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
DLL_EXPORT string __stdcall getId();
DLL_EXPORT int test(int t);
#ifdef __cplusplus
}
#endif
#endif // __MAIN_H__ |
et main.cpp :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include "main.h"
// a sample exported function
DLL_EXPORT string __stdcall getId()
{
return "Test";
}
DLL_EXPORT int test(int t) {
return t * 2;
}
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;
case DLL_PROCESS_DETACH:
// detach from process
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
} |
Compilateur sélectionné dans Code::Blocks : GNU GCC Compiler
Options du linker (j'ai trouvé ces lignes sur internet pour résoudre une précédente erreur) :
1 2
| -static-libgcc
-static-libstdc++ |
Je remercie par avance toutes les personnes qui pourront m'aider 
EDIT :
Voici le log de compilation (sans erreur) de ma DLL
1 2 3 4 5 6 7
| -------------- Build: Release in genPasswd (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -O2 -Wall -DBUILD_DLL -c D:\Users\Sphinx\Documents\CodeBlocksProjects\genPasswd\main.cpp -o obj\Release\main.o
mingw32-g++.exe -shared -Wl,--output-def=bin\Release\libgenPasswd.def -Wl,--out-implib=bin\Release\libgenPasswd.a -Wl,--dll obj\Release\main.o -o bin\Release\genPasswd.dll -s -static-libgcc -static-libstdc++ -luser32
Output file is bin\Release\genPasswd.dll with size 9.50 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) |
Partager