Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1518 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Précédente
Auteur Sujet :

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

n°1237280
godbout
Génial.
Posté le 03-11-2005 à 11:35:47  profilanswer
 

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.

mood
Publicité
Posté le 03-11-2005 à 11:35:47  profilanswer
 

n°1237287
chrisbk
-
Posté le 03-11-2005 à 11:39:32  profilanswer
 

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
n°1237294
chrisbk
-
Posté le 03-11-2005 à 11:43:06  profilanswer
 

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

n°1237306
godbout
Génial.
Posté le 03-11-2005 à 11:49:46  profilanswer
 

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]

n°1237309
godbout
Génial.
Posté le 03-11-2005 à 11:50:32  profilanswer
 

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
n°1237316
chrisbk
-
Posté le 03-11-2005 à 11:53:31  profilanswer
 

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
n°1237325
godbout
Génial.
Posté le 03-11-2005 à 12:00:36  profilanswer
 

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
n°1237330
chrisbk
-
Posté le 03-11-2005 à 12:05:16  profilanswer
 


Citation :


Tu me proposes quoi ? [:ocube]


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

n°1237333
blackgodde​ss
vive le troll !
Posté le 03-11-2005 à 12:06:43  profilanswer
 

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 )-
n°1237334
godbout
Génial.
Posté le 03-11-2005 à 12:07:06  profilanswer
 

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]

mood
Publicité
Posté le 03-11-2005 à 12:07:06  profilanswer
 

n°1237335
chrisbk
-
Posté le 03-11-2005 à 12:08:37  profilanswer
 

bon alors ca améliore les choses mon truc ?

n°1237336
godbout
Génial.
Posté le 03-11-2005 à 12:08:47  profilanswer
 


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.

n°1237339
chrisbk
-
Posté le 03-11-2005 à 12:09:17  profilanswer
 

c'est embetant [:el g]

n°1237340
godbout
Génial.
Posté le 03-11-2005 à 12:09:18  profilanswer
 

chrisbk a écrit :

bon alors ca améliore les choses mon truc ?


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

n°1237342
chrisbk
-
Posté le 03-11-2005 à 12:09:41  profilanswer
 

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

n°1237346
godbout
Génial.
Posté le 03-11-2005 à 12:14:16  profilanswer
 

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.

n°1237350
chrisbk
-
Posté le 03-11-2005 à 12:15:37  profilanswer
 

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
n°1237353
godbout
Génial.
Posté le 03-11-2005 à 12:15:54  profilanswer
 

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

n°1237355
godbout
Génial.
Posté le 03-11-2005 à 12:16:20  profilanswer
 

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

n°1237357
chrisbk
-
Posté le 03-11-2005 à 12:16:39  profilanswer
 

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

n°1237358
godbout
Génial.
Posté le 03-11-2005 à 12:17:03  profilanswer
 

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

n°1237359
godbout
Génial.
Posté le 03-11-2005 à 12:17:27  profilanswer
 

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

n°1237361
godbout
Génial.
Posté le 03-11-2005 à 12:18:33  profilanswer
 

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
n°1237363
chrisbk
-
Posté le 03-11-2005 à 12:20:35  profilanswer
 

[: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
n°1237367
blackgodde​ss
vive le troll !
Posté le 03-11-2005 à 12:22:20  profilanswer
 

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


---------------
-( BlackGoddess )-
n°1237368
chrisbk
-
Posté le 03-11-2005 à 12:23:19  profilanswer
 

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  
 

n°1237370
godbout
Génial.
Posté le 03-11-2005 à 12:24:17  profilanswer
 

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]

n°1237373
godbout
Génial.
Posté le 03-11-2005 à 12:25:51  profilanswer
 

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 ?

n°1237374
godbout
Génial.
Posté le 03-11-2005 à 12:26:49  profilanswer
 

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.

n°1237375
chrisbk
-
Posté le 03-11-2005 à 12:27:19  profilanswer
 

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

n°1237377
chrisbk
-
Posté le 03-11-2005 à 12:29:14  profilanswer
 

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]

n°1237380
godbout
Génial.
Posté le 03-11-2005 à 12:31:25  profilanswer
 

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]

n°1237382
godbout
Génial.
Posté le 03-11-2005 à 12:32:19  profilanswer
 

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]

n°1237430
chrisbk
-
Posté le 03-11-2005 à 13:37:00  profilanswer
 

[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" )

n°1237431
blackgodde​ss
vive le troll !
Posté le 03-11-2005 à 13:37:05  profilanswer
 

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


---------------
-( BlackGoddess )-
n°1237432
chrisbk
-
Posté le 03-11-2005 à 13:37:56  profilanswer
 

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é ?)

n°1237434
godbout
Génial.
Posté le 03-11-2005 à 13:41:36  profilanswer
 

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]

n°1237436
chrisbk
-
Posté le 03-11-2005 à 13:43:54  profilanswer
 

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
 

n°1237452
godbout
Génial.
Posté le 03-11-2005 à 13:53:53  profilanswer
 

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
n°1237455
godbout
Génial.
Posté le 03-11-2005 à 13:54:30  profilanswer
 

chrisbk a écrit :


c'est super verbeux ton truc :d


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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Classes[C++] Probleme avec la stl et les classes templates
[Résolu] Expressions régulières et classesles classes Date et Timestamp
APPLET embarquant des classes nativesClasses, Vecteurs et Tri...
Design applicatif & methodes statiques[C#] Problème d'instanciation de classes et usage de la class Debug
[Visual C++] Classes filles de CExceptionprob acces membres de classes pour fichier inclus en path absolu
Plus de sujets relatifs à : [C++] Classes, méthodes et DLLs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR