LPCVOID - Modifier le contenu

Résolu
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006 - 6 juin 2006 à 18:06
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006 - 7 juin 2006 à 17:07
Salut!


C'est mon premier post


Bon ma question est la suivante :


J'ai une fonction write_to_file(LPCVOID texte) qui se charge d'ecrire une chaine dans un fichier à l'aide de l'api Writefile(). Quand je l'appelle je le fait sois en lui envoyant la chaine directement entre guillements write_to_file("Valeur :") , sois en lui envoyant un WORD write_to_file( &char).
Jusque là pas de problème.


Seulement voilà, j'aimerais rajouter à cette fonction un petit codage ultra rapide du type texte[i]^=0xAA mais impossible d'interagir avec texte : taille du lpcvoid inconnue !
J'ai essayé de faire des cast (char[]) et (char *) ou *(texte+i) mais ca ne fonctionne pas. Pourtant quand j'appelle strlen() en faisant un cast (const char *) et bien là strlen me retourne bien la bonne taille de texte.


Je me tourne donc vers vous pour vous demander s'il est possible de faire ce que je veux et si oui de quelle manière.


Merci.
A voir également:

11 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
6 juin 2006 à 18:43
LPCVOID -> déja le C indique que c'est un pointeur constant (impossible de modifier ce sur quoi il pointe)
Pour faire tes opérations, il te faudrait un LPBYTE par exemple
Ta fonction devrait plutot avoir cette forme:
write_to_file(LPBYTE texte, int length)
{
LPBYTE p, end = texte + length;
for(p = texte, p != end; *p++ ^= 0xAA);
WriteFile(...);
// Remet le texte dans son état d'origine
for(p = texte, p != end; *p++ ^= 0xAA);
}

Sinon, tu peux allouer un deuxième buffer, pour éviter de devoir faire le décodage ensuite
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
7 juin 2006 à 16:55
C'est normal, ta chaine "Bonjour" est considérée comme constante, tu ne peux donc pas la modifier (mais bizarrement aucun message d'erreur)

Voici donc un exemple qui modifie bien la chaine passée en argument:


#define _WIN32_WINNT 0x0400

#include <windows.h>

void Message( LPBYTE texte )
{
*(texte+2)= 'i';
MessageBox( NULL, (LPCSTR)texte, "Test", MB_OK);
}


int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmd,int nShow )
{
char message[] = "Bonjour";
Message( (LPBYTE)message);
return( FALSE );
}
3
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006
6 juin 2006 à 20:00
Salut vecchio,
merci de ton aide.

Alors j'ai bien remplacé les arguments attendus par ma fonction par write_to_file(LPBYTE texte, int length).
Ca ne fonctionnait plus mais en castant l'argument a chaque fois que j'appelle write_to_file() ca refonctionne sans problème : write_to_file((LPBYTE)"Valeur :") et write_to_file((LPBYTE)&char).

Seulement impossible d'appliquer le codage, j'ai bien essayé avec ta ligne for(p = texte, p != end; *p++ ^= 0xAA) que j'ai bien comprise et avec plusieurs autres équivalents mais le programme ne passe étrangement jamais ce cap comme si la boucle était sans fin ?!

Je vais chercher et je tiens tout le monde au courant au cas ou quelqun en ait besoin plus tard. Je te valide ton post une fois le problème intégralement solutionné.

Merci pour l'info sur le C de LPCVOID, j'ai toujours supposé que LP voulait dire long pointer, mais je ne voyais pas ce que pouvais bien vouloir dire le C.

A+
0
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006
7 juin 2006 à 00:51
Salut,
je n'ai toujours pas trouvé de solution à mon problème.

Par contre quand je place un MessageBox( NULL, texte, "DEBUG", MB_OK) au début de write_to_file( LPBYTE texte), tout fonctionne, si je le précède juste d'une texte[0]='A' ou bien encore d'un strcpy(texte,"A") et bien plus rien ne s'affiche.

Le mystère reste entier, personne n'a d'idée.
Je vous préviens si je trouve.

A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
7 juin 2006 à 08:25
Salut,

je ne connais pas ^= (mais je vais me renseigner ), mais en faisant "*p++ ^= 0xAA" tu modifies ton 'p' de depart ?? As tu essayé "*++p ^= 0xAA" ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
7 juin 2006 à 09:10
Non c'est bien *p++ car sinon le premier octet ne sera pas modifié
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
7 juin 2006 à 10:43
Ah ok.

Et pour l'info,  ^= ca fait quoi ? Vive les moteurs de recherche... Ils prennent pas en compte les accents et tout le bordel... (ou alors je ne sais pas m'en servir, ce qui est possible aussi)

A+
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
7 juin 2006 à 11:25
^ c'est le ou exclusif
0
dmk04 Messages postés 206 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 7 mars 2012
7 juin 2006 à 12:07
Ahhhh ok, merci :)
0
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006
7 juin 2006 à 16:38
Salut.

Bon alors merci DMK04, mais comme le dit vecchio, c'est p++ qui correspond ici.
J'arrive vraiment pas à trouver, je suis dans l'impasse pourtant je suis sur que c'est relativement simple mais je découvre Vs et l'api windows.

Je vous ai mis un mini example <>
Comme ca vous pourrez vous rendre compte par vous même que ca fonctionne très bien tant qu'on a pas toucher à texte.

Merci d'encore pretter attention à ma question.
0
cs_noobs Messages postés 7 Date d'inscription mardi 6 juin 2006 Statut Membre Dernière intervention 19 juin 2006
7 juin 2006 à 17:07
Super vecchio !

Merci beaucoup c'était donc simplement ça le problème.
Ca va déjà bien me permettre d'avancer.

A+
0