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:
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.
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;
}
}
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.