Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'appel de méthode sur un objet instancié dans une DLL

1 réponse
Avatar
mister_mike_
Bonjour

J'ai un petit problème dont je n'arrive pas à trouver la solution.
Le principe est simple:
Mon programme principal travaille avec une classe abstraite dont
l'instanciation est laissée aux soins d'une DLL chargée dynamiquement (cette
dll instancie en fait une sous-classe de ma classe abstraite).

J'ai écrit dans la dll une méthode qui me renvoie un pointeur vers l'objet
instancié et cela a l'air de fonctionner convenablement.
Mon problème est que lorsque j'appelle une méthode de l'objet instancié par
la dll, c'est une autre méthode de l'objet qui est appelée.
Mon programme et ma dll sont tous les deux écrits en Borland C++ Builder 6.

- Code source de ma classe abstraite:
#ifndef AbstractListDecoderH
#define AbstractListDecoderH
class AbstractListDecoder {
public:
AbstractListDecoder (char*);
//quelques méthodes
virtual char* getNextFileUrl () = 0;
virtual char* getInfos () = 0;
};
#endif

- Code source de ma dll :
#include <windows.h>
#include "msdListDecoder.h" //classe qui hérite de ma classe abstraite
typedef LPSTR charPtr;
typedef AbstractListDecoder* DecoderPtr ;
extern "C"__declspec (dllexport) __stdcall DecoderPtr
createDecoder(charPtr);
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
DecoderPtr __stdcall createDecoder (charPtr filePath) {
return new msdListDecoder (filePath);
}

- Code source de l'appelant:
typedef AbstractListDecoder* (__stdcall *MYDLLFUNC)(char*);
HINSTANCE hinstDLL = LoadLibrary("mad_ll.dll");
if (hinstDLL) {
MYDLLFUNC ImpFuncDLL = (MYDLLFUNC)GetProcAddress(hinstDLL,
"createDecoder");
if (ImpFuncDLL) {
AbstractListDecoder *ald = ImpFuncDLL("c:\\essai.msd");
char *s = ald->getNextFileUrl(); /******* ici que ça ne
fonctionne pas, ça appelle la méthode getInfos() *******/
} else {
MessageBox (NULL, "erreur dll", "erreur", MB_OK);
}
FreeLibrary(hinstDLL);
}

Je ne comprends pas ce qui ne fonctionne pas, si quelqu'un avait une piste
je lui serais éternellement reconnaissant :-)
Merci

Michaël

1 réponse

Avatar
Vincent Burel
"Micha?l" wrote in message
news:
Bonjour

- Code source de ma classe abstraite:
#ifndef AbstractListDecoderH
#define AbstractListDecoderH
class AbstractListDecoder {
public:
AbstractListDecoder (char*);
//quelques méthodes
virtual char* getNextFileUrl () = 0;
virtual char* getInfos () = 0;
};
#endif

- Code source de ma dll :
#include <windows.h>
#include "msdListDecoder.h" //classe qui hérite de ma classe abstraite
typedef LPSTR charPtr;
typedef AbstractListDecoder* DecoderPtr ;
extern "C"__declspec (dllexport) __stdcall DecoderPtr
createDecoder(charPtr);
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID


lpvReserved)
{
return 1;
}
DecoderPtr __stdcall createDecoder (charPtr filePath) {
return new msdListDecoder (filePath);
}

- Code source de l'appelant:
typedef AbstractListDecoder* (__stdcall *MYDLLFUNC)(char*);
HINSTANCE hinstDLL = LoadLibrary("mad_ll.dll");
if (hinstDLL) {
MYDLLFUNC ImpFuncDLL = (MYDLLFUNC)GetProcAddress(hinstDLL,
"createDecoder");
if (ImpFuncDLL) {
AbstractListDecoder *ald = ImpFuncDLL("c:essai.msd");
char *s = ald->getNextFileUrl(); /******* ici que ça ne
fonctionne pas, ça appelle la méthode getInfos() *******/
} else {
MessageBox (NULL, "erreur dll", "erreur", MB_OK);
}
FreeLibrary(hinstDLL);
}

Je ne comprends pas ce qui ne fonctionne pas, si quelqu'un avait une piste
je lui serais éternellement reconnaissant :-)



ben vous pourriez essayer d'appeler l'autre fonction pour voir ce qu'il se
passe ... Pour moi tout se passe comme si la table virtuelle de votre classe
n'était pas compilé avec le même ordre des méthode dans la DLL et
l'appelant... Vérifier que votre class est la même dans vos deux programme
DLL et appelant... Faut voir aussi ce que dit la norme C++ à ce sujet...

Vincent Burel