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 _starteigentlich 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, 0ne 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 bleibenIst 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 bleibenIst 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.