Handle für SetDlgItemText
-
Hallo Leute,
Ich versuche gerade WINAPI dll als ausgabe Interface für einem FORTRAN Programm zu programmieren.
Das Ausgabe-Interface besteht aus Dialog-Box, die ich anhand der Ressourcen Manager erstellt habe. Mein Ziel ist es mittels eine Void-Routine den String Variable von Fortran in einem WINAPI listbox zu zeigen.
Bis jetzt hat alles Funktioniert. Dialog ist einwandfrei gezeigt. Das Problem ist jetzt dass sobald ich ein String aus Fortran übergebe, sturtzt mein Programm ab. Aus dem Fehlermeldung bekomme ich Nr.1400(Ungültige Fensterhandle).
Hinweise zur DLL:
Das initiieren erfolgt mittels Thread.Das Fensterhandle HWND habe ich als Globalevariable gesetzt.
Für Übergabe zum Listbox habe ich in dem void zur String übergabe den SetDlgItemText(HWND,IDC_LIST1,text) genutzt.
Bisherige Massnahme:
Ein Übergabefehler ist auszuschliessen, da mittels "Printf" der String aus Fortran in konsole problemlos angezeigt werden kann.Ich habe versuch dem Fensterhandle in einem Struktur zu speichern und diese bei dem String übergabe zu rufen, leider sturzt das Programm ohne weitere Fehlermeldung ab.
Für eure Hilfe und Aufklärung bedanke ich mich sehr
Grüß
PS: Falls es Hilfreich würde kann ich den QCode hier wiedergeben
-
Hast Du den Ablauf mal im Debugger geprüft (inklusive Wertebelegungen von Variablen) ?
-
Da bin ich auch etwas Ratlos. Wenn ich die Dll aus VS debugge, mit dem Anweisung dass ein Exe ihm ausführen sollte, läuft der debugger nicht. Deshalb debugge ich nur über Fortran, die Werte ermittlung erfolge entweder über Printf oder GetLastError.
Laut der letzte Fehlermeldung liegt das problem in Fensterhandle. Also beim Fenster-init habe ich mein Dialog mittels einer Funktion in einer Struktur gespeichert. wie unten zu sehen ist
typedef struct { HWND dialog; int font; } GC; //Global var GC *gwxGC; HWD gwxDlg; //Mein Dialog Thread1(PVOID pvoid){ . . gwxGC = gwxgc(&gwxDlg, &fontsize); . } GC* gwxgc(HWND *dialog, int *fontsize) { GC *gc; gc = (GC *) malloc(sizeof(GC)); gc->dialog = *dialog; gc->font = *fontsize; return gc; }Und die Schreibtfunktion, die aus Fortran gerufen wird
void __stdcall //Aus F gerufen GWXSTRING(char *text, size_t text_LEN) { int i; HWND gwxmemDlg; GC *gcontext; printf("Text aus F: %s\n",text); gcontext = gwxGC; gwxmemDlg = gcontext->dialog; BOOL PARAM = SetDlgItemText(gwxmemDlg,IDC_LIST1,text); if (!PARAM) { LPVOID lpMsgBuf; LPVOID lpDisplayBuf; TCHAR szBuf[80]; DWORD dw = GetLastError(); LPTSTR lpszFunction; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); wsprintf(szBuf, "%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); MessageBox(NULL, szBuf, TEXT("Error"), MB_OK); exit(1); } }Ich bin newbie in C, Deshalb bin ich sehr dankbar für eure Aufklärung
Danke, und Grüß
-
Puhhh, was ein Code...die C'ler und ihre globalen Variablen
... also:
Lass mal hier...:GC* gwxgc(HWND *dialog, int *fontsize) { GC *gc; gc = (GC *) malloc(sizeof(GC)); gc->dialog = *dialog; gc->font = *fontsize; return gc; }...die Zeiger weg, also nur:
HWND dialog, int fontsizeund dann auch bei der Zuweisung ohne Dereferenzierungsoperator. Der Code ist -finde ich- durch die globalen Variablen und den lokalen Aufruf von malloc (man kann schnell das free vergessen, was ich in dem Code jetzt auch gar nicht finde...) sehr unübersichtlich. Muss es denn unbedingt dynamisch allokiert sein (
'gwxGC') ?PS: Du musst, bei Angabe des Flags FORMAT_MESSAGE_ALLOCATE_BUFFER an die Funktion FormatMessage den Buffer auch wieder freigeben (LocalFree), siehe hier: http://msdn2.microsoft.com/en-us/library/ms680582.aspx