Problem mit GetOpenFileName in DLL
-
Hallo,
ich habe ein Problem mit der Win-API Funktion GetOpenFileName. Leider habe ich relativ wenige Anhaltspunkte woher das Problem kommen könnte, aber vielleicht hat hier ja jemand eine Idee.
Hintergrund: Ich erstelle eine 32-bit DLL, welche mittels Injection in eine 32-bit Anwendung geladen wird. Die Anwendung selbst ist closed source, ich kann nur die DLL verändern.
Jetzt will ich in einem Callback dort die Funktion GetOpenFileName aufrufen. Das klappt soweit auch, der Fileopen Dialog kommt und ich kann eine Datei auswählen.
Jetzt aber das komische: Wenn ich eine Datei ausgewählt habe (entweder per Doppelklick oder per "Open" button), kann ich in der Original Anwendung danach nicht mehr speichern. Sobald ich auf den "Speichern" button klicke erhalte ich eine Fehlermeldung ("Fehler in Plugin", wobei diese Meldung Anwendungs-Spezifisch ist).
Wenn ich dagegen den Fileopen Dialog schließe (per "Cancel" button z.B.) kann ich ganz normal speichern.
Das Laden an sich scheint also irgendwelche Interna der Anwendung zu "blockieren". Ich weiß dass das sehr vage ist, aber hat vielleicht jemand eine Idee woran das liegen könnte? Mein Code für den Fileopen Dialog sieht so aus:
void fileopen_callback() { OPENFILENAME ofn = { 0 }; std::wstring file_name(4096, '\0'); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = parent_window; ofn.lpstrDefExt = L".ini"; ofn.lpstrFile = &file_name[0]; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = file_name.size(); ofn.lpstrFilter = L"Textfile (*.txt)\0*.txt\0";; ofn.nFilterIndex = 1; ofn.lpstrInitialDir = L"Some directory"; ofn.lpstrTitle = L"File open"; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); std::cout << "done\n"; }
Wie man sehen kann mache ich noch nicht mal was mit dem Ergebnis des Dialogs, trotzdem tritt der Fehler auf.
Was ich schon getestet habe:
- Das ganze in einem eigenen Thread starten hat nichts gebracht.
- Die ASCII Version (
GetOpenFileNameA
mitOPENFILENAMEA
) anstatt derW
-Versionen zu verwenden hat auch nichts gebracht. - Habe auch verschiedene Flag-Kombinationen getestet, ohne Erfolg.
Jemand eine Idee?
-
Das "Current directory" (GetCurrentDirectory) vor dem Aufruf speichern und nach dem Aufruf zurücksetzen.
-
vorschlag_ schrieb:
Das "Current directory" (GetCurrentDirectory) vor dem Aufruf speichern und nach dem Aufruf zurücksetzen.
Omg ich versuche seit einer Woche das zu fixen und dann ist die Lösung so einfach
Vielen Dank, das funktioniert perfekt