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 fontsize und 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


Anmelden zum Antworten