Modaler Dialog in DLL

PBecker

Grünschnabel
Hallo, miteinander,

da bin ich noch ganz neu in diesem Forum, und schon wälze ich ein Problem, für das ich auch nach intensiver Suche noch keine Lösung gefunden habe.

Das Problem:

Ich habe mit VB6 eine Applikation geschrieben, die ich um Funktionen aus einer selbst zu schreibenden DLL (in C++) ergänzen möchte. Kernstück der DLL ist eine Funktion, die in einem modalen Standard-Dialog einen Dateinamen abfragt. Der Aufruf des modalen Dialoges GetOpenFileName in der DLL führt zu einer Access Violation in der COMMDLG32.DLL.
Dieselbe Utility, in ein minimales C++-Hauptprogramm eingebunden, funktioniert prächtig. Ich nehme daher an, dass es sich eher um ein Problem im VB-Bereich handelt.

Der Code:
Code:
{
OPENFILENAME OpenFilenameData;	 // control structure for dialog 'Open Filename'
char NewFilename[_MAX_PATH];
DWORD CommErrCode;
//MessageBox(hWndOwner,"Text in message box","Title",MB_OK);
NewFilename[0] = 0;
OpenFilenameData.lStructSize = sizeof(OpenFilenameData);
OpenFilenameData.hwndOwner = GetWindow(hWndOwner,GW_OWNER); // (siehe Microsoft KnowledgeBase)
OpenFilenameData.hInstance = NULL;
OpenFilenameData.lpstrFilter = NULL;
OpenFilenameData.nMaxCustFilter = 0;
OpenFilenameData.nFilterIndex = 0;
OpenFilenameData.lpstrFile = NewFilename;
OpenFilenameData.nMaxFile = sizeof(NewFilename) - 1;
OpenFilenameData.lpstrFileTitle = NULL;
OpenFilenameData.nMaxFileTitle = 0;
OpenFilenameData.lpstrInitialDir = NULL;
OpenFilenameData.lpstrTitle = "abc";
OpenFilenameData.Flags = 0;//OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST;
OpenFilenameData.nFileOffset = 0;
OpenFilenameData.nFileExtension = 0;
OpenFilenameData.lpstrDefExt = NULL;
OpenFilenameData.lCustData = NULL;
OpenFilenameData.lpfnHook = NULL;
OpenFilenameData.lpTemplateName = NULL;
flgSysResult = GetOpenFileName(&OpenFilenameData);
if ( flgSysResult == false ) {
CommErrCode = CommDlgExtendedError();
NewFilename[0] = 0;
}
}
Der Aufruf meiner DLL-Utility funktioniert zufriedenstellend. In der C++-Testumgebung kann ich das jederzeit nachvollziehen.
Die Zeile
OpenFilenameData.hwndOwner = GetWindow(hWndOwner,GW_OWNER);
lautete ursprünglich
OpenFilenameData.hwndOwner = hWndOwner;
wobei hWndOwner das Handle des VB-Formulars ist. Aufgrund eines Knowledge-Beitrages bei Bill Gates hatte ich diese Zeile geändert; es hat aber nichts geholfen.
Ganz offensichtlich habe ich eine Kleinigkeit übersehen, aber ich weiß nicht, welche...
Kann mir jemens den entscheidenden Tipp geben?
Vielen Dank vorab.
 
Übergibst Du denn von VB aus denn auch das HWnd als Parameter ?

Edit : im übrigen kannst Du Dir auch in VB die API 'GetOpenFileName' integrieren, dann hast Du es vielleicht einfacher.
 
Re: Modaler Dialog in DLL -- Problem gelöst

Na klar, hätte ich machen können; wäre auch einfacher, wenn es nur darum gegangen wäre. Aber die DLL-Utility soll ja noch etwas größer werden, und die Dateiabfrage ist nur der kleinste Teil davon.

Den Window-Handle hatte ich auch korrekt übergeben (ich hatte das auch mit NULL = nicht modaler Dialog = probiert, ging auch schief).

Aber gerade eben habe ich das Problem gefunden. Beim Copy-und-Paste hatte ich die Zeile
Code:
 OpenFilenameData.lpstrCustomFilter = NULL;
nicht mit übernommen. Da stand dann ein Zufallswert drin, der den Fehler ausgelöst hat.

War also einfach nur ein peinlicher Fehler....

Gruß Paul
 
Zurück