Win-CALLBACK Funktion in einer Dll
-
Servus,
meine Dll gibt auf Anfrage des Hauptprogramms einen Funktionszeiger auf die in der Dll beschriebene Callback Funktion (von einer Property Sheet Page, die in einer Resource, ebenfalls in der Dll liegend definiert wird) zurück. Leider scheint das nicht richtig zu funktionieren. Die Seite, die angezeigt wird, ist stets leer. Muss ich bei der Funktionsdeklaration der CALLBACK Funktion etwas beachten? Oder bei der Resource? Es wird als C++ Projekt compiliert.
Danke für Antworten.
-
Error code scheint (mit vereinfachtem code) 1814 zu sein. MSDN spuckt dazu aus:
ERROR_RESOURCE_NAME_NOT_FOUND
The specified resource name cannot be found in the image file.Kann ich mir aber nicht vorstellen, die res ist korrekt eingebunden.
-
das kann am 'hmodule' parameter von LoadResource() liegen. da muss das module handle von dem binary rein, dass die ressourcen enthält (also entweder das der dll oder das der exe, die sind unterschiedlich)
-
Muss ich LoadResource () verwenden? Die resource liegt mir doch im Quellcode vor und wird zusammen mit dem Rest der dll kompiliert. Bei meinen bisherigen Experimenten mit Resourcen (jedoch nur bei exe-files) hat das auch immer ohne spezielles laden funktioniert.
Mit MAKEINTRESOURCE(IDD_DIALOG1) einfach angeben...
-
N00Bie schrieb:
Muss ich LoadResource () verwenden? Die resource liegt mir doch im Quellcode vor und wird zusammen mit dem Rest der dll kompiliert. Bei meinen bisherigen Experimenten mit Resourcen (jedoch nur bei exe-files) hat das auch immer ohne spezielles laden funktioniert.
LoadResource() o.ä. wird dann 'heimlich' von deiner library benutzt (ist das mfc oder sowas?). ich weiss nicht ob's da spezielle tricks gibt (bestimmt gibts die!!) aber du könntes eventuell versuchen die dlg-resource und die dazugehörige klasse in ein modul zu linken (z.b. alles in die dll)
-
Ich spendier jetzt mal ne Runde Code:
menu.h
#ifndef _MENU_H_ #define _MENU_H_ extern HINSTANCE hInst; int HookProc(WPARAM wParam,LPARAM lParam); BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); #endifmenu.cpp
#include <windows.h> #include <prsht.h> #include <shlwapi.h> #include "../resource/resource.h" #include "menu.h" int HookProc(WPARAM wParam,LPARAM lParam) { if (NULL == CreateDialog (hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0, DialogProc)) { char text[30]; wsprintf (text, "%d", GetLastError ()); MessageBox (0, text, "Error!", MB_OK); } return 0; } BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: TranslateDialogDefault(hwnd); return (TRUE); case WM_DESTROY: case WM_CLOSE: EndDialog (hwnd, 0); // Zu Testzwecken eingefügt return (TRUE); case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_LIST2: break; case BU_SAVE: break; case ED_PASSWORD: break; case RB_NONE: break; case RB_RC4: break; case RB_BLOWFISH: break; default: break; } return (FALSE); /*case WM_NOTIFY: switch (((NMHDR FAR *) lParam)->code) { case PSN_SETACTIVE: break; case PSN_KILLACTIVE: SetWindowLong (hwnd, DWL_MSGRESULT, (LONG) FALSE); break; case PSN_APPLY: SetWindowLong (hwnd, DWL_MSGRESULT, (LONG) PSNRET_NOERROR); break; default: break; }*/ break; } return (FALSE); }resource.h
//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by resource.rc // #define IDD_DIALOG1 101 #define IDC_LIST2 1003 #define RB_NONE 1004 #define RB_RC4 1005 #define RB_BLOWFISH 1006 #define ED_PASSWORD 1008 #define PROG_SAFETY 1009 #define BU_SAVE 1010 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1012 #define _APS_NEXT_SYMED_VALUE 101 #endif #endifresource.rc
//Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 282, 205 STYLE /*DS_MODALFRAME | */WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_CHILD CAPTION "Dialog" FONT 8, "Tahoma" BEGIN LISTBOX IDC_LIST2,20,13,215,78,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP CONTROL "keine",RB_NONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP, 27,111,33,10 CONTROL "Rc4",RB_RC4,"Button",BS_AUTORADIOBUTTON | WS_GROUP,27, 124,29,10 CONTROL "Blowfish",RB_BLOWFISH,"Button",BS_AUTORADIOBUTTON | WS_GROUP,27,138,57,10 EDITTEXT ED_PASSWORD,131,110,102,12,ES_PASSWORD | ES_AUTOHSCROLL CONTROL "Progress1",PROG_SAFETY,"msctls_progress32",PBS_SMOOTH | WS_BORDER,130,145,103,13 LTEXT "Sicherheit:",IDC_STATIC,130,131,45,8 PUSHBUTTON "Speichern",BU_SAVE,21,178,48,13 GROUPBOX "Verschlüsselung:",IDC_STATIC,21,98,91,67 GROUPBOX "Passwort:",IDC_STATIC,127,98,112,67 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE BEGIN IDD_DIALOG1, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 275 TOPMARGIN, 7 BOTTOMMARGIN, 198 END END #endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END 2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED<EDIT> Was vergessen. </EDIT>
-
N00Bie schrieb:
if (NULL == CreateDialog (hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0,....dieses 'hInst' ist der knackpunkt. wenn die dlgressource in der exe steckt, dann kannste dafür '(HINSTANCE)GetModuleHandle(NULL)' einsetzen. steckt die dlgresource in der dll, dann nimm den rückgabewert vom 'LoadLibrary()'-aufruf, mit dem du die dll lädst. ist der aufruf von 'CreateDialog()' selber in der dll, dann nimm den ersten parameter (hinstDLL), mit dem die 'DllMain' aufgerufen wird
-
Die resource steht wie der restliche code auch in der dll.
hInst bekomm ich über die dll main:dllmain.cpp
#include <windows.h> #include "menu.h" #include "dll.h" /*--------------------------------------------------------------------------*/ /* Globals */ /*--------------------------------------------------------------------------*/ HINSTANCE hInst; /*--------------------------------------------------------------------------*/ /* Hauptfunktionen */ /*--------------------------------------------------------------------------*/ BOOL APIENTRY DllMain (HINSTANCE hInstDll /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { hInst = hInstDll; switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; }
-
N00Bie schrieb:
Die resource steht wie der restliche code auch in der dll.
hInst bekomm ich über die dll main:
dllmain.cppdas sieht ja so schlecht nicht aus (obwohl's wohl besser wär, hInst bei DLL_PROCESS_ATTACH zu initialisieren). ich kann so nix schlimmes erkennen. musste noch etwas debuggen, z.b. hInst ausgeben, eventuell die datei ausgeben (GetModuleFilename()), usw. von wo wird diese 'HookProc' aufgerufen? IDD_DIALOG1 überall 101??? musste alles mal testen. und etwas abwarten...vielleicht kann dir jemand anderes mehr dazu sagen
-
Hmm, habs mal testweise nicht mit g++ sondern mit dem gcc kompiliert (natürlich leicht angepasst). Hier funktioniert es plötzlich, obwohl die oben besprochenen Stellen identisch sind. Könnte es ein Linkerproblem sein?
-
So, Lösung steht hier:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-779596.html#779596