ok ok, mais comment je fais pour avoir la valeur qui est pointée et non pas son adresse mémoire?
Frappez pas trop fortje commence à tout mélanger...
Quand j'aurai compris le truc et que mon proto sera ok je pense que ça ira déjà mieux (j'espère...)
ok ok, mais comment je fais pour avoir la valeur qui est pointée et non pas son adresse mémoire?
Frappez pas trop fortje commence à tout mélanger...
Quand j'aurai compris le truc et que mon proto sera ok je pense que ça ira déjà mieux (j'espère...)
Ben, comme pour tout pointeur, quand tu veux accéder à la valeur et non à l'adresse à laquelle elle se trouve
[EDIT]Ceci dit, ce genre de question nous inciterait presque à te conseiller de réviser ou de relire très sérieusement ton cours ou ton livre à la partie "pointeurs et tableaux"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 /* transformer un entier en un pointeur sur entier */ int entier; int *ptrent; ptrent=&entier; /* récupérer un entier au départ d'un pointeur sur entier int recup; recup=*ptrent; /* particularité pour les tableaux */ int tab[10]; ptrent=tab; recup=tab[3];![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
aaaaahhhhhhh
Ce que j'avais fait été donc bon... Mes souvenirs sont pas encore trop pourri...
Arf Pas de bol, maintenant, j'ai Firefox qui explose encore quand j'arrive au niveau de mon transtypage... De quoi se pendre...
Je vais aller bouffer, ça ira pitète mieux après....
J'ai trop l'impression de toucher le fond là, y a pas plus pire que moi...
J'ai fait ça :
ça compile nickel mais mon Firefox plante juste au niveau du transtypage... Je sent que j'ai encore du faire une connerie...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 NS_IMETHODIMP CSpecialThing::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval) { PRInt32 test; typedef char* (_stdcall *ProcDllPtr)(char* monString); char* reponseDLL; HMODULE hinstDLL=LoadLibraryA((LPCSTR)"C:\\DLMDLL.dll"); if (hinstDLL) { ProcDllPtr ProcExportDll = (ProcDllPtr) GetProcAddress(hinstDLL, "Ajouter_article"); reponseDLL=ProcExportDll((char*)("affiche moi")); } else { //traitement erreur } FreeLibrary((HINSTANCE)hinstDLL); PRInt32 * testa = reinterpret_cast<PRInt32 *>(reponseDLL); test=*testa; *_retval = test; return NS_OK; }
je pense que tu libère ta dll trop tôt. il y as de forte chance que lorsque tu la libère, la memoire pointer par reponseDLL soit libéré, d'ou ton crash.
essaie cela
Le mieux serait un class qui interface ta dll
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 NS_IMETHODIMP CSpecialThing::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval) { PRInt32 test; typedef char* (_stdcall *ProcDllPtr)(char* monString); char* reponseDLL; HMODULE hinstDLL=LoadLibraryA((LPCSTR)"C:\\DLMDLL.dll"); if (hinstDLL) { ProcDllPtr ProcExportDll = (ProcDllPtr) GetProcAddress(hinstDLL, "Ajouter_article"); reponseDLL=ProcExportDll((char*)("affiche moi")); } else { //traitement erreur } PRInt32 * testa = reinterpret_cast<PRInt32 *>(reponseDLL); test=*testa; *_retval = test; FreeLibrary((HINSTANCE)hinstDLL); return NS_OK; }
Déjà, on pourrait commencer par te suggérer d'adopter une politique d'indentation rigoureuse... N'oublie jamais qu'un code est beaucoup plus souvent lu qu'il n'est écrit, et que, s'il te semble limpide aujourd'hui, il peut te sembler bien plus nébuleux dans une semaine ou dans trois mois
Ainsi, et sans avoir apporté la moindre correction, ton code serait bien plus lisible sous un forme proche de
(préfère l'indentation sous forme d'espaces (4, c'est pas mal
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 NS_IMETHODIMP CSpecialThing::Add(PRInt32 a, PRInt32 b, PRInt32 *_retval) { PRInt32 test; typedef char* (_stdcall *ProcDllPtr)(char* monString); char* reponseDLL; HMODULE hinstDLL=LoadLibraryA((LPCSTR)"C:\\DLMDLL.dll"); if (hinstDLL) { ProcDllPtr ProcExportDll = (ProcDllPtr) GetProcAddress(hinstDLL, "Ajouter_article"); reponseDLL=ProcExportDll((char*)("affiche moi")); } else { //traitement erreur } FreeLibrary((HINSTANCE)hinstDLL); PRInt32 * testa = reinterpret_cast<PRInt32 *>(reponseDLL); test=*testa; *_retval = test; return NS_OK; }) à celle sous forme de tabulation, et veille autant que possible à respecter une regle simple: une ligne= une instruction
)
Maintenant, les remarques qui font mal:
Méfie toi des typedef à l'intérieur des fonctions... ils ne sont en effet disponible qu'à l'intérieur de cette fonction, et on peut penser que, si tu les trouve intéressants dans une fonction, tu leur trouvera sans doute une utilité quelconque ailleurs
Tu utilises beaucoup trop le cast "C style" à mon goût: les instructions
- LoadLibraryA((LPCSTR)"C:\\DLMDLL.dll");
- (ProcDllPtr) GetProcAddress(hinstDLL, "Ajouter_article");
- ProcExportDll((char*)("affiche moi"));
- FreeLibrary((HINSTANCE)hinstDLL);
sont autant d'instructions dans lesquelles tu utilise un cast "C style" alors que tu pourrais t'en passer assez facilement
Sauf erreur, LPCSTR n'est qu'un alias de const char*, ce qui te permettrait de travailler sous une forme plus générique de
La même remarque peut s'appliquer à ProcExportDll((char*)("affiche moi"));
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 std::string str="c:\\DLMDLL.dll"); /* pourrait très bien être un argument ;) */ LoadLibraryA(str.c_str());
Pour les deux autres (ProcDllPtr et HINSTANCE), tu devrais peut être préférer, au pire le reinterpret_cast, au mieux (si il fonctionne) le static_cast...
Cette suggestion a pour seul but de te permettre de t'y retrouver plus facilement dans le code
En effet, en effectuant une recherche sur "(HINSTANCE)", tu peux tomber, au choix,
- sur une fonction qui reçoit HINSTANCE en paramètre
- sur un transtypage de quelque chose en HINSTANCE
Par contre, si tu travailles à coup de static_/reinterpret_/const_/dynamic_ cast, et en utilisant au besoin les expressions régulières, tu sera certain, lors d'une recherche sur "_cast<HINSTANCE>" ou sur "_cast<un type donné> (HINSTANCE)" que les seuls résultats obtenus seront... des transtypages de quelque chose en HINSTANCE (ou de HINSTANCE en autre chose)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
hèhè, oui en effet, mon indentation est partie en live... A force de commenter, décommenter, ajouter, supprimer... Faut que je remette ça au propre
J'ai commencé le vc++ il y a à peine 1 semaine, je suis pas encore à fond dedans, tes éclaircissements sur les methodes de transtypage sont très intéréssantes et plus digeste que la plupart des tutaux que j'ai lu (c'est quand on a les pieds dedans qu'on comprend mieux généralement).
Sinon, en effet, je libérais ma dll trop tôt, maintenant ça crash plus mais je récupère toujours un chiffre qui ne correspond pas à celui envoyé par ma dll qui est 666 (j'aurai pas du choisir celui-là mdr). Je pense que je récupère encore un pointer au lieu de la valeur...
Reste plus qu'à me sacrer roi des boulets si ça continue! Mais ce qui me rassure c'est que je comprend petit à petit et que je commence à imprimer le vc++ dans mon cerveau
Faut pas le dire mais je suis blond lol...
Ceci dit, ne confond pas...:
VC++ est un outil ( pour être précis: un EDI (Environnement de Développement Intégré) voir un RAD (Rapid Application Development) pour les versions "pro") et est l'abréviation de Visual C++ (Visual faisant référence à la suite d'outils Visual Studio de microsoft)
Le langage, c'est C++, et il n'y a pas de V dedans![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
c'est un abus de langage de ma part.
Avec Delphi, j'ai pas ce souci là lol... Et j'ai pas non plus de souci de pointeur comme en ce moment avec ce fichu PRInt32 à la
Je deteste rester coincer sur 2 lignes de code pendant des jours... ça me donne l'impression d'être plus bête que je ne le suis déjà mdr
juste pour info, tu recupere quoi comme valeur au lieu de 666 ??
Je récupère :3552822. C'est fun, c'est toujours le même contrairement à une époque... Je parie que je récupère le bon chiffre mais pas au bon format...
En hexa, ça donne 0x363636.
Ce qui en little-endian (notamment sur un processeur x86) donne les octets:
Ce qui équivaut à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part { 0x36, 0x36, 0x36, 0}
---> Donc, il est possible que tu aies transformé ton 666 en chaîne de caractères...
Code : Sélectionner tout - Visualiser dans une fenêtre à part { '6', '6', '6', '\0'}
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Réessaie avec 42, on verra bien si tu obtiens 0x**003234...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
en effet si je remplace mon 666 par 42 j'obtient bien 3234
J'ai l'impression que chaque problème résolu en créé un autre...
Bon, il me reste plus qu'à voir comment transformer mon hexa en decimal
J'ai pas tout suivi, mais là tu récupères de ta fonction un char* (donc "666") et tu voudrais récupérer l'entier 666 ? C'est ça ?
Si oui, alors pourquoi être parti sur un reinterpret_cast ? Ce qu'il te faut c'est une conversion chaîne --> entier, et c'est très bien expliqué dans la FAQ.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
ou
si c'est bien ça, reponseDLL aurai ton nombre sous forme de string.
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part std::string reponseDLL=ProcExportDll((char*)("affiche moi"));
YAHOOOOOOOOOOO!!!!!!!!!!!!!!!
ça marche!!!!!
C'est la fête, Merci à tous!!!!
Vous êtes des
Pour ceux que ça intérésse, voici mon code (pas très beau mais qui marche!) :
Comme d'hab', c'est un truc à la c... sur lequel on passe des heures...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 std::istringstream iss(reponseDLL); int nombre; iss >> nombre; test=nombre;
Pas grave, ça MARCHE!!!!!!
MERCI, 1000 MERCI
![]()
c'était par rapport à la remarque c++ et vc++, pour Delphi le langage c'est Delphi et l'IDE c'est Delphi aussi lol
Partager