Problème sauvegarde de fichier

sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004 - 26 févr. 2004 à 10:03
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 26 févr. 2004 à 16:25
Bonjour à tous!
Voila j'essaie de sauvegarder un fichier txt bloc note sans passer par fichier enregister sous ect ..., mais j'ai quelque soucies.
En fait tout à l'air de bien se dérouler quand je sauvegarde. Sous un nouveau nom de fichier il me créé bien mon fichier mais malheureusement il est vide. Idem pour fichier existant!
Cela ne viendrai t il pas de GetDlgItemText
J ai essayer aussi avec SetWindowText.
Quelqu'un peut t'il m'éclairer?
Voila le Code de la fonction SauverSous:

OPENFILENAME SauverFichierSous()
{
HANDLE Fichier;
HWND hNote = FindWindow("NotePad", 0);
HWND hEdit = GetDlgItem(hNote, 0x0000000F);
OPENFILENAME ofn;

char NomDuFichier[MAX_PATH] = "";

char NomFichier[MAX_PATH] = "";
SECURITY_ATTRIBUTES Secu;

Secu.nLength = sizeof(SECURITY_ATTRIBUTES);
Secu.lpSecurityDescriptor = NULL;
Secu.bInheritHandle = NULL;

ZeroMemory(&ofn, sizeof(ofn));

ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hNote;
ofn.lpstrFilter = "Fichier Texte (*.txt)\0*.txt\0 Fichier C (*.c)\0*.c\0 Fichier C++ (*.cpp)\0*.cpp\0 Fichier Header (*.h)\0*.h\0 Tous les fichiers (*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NomFichier;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrFile = NomDuFichier;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

if(GetSaveFileName(&ofn))
{
Fichier = CreateFile(NomFichier,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,&Secu, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
char TextBuffer[65000];

if(Fichier != INVALID_HANDLE_VALUE)
{
DWORD Read;
int TailleBuffer = SendDlgItemMessage(hEdit,0,WM_GETTEXTLENGTH ,0,0) + 1;
// SetWindowText(hEdit,TextBuffer);
GetDlgItemText(hEdit,0,TextBuffer,TailleBuffer);
WriteFile(Fichier,TextBuffer,TailleBuffer,&Read,NULL);
SetWindowText(hNote,"Document Sauvegardé");
}
CloseHandle(Fichier);
}
return ofn;
}

Merci d'avance ;)

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 févr. 2004 à 10:23
SendDlgItemMessage !!! tu as regarde dans MSDN les params attendus ???
idem pour GetDlgItemText.

Remplace par SendMessage et GetWindowText.

ciao...
BruNews, Admin CS, MVP Visual C++
0
sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 11:18
Ok je vais essayer comme ca.

Merci.
0
sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 13:03
Encore désolé mais je ne vois vraiment po.
J'ai fait comme tu m'as (enfin je crois). J ai été voir sur msdn.
Il y a un exemple, je m'en suis inpiré mais ca marche pas!
Tu pourrais po me filer un ptit indice?
Voila le nouveau code: :(

OPENFILENAME SauverSousFichier()
{
HANDLE Fichier;
HWND hNote = FindWindow("NotePad", 0);
HWND hEdit = GetDlgItem(hNote, 0x0000000F);

OPENFILENAME ofn;

char NomDuFichier[MAX_PATH] = "";

char NomFichier[MAX_PATH] = "";
SECURITY_ATTRIBUTES Secu;

Secu.nLength = sizeof(SECURITY_ATTRIBUTES);
Secu.lpSecurityDescriptor = NULL;
Secu.bInheritHandle = NULL;

ZeroMemory(&ofn, sizeof(ofn));

ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hNote;
ofn.lpstrFilter = "Fichier Texte (*.txt)\0*.txt\0\ Fichier C (*.c)\0*.c\0\ Fichier C++ (*.cpp)\0*.cpp\0\ Fichier Header (*.h)\0*.h\0\ Tous les fichiers (*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NomFichier;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrFile = NomDuFichier;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

if(GetSaveFileName(&ofn)){
Fichier = CreateFile(NomFichier,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,&Secu, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

PSTR TextBuffer;
if(Fichier != INVALID_HANDLE_VALUE){ DWORD Read;
int TailleBuffer = GetWindowTextLength(hEdit);
TextBuffer = (PSTR) VirtualAlloc((LPVOID) NULL,
(DWORD) (TailleBuffer + 1), MEM_COMMIT,
PAGE_READWRITE);
GetWindowText(hEdit, TextBuffer, TailleBuffer + 1);

WriteFile(Fichier,TextBuffer,TailleBuffer,&Read,NULL);
SetWindowText(hNote,"Document Sauvegardé");
}
CloseHandle(Fichier);

VirtualFree(TextBuffer, 0, MEM_RELEASE);
}
return ofn;
}

merci!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 févr. 2004 à 13:15
SECURITY_ATTRIBUTES ne me semble pas utile ici, passe 0 a CreateFile.
Separe un peu tout cela, trop brouillon. Mets une func qui recup le nom de fichier choisi a part.

Ensuite tu mets un MessageBox(par exemple) a chaque etape pour verif reussite, recup texte, alloc memoire, etc...

Une piste, VirtualAlloc me semble avoir un prob sur 3 eme param.

ciao...
BruNews, Admin CS, MVP Visual C++
0

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

Posez votre question
sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 14:06
Me revoila! :(
ca marche toujours po.
Donc j ai bien fait les tests nomfichier et nomdufichier
je récupère bien les bonne valeur (nomfichier et emplacementfichier)
Ensuite j'ai viré SECU et remplacer par 0.
Pour ce ki est du 3eme param de virtualalloc, je vois po tres bien ce ke tu veux dire?
Tu aurais pas une idée sur le pb ?
Pareil si je veux afficher la taille (Int
TailleBuffer) je peux pas avec un MessageBox?
Désolé si cela te semble bete comme question mais je débute dans la prog api .

OPENFILENAME SauverSousFichier(bool &sauve)
{
HANDLE Fichier;
HWND hNote = FindWindow("NotePad", 0);
HWND hEdit = GetDlgItem(hNote, 0x0000000F);

PSTR TextBuffer;
OPENFILENAME ofn;

char NomDuFichier[MAX_PATH] = "";
char NomFichier[MAX_PATH] = "";

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hNote;
ofn.lpstrFilter = "Fichier Texte (*.txt)\0*.txt\0 Tous les fichiers (*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NomFichier;
ofn.nMaxFileTitle = MAX_PATH;
ofn.lpstrFile = NomDuFichier;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

if(GetSaveFileName(&ofn))
{
Fichier = CreateFile(NomFichier,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,0,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(Fichier != INVALID_HANDLE_VALUE)
{
DWORD Read;

int TailleBuffer = GetWindowTextLength(hEdit);

TextBuffer =
(PSTR)VirtualAlloc(NULL,TailleBuffer+1,MEM_COMMIT,PAGE_READWRITE);

MessageBox(hEdit,NomFichier,"NomFichier",0); // Test nom fichier
MessageBox(hEdit,NomDuFichier,"NomduFichier",0); // Test emplacement fichier

GetWindowText(hEdit, TextBuffer, TailleBuffer + 1);

WriteFile(Fichier,TextBuffer,TailleBuffer,&Read,NULL);
// SetWindowText(hNote,"Document Sauvegardé");
}
CloseHandle(Fichier);
VirtualFree(TextBuffer, 0, MEM_RELEASE);
}
return ofn;
}

Merci!
0
sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 14:10
J ai également essayer aver une taille buffer fixe mais ca marche pas ! :(
0
sleeper41 Messages postés 13 Date d'inscription mardi 13 janvier 2004 Statut Membre Dernière intervention 26 février 2004
26 févr. 2004 à 14:35
Désolé encore uine autre chise quand j essaie d afficher mon TextBuffer avec MessageBox(hEdit,TextBuffer,"Buffer",0); bah je n'ai rien! Je ne comprend pas pourquoi pourtant j ai bien mis un GetWindowText.
:(
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 févr. 2004 à 16:25
Faut RESERVEr tes pages memoire, ajoute le OR sur le 3eme param de VirtualAlloc.

ciao...
BruNews, Admin CS, MVP Visual C++
0
Rejoignez-nous