GetOpenFileName



  • hallo leute,

    warum macht der code hier nicht was er soll 😕

    .386
    .model flat, stdcall
    option casemap:none
    
    include /masm32/include/windows.inc
    include /masm32/include/comdlg32.inc
    include /masm32/include/kernel32.inc
    include /masm32/include/user32.inc
    
    includelib /masm32/lib/comdlg32.lib
    includelib /masm32/lib/kernel32.lib
    includelib /masm32/lib/user32.lib
    
    m2m MACRO M1, M2
    push M2
    pop M1
    ENDM
    
    ZeroMem macro dest, len
    mov ebx, dest
    mov ecx, len
    L1:
    mov byte ptr [ebx+ecx], 0
    loop L1
    endm
    
    .const
    nMaxFile equ 260
    
    .data
    szFilter db "Cursor (*.cur)",0,"*.cur",0,0
    
    .data?
    szFile db nMaxFile dup(?)
    ofn OPENFILENAME<>
    
    .code
    
    _start:
    
    ZeroMem offset ofn, sizeof ofn
    
    mov ofn.lStructSize, sizeof ofn
    m2m ofn.lpstrFile, offset szFile
    mov ofn.lpstrFile[0], 0
    mov ofn.nMaxFile, nMaxFile
    m2m ofn.lpstrFilter, offset szFilter
    mov ofn.nFilterIndex, 1
    mov ofn.Flags, OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
    
    invoke GetOpenFileName, addr ofn
    .if eax!=0
    invoke MessageBoxA, 0, addr ofn.lpstrFile, 0, 0
    .endif
    invoke ExitProcess,0
    
    end _start
    

    eigentlich sollte ein Datei-Öffnen-Dialog erscheinen (tut er auch), und der das Ergebnis/der Dateiname in einer MsgBox angezeigt werden. eax != 0 bedeutet, dass der aufruf erfolgreich war, jetzt sollte der dateiname in ofn.lpstrFile stehen, die msgbox zeigt aber immer einen leeren string an, woran liegts?



  • Die MessageBoxA braucht als zweiten Parameter nicht die Adresse von "ofn.lpstrFile", sondern den "Betrag" von "ofn.lpstrFile".
    "ofn.lpstrFile" enthält nach erfolgreichem Aufruf ein Zeiger zum Text. Probier mal so (falls das geht) :

    invoke MessageBoxA, 0, ofn.lpstrFile, 0, 0
    


  • +gjm+ schrieb:

    Die MessageBoxA braucht als zweiten Parameter nicht die Adresse von "ofn.lpstrFile", sondern den "Betrag" von "ofn.lpstrFile".
    "ofn.lpstrFile" enthält nach erfolgreichem Aufruf ein Zeiger zum Text. Probier mal so (falls das geht) :

    invoke MessageBoxA, 0, ofn.lpstrFile, 0, 0
    

    ne so funktionierts nicht.



  • president evil schrieb:

    ne so funktionierts nicht.

    Das ist keine Fehlerbeschreibung...



  • _matze schrieb:

    president evil schrieb:

    ne so funktionierts nicht.

    Das ist keine Fehlerbeschreibung...

    es erscheint weiterhin ein leerer string in der messagebox.

    wenn ich dasselbe programm in C schreibe, klappt alles. bin mir da auch mit dem zeromem macro nicht so ganz sicher. in C verwendet man ZeroMemory (ein macro für, ich glaube, memset). wie kann ich die funktion memset in asm aufrufen? wenn ich die msvcrt lib+inc einbinde kommt trotzdem der fehler "unknown symbol: memset" (oder so ähnlich).



  • Oh, sehe ich jetzt erst. Nimm mal folgende Zeile raus:

    (...)
    mov ofn.lStructSize, sizeof ofn
    m2m ofn.lpstrFile, offset szFile
    ; mov ofn.lpstrFile[0], 0                  ; <- die hier
    mov ofn.nMaxFile, nMaxFile
    m2m ofn.lpstrFilter, offset szFilter
    (...)
    invoke MessageBoxA, 0, ofn.lpstrFile, 0, 0 ; <- soll so bleiben
    

    Ist irgendwie unlogisch, "ofn.lpstrFile" zu initialisieren und gleich danach wieder zu verändern.



  • +gjm+ schrieb:

    Oh, sehe ich jetzt erst. Nimm mal folgende Zeile raus:

    (...)
    mov ofn.lStructSize, sizeof ofn
    m2m ofn.lpstrFile, offset szFile
    ; mov ofn.lpstrFile[0], 0                  ; <- die hier
    mov ofn.nMaxFile, nMaxFile
    m2m ofn.lpstrFilter, offset szFilter
    (...)
    invoke MessageBoxA, 0, ofn.lpstrFile, 0, 0 ; <- soll so bleiben
    

    Ist irgendwie unlogisch, "ofn.lpstrFile" zu initialisieren und gleich danach wieder zu verändern.

    besten dank, so klappts! hatte das falsch aus dem C-code übertragen. dort muss man ofn.lpstrFile[0] = '\0'; schreiben, da string sonst zur initialisierung verwendet wird.

    msdn schrieb:

    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    // use the contents of szFile to initialize itself.


Anmelden zum Antworten