[C++] Besoin d'aide pour créer une dll.
Bonjour,
Je cherche à créer une dll C++, pour exploiter ses fonctions avec Windev.
Voici comment je l'ai structurée :
un fichier dllmain.cpp :
Code:
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 36 37 38 39 40 41 42 43 44 45 46
| #include <windows.h>
#include <cstring>
#include <fstream>
#include <stdio.h>
#include <time.h>
#include "dll.h"
using namespace std;
extern "C" __declspec(dllexport) void Initial();
extern "C" __declspec(dllexport) void CleanUp();
extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol );
extern "C" __declspec(dllexport) void SetServerAddress( char * sURL );
extern "C" __declspec(dllexport) void SetUser( char * sUser );
extern "C" __declspec(dllexport) void SetPassword( char * sPassword );
extern "C" __declspec(dllexport) void UploadFile( char * sFilePath );
extern "C" __declspec(dllexport) void SetFullURLConnect( char * sFullURL );
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
} |
un fichier dll.h :
Code:
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 36 37 38 39 40 41 42
| #define _DLL_H_
#include <curl/curl.h>
#include <curl/easy.h>
#include <string.h>
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
class DLLIMPORT DllClass
{
private:
long Get_Size( char * );
char* _sProtocol;
char* _sURL;
char* _sUser;
char* _sPassword;
char* _sFullURL;
CURL *curl;
public:
DllClass();
virtual ~DllClass(void);
void Initial();
void CleanUp();
void SetProtocol( char * );
void SetServerAddress( char * );
void SetUser( char * );
void SetPassword( char * );
char* UploadFile( char * );
void SetFullURLConnect( char * sFullURL );
void EcritLog( char* , char*, DllClass *);
};
#endif /* _DLL_H_ */ |
et un fichier dll.cpp
Code:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include "dll.h"
// Constructeur
DllClass::DllClass()
{
(...)
}
// Destructeur
DllClass::~DllClass ()
{
(...)
}
void DllClass::Initial()
{
(...)
}
void DllClass::CleanUp()
{
(...)
}
long DllClass::Get_Size( char * path )
{
(...)
}
void DllClass::EcritLog( char * aTexte, char * aMode, DllClass *Pointeur )
{
(...)
}
void DllClass::SetProtocol( char * sProtocol )
{
(...)
}
void DllClass::SetServerAddress( char * sServerAddress )
{
(...)
}
void DllClass::SetUser( char * sUser )
{
(...)
}
void DllClass::SetPassword( char * sPassword )
{
(...)
}
void DllClass::SetFullURLConnect( char * sFullURL )
{
(...)
}
// Returns an error code
char * DllClass::UploadFile( char * sFilePath )
{
(...)
} |
Le problème c'est que mon programme Windev me renvoie que la fonction n'existe pas lorsque j'exécute :
Code:
1 2 3
| iHandle est un entier long
iHandle = ChargeDLL(fRepExe()+"\test_dll.dll")
AppelDLL32(fRepExe() + "\test_dll.dll", "Initial" ) |
Comment faire le lien entre les fonctions de la dll et ma classe DllClass ?
Merci d'avance de votre aide ;)
______________________________________________________
Si je modifie mon programme de la sorte :
dllmain.cpp :
Code:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| /* Replace "dll.h" with the name of your header */
#include <windows.h>
#include <cstring>
#include <fstream>
#include <stdio.h>
#include <time.h>
#include "dll.h"
using namespace std;
extern "C" __declspec(dllexport) void Initial();
extern "C" __declspec(dllexport) void CleanUp();
extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol );
extern "C" __declspec(dllexport) void SetServerAddress( char * sURL );
extern "C" __declspec(dllexport) void SetUser( char * sUser );
extern "C" __declspec(dllexport) void SetPassword( char * sPassword );
extern "C" __declspec(dllexport) void UploadFile( char * sFilePath );
extern "C" __declspec(dllexport) void SetFullURLConnect( char * sFullURL );
DllClass *cldll = NULL;
extern "C" __declspec(dllexport) void Initial()
{
cldll = new DllClass();
time_t rawtime;
struct tm * timeinfo;
cldll->EcritLog( "\n_________________________\n", "%s" , NULL );
time ( &rawtime );
timeinfo = localtime ( &rawtime );
cldll->EcritLog( asctime (timeinfo), "%s" , NULL );
cldll->EcritLog( "Init()\n", "%s" , NULL );
cldll->EcritLog( "Init() - Pointeur : ", "%s" , NULL );
cldll->EcritLog( "", "%x\n", cldll );
cldll->Initial();
}
extern "C" __declspec(dllexport) void CleanUp()
{
cldll->CleanUp();
}
extern "C" __declspec(dllexport) void SetProtocol( char * sProtocol )
{
cldll->SetProtocol( sProtocol );
}
extern "C" __declspec(dllexport) void SetServerAddress( char * sURL )
{
cldll->SetServerAddress(sURL);
}
extern "C" __declspec(dllexport) void SetUser( char * sUser )
{
cldll->SetUser( sUser );
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
} |
Les fonctions de la dll existent pour Windev (pas d'erreur de ce côté), mais si j'affiche les propriétés de mon objet elle ont toutes la même valeur alors que je les ai défini avec des valeurs différentes... :(
Il garde pour toutes les propriétés la dernière valeur que j'ai passé.