varbool
Messages postés20Date d'inscriptionlundi 24 mai 2004StatutMembreDernière intervention11 mai 2006
-
16 févr. 2005 à 20:20
delphialex
Messages postés3Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention21 mars 2005
-
21 mars 2005 à 10:24
Salut,
Dans le SDK de Winsock il y a un exemple d'un LSP que je voudrais réutiliser pour créer un programme capable de remplacer des mots déterminés quand ils apparaissent dans un navigateur ou quand ils arrivent par mail
en lecture je n'ai pas de problème, il suffit que je lise le buffer qui se trouve dans la fonction WSPRecv() pour voir défiler toutes les données récues du web par toute application windows, mais je commence à avoir des problèmes quand j'essaye de modifier ce buffer
d'ailleurs je peux même pas le modifier car j'ai l'impression qu'il est en perpétuelle évolution et voici la preuve:
Je m'attendais à ce que les deux fichiers soient identiques mais ils ne sont pas identique
Qu'est ce qui cloche à votre avis ?
Merci pour toutes les réponses
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 19 févr. 2005 à 17:55
Salut,
Toutes ces fonctions, utilisent des fonctions pour les chaines de caracteres.
Ce que tu pourrais faire, c'est rajouter un \0 a la fin de ton buffer, et utiliser ces fonctions, mais si un \0 se trouve au milieu du buffer, ton code traitera uniquement la 1ere moitier du buffer.
C'est pour ca que je pense qu'il faut utiliser un pointeur pour parcourir du début a la fin ton buffer, tester si l'on pointe sur le bon mot avec memcmp() et remplacer le mot si on le trouve.
Je pense aussi que pendant les tests ils faut se limiter a 1 mot a changer (et a remplacer par un mot de la meme taille: toto => dodo etait une bonne idée) afin de ne pas rendre le code trop compliqué.
Pourrait tu mettre un zip sur le net avec le code du lsp directement copié du SDK de Winsock ? (le code non modifié).
varbool
Messages postés20Date d'inscriptionlundi 24 mai 2004StatutMembreDernière intervention11 mai 2006 16 févr. 2005 à 20:47
Si vous voulez voir à quoi ca a l'air vous pouvez telecharger ce fichier:
http://www.ifrance.com/varbool/LSP.zip et suivre ces étapes :
1) Editez Makefile et remplacez "C:\WINNT\system32" par le chemin de votre répertoire system32
Compilez le projet pour générer votre LSP (lsp.dll sera crée dans system32)
Copiez ces fichiers dans votre rep system32 : sporder.Dll sporder.Exe et inst_lsp.exe
Exécutez "System32\inst_lsp.exe" (LSP est installé)
Ouvrez votre navigateur web et à ce moment là deux fichiers seront créés dans le C et contiendront toutes les données récues par le navigateur
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 févr. 2005 à 02:50
Salut,
Tu traites le contenu du buffer comme si il contenait des chaines de caracteres.. alors qu'il n'en contient pas (sauf exeption).
Il faut donc eviter d'afficher le buffer avec %s, ou d'appeler strlen() sur ce buffer.
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 févr. 2005 à 16:32
Salut,
Ben rien ne dis qu'il contient des chaines de caracteres. Meme pour les protocoles qui utilisent du texte (smtp, pop3, http, etc..) les commandes se terminent en général par \n ou \r\n, aucun \0 !
Pour manipuler un buffer, je pense qu'il faudrait savoir la taille des données contenues dans le buffer (car InternalBuffer[0].len c'est la taille du buffer, pas des données qu'il contient, a moins que je me trompe). Ensuite pour écrire ce buffer dans un fichier il suffirait de faire un fwrite() sur le bon nombre d'octets.
varbool
Messages postés20Date d'inscriptionlundi 24 mai 2004StatutMembreDernière intervention11 mai 2006 18 févr. 2005 à 19:32
Merci aardman
Je viens d'essayer ton conseil mais le contenu des deux fichiers deumeure toujours different
FILE *stream;
char* buffer4 = new char[InternalBuffers[0].len];
memcpy(buffer4, InternalBuffers[0].buf,InternalBuffers[0].len);
Je résume un peut la situation...
J'ai un buffer
Je veux modifier ce buffer de manière à remplacer toutes les occurrences de "toto" par "dodo"
J'ai écrit une fonction Replace() que j'ai bien testée dans un projet à part (elle marche très bien)
Je copie le buffer avec memcpy
Je passe la copie à Replace()
Je récupère le résultat et je l'affecte au buffer d'origine et là tout casse Internet Explorer devient instable et l'affichage des pages catastrophique
Je commence mes investigations...
Test 1:
J'ai viré Replace() et j'ai appliqué juste toupper() au buffer
Résultat : IE est stable les pages s'affichent bien et le texte est en majuscule
Conclusion : il est possible de modifier ce même buffer pour avoir une répercussion directe sur IE
Test 2:
(C'est celui que j'ai collé plus haut)
Je copie le buffer
J'imprime le buffer dans un fichier
J'imprime la copie dans un autre fichier
Et je compare les deux fichiers
Résultat de la comparaison les deux fichiers ne sont pas identique
Conclusion : Le buffer a mystérieusement été modifié entre le moment ou je l'ai copié et le moment ou je l'ai imprimé dans le fichier d'où ma question :
Comment modifier un buffer qui est tout le temps en train d'évoluer ?
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 18 févr. 2005 à 19:47
Salut,
Mais c'est pas le buffer qui est tout le temp entrain d'evoluer, c'est toi qui n'en écrit qu'une partie.
Tu utilises encore un strlen lorsque tu écris dans test1.txt, la bonne facon pour écrire dans un fichier l'etat du buffer c'est celle que tu utilises pour écrire dans le fichier test2.txt.
Je pense que le prob vient de ta fonction Replace(), peut tu mettre son code ici ?
il faudrait faire une fonction qui prend en param un pointeur sur un buffer, et la taille du buffer, et qui remplace toutes les occurences de "toto" par "dodo".
varbool
Messages postés20Date d'inscriptionlundi 24 mai 2004StatutMembreDernière intervention11 mai 2006 19 févr. 2005 à 17:31
Salut aardman,
Tu a raison il faut pas que je manipule le buffer avec les fonctions pour les strings, dans Remplacer() j'ai parcouru le buffer mot à mot avec strtok()
Qu'est ce que tu me conseille à la place ?
Les fonctions :
int Remplacer(char *Sujet, char *A, const char *B)
{
char FIN[300];
int I;
int J;
int K;
for (I=0; Sujet[I]; I++)
{
if (Sujet[I]==A[0])
{
for (J=1; A[J] && (A[J]==Sujet[I+J]); J++);
if (A[J]=='\0') /* TROUVE ! */
{
for (K=0; Sujet[K+I+J]; K++)
FIN[K]=Sujet[K+I+J];
FIN[K]='\0';
for (K=0; B[K]; K++,I++)
Sujet[I]=B[K];
for (K=0; FIN[K]; K++)
Sujet[I+K]=FIN[K];
Sujet[I+K]='\0';
I--;
}
}
}
return 0;
}
(Cette fonction je l'ai trouvée dans CppFrance)
P_MYWORD SearchWordQuick(P_MYWORD tab,int nbWord,const char *word)
{
int f;
int r;
if(nbWord <= 0)
{
return NULL;
}
f = 1;
while((f<<=1) < nbWord); //ici un point-virgule !
f>>=1;
r = 0;
do
{
int s;
r += f;
if(r >= nbWord)
{
r -= f;
}
else
{
s = strcmp(word,(tab + r)->name);
if(s == 0)
{
return tab + r;
}
else if(s < 0)
{
r -= f;
}
}
}while(f >>= 1);
return strcmp(word,(tab + r)->name)
?
(NULL) // n'existe pas dans le tableau
:
(tab + r); // existe dans le tableau
}
delphialex
Messages postés3Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention21 mars 2005 14 mars 2005 à 17:06
Bonjour,
J'ai visual c++ 6.0 version pro, je viens d'installer ton lsp modifié et les fichiers test_1
et test_2 ne sont pas créés (j'ai suivit la démarche dont tu parlais)
As tu une idée d'ou ca peut venir?
De plus comment puis je maintenant desinstaller ton lsp ?
(je ne peux plus supprimer le fichier lsp.dll)
varbool
Messages postés20Date d'inscriptionlundi 24 mai 2004StatutMembreDernière intervention11 mai 2006 15 mars 2005 à 14:37
Salut,
Tu a copier sporder.Dll sporder.Exe inst_lsp.exe et lsp.dll dans system32 ?
Tu a executé instlsp.exe ?
si oui que se passe t il quand tu ouvre IE ?
erreur dns ?
pour desinstaller lsp il suffit dexecuter instlsp.exe une seconde fois
delphialex
Messages postés3Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention21 mars 2005 15 mars 2005 à 17:23
Bonjour,
Bien je n'ai pas de de fichier sporder.dll ni sporder.exe.
oui j'ai executé instlsp.exe
quand j'ouvre ie rie nde particulier se passe tout marche bien mais
je n'ai pas les fihiers de test de créés.
delphialex
Messages postés3Date d'inscriptionjeudi 10 mars 2005StatutMembreDernière intervention21 mars 2005 21 mars 2005 à 10:24
Bonjour,
ca marche toujours pas : aucun fichier de test créé, j'ai refait toute la manipulation,
j'ai placé en plus ton fichier sporder.dll mais il manque toujours le fichier sporder.exe.
de plus si je n'ai pas les droits pour effacer je ne les ai pas non plus pour renommer.