[C++] Classes, méthodes et DLLs

Classes, méthodes et DLLs [C++] - C++ - Programmation

Marsh Posté le 03-11-2005 à 11:35:47    

J'ai un problème vraiment très bizarre...
 
J'ai une classe avec différentes méthodes. Dans des une méthodes, une DLL est chargée (l'instance est gardée dans une variable membre de la classe) et quelques fonctions d'initialisation de la DLL sont appelées. Dans d'autres méthodes, j'appelle d'autres fonctions de la DLL.
Dès que j'appelle, dans ces autres méthodes, une fonction qui passe des paramètres, j'ai un plantage à la sortie de la méthode :??:
Ca arrive souvent lorsqu'un pointeur n'est pas deleté, mais là j'ai beau cherché, je ne trouve pas :/
 
Un peu d'aide serait donc la bienvenue [:ocube]
 
Voilà le code de la classe :
Y a des trucs moisis dedans, mais c'est parce que j'fais des tests pour trouver le pb :D
Le code normal est entre commentaires, mais je vous l'ai viré.
 

Code :
  1. //---------------------------------------------------------------------------
  2. TWB_Extension::TWB_Extension( AnsiString var_DllPath, AnsiString var_DllName )
  3. {
  4. ZeroMemory( this, sizeof( TWB_Extension ) );
  5. PathAndFilename = var_DllPath + "\\" + var_DllName + ".dll";
  6.    Name = var_DllName;
  7. }
  8. //---------------------------------------------------------------------------
  9. TWB_Extension::~TWB_Extension()
  10. {
  11. if ( Dependencies != NULL )
  12.    {
  13.  delete Dependencies;
  14.       Dependencies = NULL;
  15.    }
  16.    if ( MainMenuHead != NULL )
  17.    {
  18.     delete MainMenuHead;
  19.       MainMenuHead = NULL;
  20.    }
  21. }
  22. //---------------------------------------------------------------------------
  23. bool TWB_Extension::Init()
  24. {
  25. bool var_Ret = false;
  26. InstDll = LoadLibrary( PathAndFilename.c_str() );
  27.    if ( InstDll != NULL )
  28.    {
  29.     typedef __int32(*LPFNINITMODULE)();
  30.       LPFNINITMODULE lpfnInitModule = NULL;
  31.       lpfnInitModule = (LPFNINITMODULE)GetProcAddress( InstDll, "InitModule" );
  32.       if ( lpfnInitModule != NULL )
  33.       {
  34.        int var_Res = lpfnInitModule();
  35.          if ( var_Res == 0 )
  36.          {
  37.             var_Ret = true;
  38.          }
  39.       }
  40.    }
  41.    return var_Ret;
  42. }
  43. //---------------------------------------------------------------------------
  44. bool TWB_Extension::Load()
  45. {
  46. bool var_Ret = false;
  47. if ( InstDll != NULL )
  48.    {
  49.     typedef bool(*LPFNGETMODULETYPE)(int);
  50.       LPFNGETMODULETYPE lpfnGetModuleType = NULL;
  51.       lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" );
  52.       if ( lpfnGetModuleType != NULL )
  53.       {
  54.        ModuleType = lpfnGetModuleType(1);
  55.       }
  56.    }
  57.    return var_Ret;
  58. }
  59. //---------------------------------------------------------------------------
  60. bool TWB_Extension::Unload()
  61. {
  62. bool var_Ret = false;
  63. if ( InstDll != NULL )
  64.    {
  65.     typedef void(*LPFNCLEANUP)();
  66.       LPFNCLEANUP lpfnCleanUp = NULL;
  67.     lpfnCleanUp = (LPFNCLEANUP)GetProcAddress( InstDll, "Cleanup" );
  68.       if ( lpfnCleanUp != NULL )
  69.       {
  70.        lpfnCleanUp();
  71.          var_Ret = true;
  72.       }
  73.     FreeLibrary( InstDll );
  74.    }
  75.    InstDll = NULL;
  76.  
  77.    return var_Ret;
  78. }


 
Le code de déclaration :
 

Code :
  1. TWB_Extension* var_Extension = new TWB_Extension( "N:\\modules\\Bin", "Project1" );
  2.    var_Extension->Init();
  3.    var_Extension->Load();
  4.    delete var_Extension;


 
Et ça plante dans la rtl60.bpl, en appelant une fonction qui s'appelle CallDynaInst.

Reply

Marsh Posté le 03-11-2005 à 11:35:47   

Reply

Marsh Posté le 03-11-2005 à 11:39:32    

t'as le code des fonctions des dll qui sont appelées ? (ou juste leur prototype ?)
 
me demande si t'as pas un probleme de convention d'appel
 
 

Citation :

ZeroMemory( this, sizeof( TWB_Extension ) )


 
Alors ca c'est meme pas interdit, c'est pire que ca ! A la revolution on t'aurais decapité sur le champ. Mets a NULL/0 membre par membre, mais surtout fait pas ca ! (Tu risques d'ecraser ton pointeur de V-Table)
 
Sinon d'une maniere generale :
 

Code :
  1. TWB_Extension* var_Extension = new TWB_Extension( "N:\\modules\\Bin", "Project1" );
  2. var_Extension->Init();
  3. var_Extension->Load();
  4. delete var_Extension;


 
tu tiens reelement a faire une alloc dynamique alors qu'une statique te simplifierait la vie ? (encore que vu les noms de variables j'ai comme un doute [:slackerbitch] :d)

Message cité 1 fois
Message édité par chrisbk le 03-11-2005 à 11:41:49
Reply

Marsh Posté le 03-11-2005 à 11:43:06    

(pis t'appelle meme pas ton beau unload [:pingouino])

Reply

Marsh Posté le 03-11-2005 à 11:49:46    

chrisbk a écrit :

t'as le code des fonctions des dll qui sont appelées ? (ou juste leur prototype ?)
 
me demande si t'as pas un probleme de convention d'appel


C'est moi qui les ai faites :D
Enfin pour l'instant, en test.
 

Code :
  1. extern "C" __int32 __stdcall WINEXT_API InitModule()
  2. {
  3. return 0;
  4. }


 

Code :
  1. extern "C" bool WINEXT_API __stdcall EnableCommand(int id)
  2. {
  3. return true;
  4. }


 

Code :
  1. extern "C" void WINEXT_API __stdcall Cleanup()
  2. {
  3. }


 
 

chrisbk a écrit :


Citation :

ZeroMemory( this, sizeof( TWB_Extension ) )


 
Alors ca c'est meme pas interdit, c'est pire que ca ! A la revolution on t'aurais decapité sur le champ. Mets a NULL/0 membre par membre, mais surtout fait pas ca ! (Tu risques d'ecraser ton pointeur de V-Table)


Je ne suis qu'un piètre codeur :D
 

chrisbk a écrit :


Sinon d'une maniere generale :
 

Code :
  1. TWB_Extension* var_Extension = new TWB_Extension( "N:\\modules\\Bin", "Project1" );
  2. var_Extension->Init();
  3. var_Extension->Load();
  4. delete var_Extension;


 
tu tiens reelement a faire une alloc dynamique alors qu'une statique te simplifierait la vie ? (encore que vu les noms de variables j'ai comme un doute [:slackerbitch] :d)


Qu'est ce qu'elles ont mes variables? [:ocube]
Ouais, j'suis obligé. Là j'ai fait un truc pourri pour tester, mais le vrai code n'est pas comme ça. Je réupère les extensions dynamiquement, et je les fous dans une liste chainée, et je parcours la liste quand j'dois faire du carnage. M'enfin tout ça c'est déjà dans l'analyse, c'est codée, y a juste le p'tit truc là qui m'emmerde :D
Donc j'ai réduit au maximum pour trouver d'où venait le pb, d'où le code un peu pourri que tu vois ci dessus [:ocube]

Reply

Marsh Posté le 03-11-2005 à 11:50:32    

chrisbk a écrit :

(pis t'appelle meme pas ton beau unload [:pingouino])


Je l'appelle dans le vrai code mais là j'm'en fou ça plante avant :mad:
J'vais finir par le foutre si tu continues [:ocube]
 
(en plus, le unload ne correspond même plus à l'inverse du load vu que j'ai du foutre un init à la con entre temps, pitoyable [:itm])


Message édité par godbout le 03-11-2005 à 11:51:17
Reply

Marsh Posté le 03-11-2005 à 11:53:31    

godbout a écrit :

C'est moi qui les ai faites :D


 
bon bin la tu les declares en stdcall alors que par defaut la convention est cdecl
 
donc soit tu les modifies dans la dll, soit tu modifies ton typedef (ce qui me semble le mieux)
 
typedef __stdcall __int32  (*LPMONTRUC)();
 
 
jte garanti pas que ca sauve le tout mais deja ca sera un soucis en moins
 
 

Citation :

Je ne suis qu'un piètre codeur :D


 
bin améliore toi :d Vire ca c'est super super dangeureux
 

Citation :

Qu'est ce qu'elles ont mes variables? [:ocube]


 
rien, juste le nom ... :whistle:

Message cité 1 fois
Message édité par chrisbk le 03-11-2005 à 11:54:12
Reply

Marsh Posté le 03-11-2005 à 12:00:36    

chrisbk a écrit :


bon bin la tu les declares en stdcall alors que par defaut la convention est cdecl
 
donc soit tu les modifies dans la dll, soit tu modifies ton typedef (ce qui me semble le mieux)
 
typedef __stdcall __int32  (*LPMONTRUC)();
 
jte garanti pas que ca sauve le tout mais deja ca sera un soucis en moins


J'peux que modifier le typedef ouais, vu que la dll d'exemple que j'ai faite est pompée sur les "vraies" dlls, qui elles ne doivent pas être modifiées.
 

chrisbk a écrit :


bin améliore toi :d Vire ca c'est super super dangeureux


J'crois que tu sais que j'ai du mal d'améliorer quoique que ce soit avec un boss qui dit que les typedef c'est has been [:itm]
 

chrisbk a écrit :


rien, juste le nom ... :whistle:


Tu me proposes quoi ? [:ocube]
Quel con j'avais pas calé le coup des var_ [:rofl]
Une innovation technique :sol:

Message cité 1 fois
Message édité par godbout le 03-11-2005 à 12:05:42
Reply

Marsh Posté le 03-11-2005 à 12:05:16    


Citation :


Tu me proposes quoi ? [:ocube]


 
Nan mais justement au vu du nom jpensais que ce code etait pas de toi [:dawao]

Reply

Marsh Posté le 03-11-2005 à 12:06:43    

godbout a écrit :

J'crois que tu sais que j'ai du mal d'améliorer quoique que ce soit avec un boss qui dit que les typedef c'est has been [:itm]


 
Au bûcher.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-11-2005 à 12:07:06    

chrisbk a écrit :

Citation :


Tu me proposes quoi ? [:ocube]


 
Nan mais justement au vu du nom jpensais que ce code etait pas de toi [:dawao]


J'ai tenté une rebellion mais ça n'a pas marché, et on m'a bien fait comprendre la dernière fois que j'étais pas apte à décider [:cupra]
Donc je met des var_ pour les variables [:god]
Bon, je tiens quand même le coup avec mes typedef, mais je sais pas pour combien de temps [:ocube]

Reply

Marsh Posté le 03-11-2005 à 12:07:06   

Reply

Marsh Posté le 03-11-2005 à 12:08:37    

bon alors ca améliore les choses mon truc ?

Reply

Marsh Posté le 03-11-2005 à 12:08:47    


Arrêtez voir avec ça, ça me rappelle ce qu'on me dit quand je joue de la guitare [:mlc]
 
Euh, sinon j'ai changé, mais rien n'y fait.

Reply

Marsh Posté le 03-11-2005 à 12:09:17    

c'est embetant [:el g]

Reply

Marsh Posté le 03-11-2005 à 12:09:18    

chrisbk a écrit :

bon alors ca améliore les choses mon truc ?


Je me sens meilleur codeur, mais ça chie toujours autant [:ocube]

Reply

Marsh Posté le 03-11-2005 à 12:09:41    

ca plante apres quoi ? l'init ? le load ?

Reply

Marsh Posté le 03-11-2005 à 12:14:16    

Attends, ça marche maintenant :D
J'avais viré le ZeroMemory, mais j'avais pas initialisé toutes les variables de la classe à NULL (juste celle qui sont utilisées dans le code). Apparemment ça viendrait de là.
 
C'était toujours après le Load, juste au moment de quitter la fonction.

Reply

Marsh Posté le 03-11-2005 à 12:15:37    

moi jpense que ca vient aussi de mon histoire de convention d'appel [:icon11] (ce qui est appuyé par le lieu du plantage)


Message édité par chrisbk le 03-11-2005 à 12:15:46
Reply

Marsh Posté le 03-11-2005 à 12:15:54    

Ah ben nan ça venait pas de ça :??: :heink:

Reply

Marsh Posté le 03-11-2005 à 12:16:20    

Attends je vire, on verra bien :D
Parce que j'avais bien mis tes conventions, mais ça chiait toujours.

Reply

Marsh Posté le 03-11-2005 à 12:16:39    

chui perdu :d
 
ca marche ou pas ?  
ca venait d'ou ?

Reply

Marsh Posté le 03-11-2005 à 12:17:03    

J'ai viré tes conventions, ça marche :mad:

Reply

Marsh Posté le 03-11-2005 à 12:17:27    

J'en sais rien du tout :D
Peut être le ZeroMemory?
Pourtant en le virant ça chiait toujours dans la colle.

Reply

Marsh Posté le 03-11-2005 à 12:18:33    

J'ai remis le ZeroMemory ça marche [:rofl]
 
Bon écoute, j'réessaye dans mon "vrai" code et pas ma petite appli test pourrie, et j'te dis [:ocube]


Message édité par godbout le 03-11-2005 à 12:19:41
Reply

Marsh Posté le 03-11-2005 à 12:20:35    

[:le kneu][:le kneu][:le kneu][:le kneu][:le kneu]
 
jpige pu rien [:pingouino] :d
 
refait voir le code apres modif :d


Message édité par chrisbk le 03-11-2005 à 12:20:51
Reply

Marsh Posté le 03-11-2005 à 12:22:20    

jcomprends pas comment ca marche avec des conventions d'appel differentes oO
 
puis le ZeroMemory est drolement scabreux.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-11-2005 à 12:23:19    

blackgoddess a écrit :

jcomprends pas comment ca marche avec des conventions d'appel differentes oO


 
sur une fonction avec 0 argument, ca change rien (le stdcall / cdecl), par contre sa fonction avec un entier normalement ca devrait cacater  
 

Reply

Marsh Posté le 03-11-2005 à 12:24:17    

Code :
  1. //---------------------------------------------------------------------------
  2. TWB_Extension::TWB_Extension( AnsiString var_DllPath, AnsiString var_DllName )
  3. {
  4. PathAndFilename = var_DllPath + "\\" + var_DllName + ".dll";
  5.    Name = var_DllName;
  6.    InstDll = NULL;
  7.    Configure = 0;
  8.    ModuleType = 0;
  9.    Dependencies = new TStringList();
  10.    ShowName = "";
  11.    Version = 0;
  12.    LogMessage = NULL,
  13.    MainMenuHead = NULL;
  14.    OrderMenuHead = NULL;
  15. }
  16. //---------------------------------------------------------------------------
  17. TWB_Extension::~TWB_Extension()
  18. {
  19. if ( Dependencies != NULL )
  20.    {
  21.  delete Dependencies;
  22.       Dependencies = NULL;
  23.    }
  24.    if ( MainMenuHead != NULL )
  25.    {
  26.     delete MainMenuHead;
  27.       MainMenuHead = NULL;
  28.    }
  29. }
  30. //---------------------------------------------------------------------------
  31. bool TWB_Extension::Init()
  32. {
  33. bool var_Ret = false;
  34. InstDll = LoadLibrary( PathAndFilename.c_str() );
  35.    if ( InstDll != NULL )
  36.    {
  37.     typedef __stdcall __int32(*LPFNINITMODULE)();
  38.       LPFNINITMODULE lpfnInitModule = NULL;
  39.       lpfnInitModule = (LPFNINITMODULE)GetProcAddress( InstDll, "InitModule" );
  40.       if ( lpfnInitModule != NULL )
  41.       {
  42.        int var_Res = lpfnInitModule();
  43.          if ( var_Res == 0 )
  44.          {
  45.             var_Ret = true;
  46.          }
  47.       }
  48.    }
  49.    return var_Ret;
  50. }
  51. //---------------------------------------------------------------------------
  52. bool TWB_Extension::Load()
  53. {
  54. bool var_Ret = false;
  55. if ( InstDll != NULL )
  56.    {
  57.     typedef __stdcall bool(*LPFNGETMODULETYPE)(int);
  58.       LPFNGETMODULETYPE lpfnGetModuleType = NULL;
  59.       lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" );
  60.       if ( lpfnGetModuleType != NULL )
  61.       {
  62.        ModuleType = lpfnGetModuleType(1);
  63.       }
  64.    }
  65.    return var_Ret;
  66. }


 
Ca a l'air de marcher dans ma vraie appli aussi, merci :love: [:super chinois]
 
Par contre, en remettant crado comme avant, j'ai pas réussi à refaire planter [:god]
 
Au fait, si tu vois un autre truc à améliorer dans le code, n'hésite pas [:ocube]

Reply

Marsh Posté le 03-11-2005 à 12:25:51    

blackgoddess a écrit :


puis le ZeroMemory est drolement scabreux.


Moi qui pensait avoir trouvé un tip super [:mlc]
 
A votre avis ça passe sur le site où on se fout de la gueule des erreurs des autres ?

Reply

Marsh Posté le 03-11-2005 à 12:26:49    

chrisbk a écrit :


sur une fonction avec 0 argument, ca change rien (le stdcall / cdecl), par contre sa fonction avec un entier normalement ca devrait cacater


Quelle maîtrise. J'en savais rien du tout. On me file la DLL avec les conventions là, j'ai pas cherché à savoir, honte à moi.
Par contre effectivement, ça plantait seulement avec une function à paramètres.

Reply

Marsh Posté le 03-11-2005 à 12:27:19    

bin les Dependencies = NULL; dans le destructeur ca sert a rien [:pingouino]
 
j'aime pas trop les var_Ret, je prefere mettre un return, meme au plein milieu d'une fonction (et c'est mon choix(tm)), et plutot que de faire

Code :
  1. if (InstDll != NULL)
  2. {
  3. plein de truc
  4. }


 
je prefere faire
 

Code :
  1. if (InstDll  == NULL)
  2. return false;


 
bon, la c'est question de gout. Sinon t'as des lignes qui servent a rien mais c'est pas trop grave :d

Reply

Marsh Posté le 03-11-2005 à 12:29:14    

godbout a écrit :


A votre avis ça passe sur le site où on se fout de la gueule des erreurs des autres ?


 
hein ? :d
 

godbout a écrit :

Quelle maîtrise. J'en savais rien du tout. On me file la DLL avec les conventions là, j'ai pas cherché à savoir, honte à moi.


 
bah pas grand monde se penche sur ce genre de blague :d enfin la convention d'appel c'est important, si y'a rien mets rien si y'a qqchose bin mets la meme. Jte ferais un cours sur les conventions d'appel si ca te chante [:klem3i1]

Reply

Marsh Posté le 03-11-2005 à 12:31:25    

chrisbk a écrit :

bin les Dependencies = NULL; dans le destructeur ca sert a rien [:pingouino]


Ouais, je sais que ça sert à rien, mais j'préfère faire tout le temps le même schémà, et ne pas oublier de mettre à NULL une fois ou j'en aurai besoin que l'inverse [:ocube]
Mais sinon je vire hein :D
Je veux devenir un vrai codeur comme Bill Gates.
 

chrisbk a écrit :


j'aime pas trop les var_Ret, je prefere mettre un return, meme au plein milieu d'une fonction (et c'est mon choix(tm)), et plutot que de faire

Code :
  1. if (InstDll != NULL)
  2. {
  3. plein de truc
  4. }


 
je prefere faire
 

Code :
  1. if (InstDll  == NULL)
  2. return false;




Ouais, alors ça j'ai mis du temps à me décider. J'me suis dit que les return c'était dès fois un peu traitre, genre quand t'as ton LoadLibrary plus bas... A moins de refoutre un LoadLibrary devant chaque return, mais que tu viens pour modifier le code, tu le vois pas forcément.
 

chrisbk a écrit :


bon, la c'est question de gout. Sinon t'as des lignes qui servent a rien mais c'est pas trop grave :d


Genre genre genre dis moi tout [:ocube]
Si tu parles des grands if () au lieu de foutre sur une ligne, c'est pour la lisibilité [:aloy]

Reply

Marsh Posté le 03-11-2005 à 12:32:19    

chrisbk a écrit :


bah pas grand monde se penche sur ce genre de blague :d enfin la convention d'appel c'est important, si y'a rien mets rien si y'a qqchose bin mets la meme. Jte ferais un cours sur les conventions d'appel si ca te chante [:klem3i1]


Ouais, j'avais pas fait gaflle, le con [:ocube]
 
Pour le cours, ça va attendre, je sais pas si j'vais continuer longtemps dans cette voie là [:dawa]

Reply

Marsh Posté le 03-11-2005 à 13:37:00    

[quotemsg=1237380,32,19632
Genre genre genre dis moi tout [:ocube]
Si tu parles des grands if () au lieu de foutre sur une ligne, c'est pour la lisibilité [:aloy][/quotemsg]
 
bin genre ca
 

Code :
  1. LPFNGETMODULETYPE lpfnGetModuleType = NULL;
  2.   lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" )


 
chui une niasse, je concatene
 

Code :
  1. LPFNGETMODULETYPE lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" )

Reply

Marsh Posté le 03-11-2005 à 13:37:05    

je suis interressé moi :)
mais en fait jvais googler au lieu de demander betement, jreviendrais si je comprends pas, mci :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-11-2005 à 13:37:56    

blackgoddess a écrit :

je suis interressé moi :)
mais en fait jvais googler au lieu de demander betement, jreviendrais si je comprends pas, mci :p


 
y'a un article de la msdn assez causant la dessus
 
en deux mots, la convention change :  
-ou tu mets les parametres et dans quel ordre (pile ? registre ?)
-qui fait le menage dans les parametres a la fin de la fonction (appelant ? appelé ?)

Reply

Marsh Posté le 03-11-2005 à 13:41:36    

chrisbk a écrit :

[quotemsg=1237380,32,19632
Genre genre genre dis moi tout [:ocube]
Si tu parles des grands if () au lieu de foutre sur une ligne, c'est pour la lisibilité [:aloy]


 
bin genre ca
 

Code :
  1. LPFNGETMODULETYPE lpfnGetModuleType = NULL;
  2.   lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" )


 
chui une niasse, je concatene
 

Code :
  1. LPFNGETMODULETYPE lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "EnableCommand" )

[/quotemsg]
Ah ouais celui là il est flagrant [:dawao]

Reply

Marsh Posté le 03-11-2005 à 13:43:54    

bin ya cui la aussi
 
 

Code :
  1. int var_Res = lpfnInitModule();
  2. if ( var_Res == 0 )
  3. {
  4.    var_Ret = true;
  5. }


 
 
ca pourrait se concatener en
 

Code :
  1. if ( lpfnInitModule() == 0 )
  2.    return true;


 
c'est super verbeux ton truc :d
 

Reply

Marsh Posté le 03-11-2005 à 13:53:53    

Oui mais nan, parce que le vrai code c'est ça :
 

Code :
  1. int var_Res = lpfnInitModule();
  2.          if ( var_Res == 0 )
  3.          {
  4.           typedef __stdcall int(*LPFNSETCONFIGDATA)( const TModuleConfigData* );
  5.        LPFNSETCONFIGDATA lpfnSetConfigData = NULL;
  6.        lpfnSetConfigData = (LPFNSETCONFIGDATA)GetProcAddress( InstDll, "SetConfigData" );
  7.             if ( lpfnSetConfigData != NULL )
  8.             {
  9.              lpfnSetConfigData( NULL );
  10.             }
  11.             ModuleType = 0;
  12.             typedef __stdcall int(*LPFNGETMODULETYPE)();
  13.             LPFNGETMODULETYPE lpfnGetModuleType = NULL;
  14.             lpfnGetModuleType = (LPFNGETMODULETYPE)GetProcAddress( InstDll, "GetModuleType" );
  15.             if ( lpfnGetModuleType != NULL )
  16.             {
  17.              ModuleType = lpfnGetModuleType();
  18.             }
  19.             Dependencies->Clear();
  20.             typedef __stdcall int(*LPFNWE_GETMODULEDEPENDENCIES)( TCsString *& );
  21.             LPFNWE_GETMODULEDEPENDENCIES lpfnWE_GetModuleDependencies = NULL;
  22.             lpfnWE_GetModuleDependencies = (LPFNWE_GETMODULEDEPENDENCIES)GetProcAddress( InstDll, "WE_GetModuleDependencies" );
  23.             if ( lpfnWE_GetModuleDependencies != NULL )
  24.             {
  25.              TCsString* var_CsString;
  26.              lpfnWE_GetModuleDependencies( var_CsString );
  27.                int i = 0;
  28.                while ( (var_CsString[i] == NULL) == false )
  29.                {
  30.                 Dependencies->Add( AnsiString( var_CsString[i].c_str() ) );
  31.                   i++;
  32.                }
  33.                typedef __stdcall void(*LPFNWE_FREESTRINGS)( TCsString* );
  34.             LPFNWE_FREESTRINGS lpfnWE_FreeStrings = NULL;
  35.              lpfnWE_FreeStrings = (LPFNWE_FREESTRINGS)GetProcAddress( InstDll, "WE_FreeStrings" );
  36.                if ( lpfnWE_FreeStrings != NULL )
  37.             {
  38.                 lpfnWE_FreeStrings( var_CsString );
  39.                }
  40.             }
  41.             ShowName = Name;
  42.             typedef const char*(*LPFNGETSHOWNAME)();
  43.             LPFNGETSHOWNAME lpfnGetShowName = NULL;
  44.             lpfnGetShowName = (LPFNGETSHOWNAME)GetProcAddress( InstDll, "GetShowName" );
  45.             if ( lpfnGetShowName != NULL )
  46.             {
  47.              ShowName = AnsiString( lpfnGetShowName() );
  48.             }
  49.             Version = 0;
  50.             typedef __stdcall unsigned long(*LPFNVERSION)();
  51.             LPFNVERSION lpfnVersion = NULL;
  52.             lpfnVersion = (LPFNVERSION)GetProcAddress( InstDll, "Version" );
  53.             if ( lpfnVersion != NULL )
  54.             {
  55.              Version = lpfnVersion();
  56.             }
  57.             Configure = 0;
  58.             typedef __stdcall int(*LPFNCONFIGURE)( HWND, TModuleConfigData* );
  59.             LPFNCONFIGURE lpfnConfigure = NULL;
  60.             lpfnConfigure = (LPFNCONFIGURE)GetProcAddress( InstDll, "Configure" );
  61.             if ( lpfnConfigure != NULL )
  62.             {
  63.              Configure = 1;
  64.             }
  65.             var_Ret = true;
  66.          }


 
[:aloy]
 
Mais bon, c'était bien le coup des __stdcall merci [:super chinois]
 
Par contre j'ai juste un p'tit problème avec une fonction qui retourne un const char*, ça compile pas avec le __stdcall. J'peux le virer sans pb? [:ocube] (le mauvais [:god])
 
edit: Si j'met le __stdcall après le type (int, const char*, etc...), ça compile. D'ailleurs c'est comme ça dans les dlls, ça marche aussi ? :??:

Message cité 1 fois
Message édité par godbout le 03-11-2005 à 13:57:38
Reply

Marsh Posté le 03-11-2005 à 13:54:30    

chrisbk a écrit :


c'est super verbeux ton truc :d


C'est pour que ce soit plus lisible pour quand je patirai [:cupra]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed