Dies ist eine Funktion, um eine Datei-Dialog in Windows zu öffnen und eine Zeichenfolge mit dem Dateinamen zurück:Wie eine Zeichenfolge aus GetOpenFileNameA zurückzukehren
#include <windows.h>
#include <commdlg.h>
#include <string.h>
char* openFileDlg(char FileTypes[]);
char* openFileDlg(char FileTypes[]){
OPENFILENAME ofn;
char szFile[260];
HWND hwnd;
HANDLE hf;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
strcpy(ofn.lpstrFilter,FileTypes);
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if(GetOpenFileNameA(&ofn)){
char *toReturn;
sprintf(toReturn,"%s",ofn.lpstrFile);
return toReturn;
}
else{
return NULL;
}
}
Wenn ich diese Funktion aufrufen und eine Datei öffnen, wird der Prozess beendet und gibt den Wert 3 zurück (was bedeutet, dass ein Fehler vorliegt). Wie kann ich dies tun, dass diese Funktion eine Zeichenfolge mit dem Pfad der ausgewählten Datei zurückgibt?
Edit: Ich habe meinen Code dies geändert und es funktioniert immer noch nicht:
#include <windows.h>
#include <commdlg.h>
#include <string.h>
void openFileDlg(char *toReturn[],char FileTypes[]);
void openFileDlg(char *toReturn[],char FileTypes[]){
OPENFILENAME ofn;
/*
Code for the settings of the GetOpenFileNameA, irrelevant in this question.
If you really need to know what's here, look at the code above.
*/
if(GetOpenFileNameA(&ofn)){
strcpy(*toReturn,ofn.lpstrFile);
}
else{
sprintf(*toReturn,"");
}
}
Ich soll auch sagen, dass, wenn ich die Box-Schaltfläche in der Datei-Dialog Abbrechen drücken, anstatt eine der Auswahl Datei, es funktioniert gut. Nach einigen Tests habe ich festgestellt, dass es die Zeile strcpy(*toReturn,ofn.lpstrFile);
ist, die den Fehler verursacht.
Wenn GetOpenFileNameA() macht das Programm beenden, dann müssen Sie das Gerät reparieren lassen. Beginnen Sie mit den benutzerdefinierten Shell-Erweiterungen, fragen Sie nach Hilfe auf superuser.com –
strcpy (ofn.lpstrFilter, FileTypes); Hier versuchen Sie, auf Nulladresse zu schreiben, aber es gibt viele weitere Fehler –
'ofn.hwndOwner = hwnd;' hwnd ist nicht initialisiert, tun Sie nur 'ofn.hwndOwner = NULL;'. – Sergio