comment enregistrer le fichier avec GetSaveFileName dans win32?
J'écris ce code pour obtenir le nom de fichier pour enregistrer mon fichier :
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.txt)#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";
GetSaveFileName(&ofn);
printf("the path is : %s\n", ofn.lpstrFile);
getchar();
return 0;
}
*.txt#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";
GetSaveFileName(&ofn);
printf("the path is : %s\n", ofn.lpstrFile);
getchar();
return 0;
}
All Files (*.*)#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";
GetSaveFileName(&ofn);
printf("the path is : %s\n", ofn.lpstrFile);
getchar();
return 0;
}
*.*#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
OPENFILENAME ofn;
char szFileName[MAX_PATH] = "";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = (LPCWSTR)L"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";
GetSaveFileName(&ofn);
printf("the path is : %s\n", ofn.lpstrFile);
getchar();
return 0;
}
";
ofn.lpstrFile = (LPWSTR)szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
ofn.lpstrDefExt = (LPCWSTR)L"txt";
GetSaveFileName(&ofn);
printf("the path is : %s\n", ofn.lpstrFile);
getchar();
return 0;
}
Mais la sortie est :
the path is : H
pourquoi ? Suis-je en train de faire quelque chose de mal ?
Je suis à l'aide de Visual Studio 2008 sur Windows 7.
+1 pour un exemple complet & bien formulé la question.
OriginalL'auteur hamed | 2012-05-04
Vous devez vous connecter pour publier un commentaire.
Cette ligne:
doit utiliser la large char version de printf.
Depuis le reste du code, y compris la
lpstrFile
valeur, est basé sur_TCHAR
, vous devez utiliser_tprintf
à la place:_tprintf(_T("the path is : %s\n"), ofn.lpstrFile);
1 Ce code est toujours dangereux, parce que la mémoire tampon est trop petit.
OriginalL'auteur Tony The Lion
La racine du problème est dans ces lignes:
Cela crée un tampon de MAX_PATH personnages, mais il raconte l'
GetSaveFileName
fonction que c'est un tampon de MAX_PATH large caractères. Cela est susceptible de se bloquer (ou silencieusement piétiner la mémoire) quand quelqu'un choisit un long nom de chemin d'accès.Le cadeau est le casting. Ne mentez pas à le compilateur ou les bibliothèques. Ils n'aiment pas ça, et ils vont toujours prendre leur revanche à la fin. Remplacer ces lignes avec ce:
Maintenant le nom du fichier sélectionné sera retourné comme une chaîne de caractères larges. Tony Le Lion réponse est bonne dans ce que vous avez besoin pour utiliser
wprintf
plutôt queprintf
pour imprimer des chaînes de caractères larges:Si vous avez besoin de la chaîne de caractères 8 bits au lieu de caractères, vous pouvez utiliser WideCharToMultiByte. Mais je voudrais juste coller avec le caractère large Api en général.
Jamais exprimées, sauf si vous savez exactement ce qu'il fait et pourquoi il est nécessaire dans votre cas particulier.
OriginalL'auteur Adrian McCarthy
Vous êtes à deux pas, c'est simple C pointeur de pile question.
Cette confond les tableaux et les pointeurs, vous déclarez un tableau sur la pile, mais ensuite modifier son adresse de mémoire à point à une chaîne vide dans la section de données. En d'autres termes, un dépassement de la mémoire tampon.
Il déclare un tableau de caractères sur la pile et l'initialise tous les éléments de terminateur null.
Espère que ça aide!
char szFileName[MAX_PATH] = ""
; ne pas créer un pointeur. Il initialiseszFileName[0] to '\0'
, c'est à dire le terminateur null.OriginalL'auteur David Chapman