LPCVOID - Modifier le contenu [Résolu]

Signaler
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006
-
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006
-
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.

11 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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 );
}
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006

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+
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006

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+
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

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" ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Non c'est bien *p++ car sinon le premier octet ne sera pas modifié
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

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+
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
^ c'est le ou exclusif
Messages postés
206
Date d'inscription
samedi 29 octobre 2005
Statut
Membre
Dernière intervention
7 mars 2012

Ahhhh ok, merci :)
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006

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.
Messages postés
7
Date d'inscription
mardi 6 juin 2006
Statut
Membre
Dernière intervention
19 juin 2006

Super vecchio !

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

A+