schau mal bei den FASM-jungs im Forum, sicher gibts ein Macro für StdIn, ansonsten hilft vielleicht GetStdHandle, hab den Code mal soweit umgebaut, dass FASMW compiliert, die Zeile mit der Icon-Datei hab ich rausgelassen...
Spoiler anzeigen
Code
include 'win32ax.inc' ; you can simply switch between win32ax, win32wx, win64ax and win64wx here
.code
start:
;Parameter
invoke GetCommandLine;CommandLine
mov esi,eax;String zum splitten zum Source,esi
mov edi,tmpstr;hier rein kommt Pfad+Dateiname dieser Exe
mov ecx,0;Parameterzähler
mov edx,0;'"' Zähler(Strings dürfen nicht auseinander gerupft werden)
chschleife:;CmdLineSchleife
cmp byte[esi]," ";Prüfen ob nächster Parameter
je do1;Parameter
jmp do2;noch kein Parameter
weiter:;nach Funktionen
cmp ecx,4;Prüfen ob alle Parameter ausgelsen wurden
jne chschleife;Wenn nicht Schleife wiederholen
jmp nachcmdline;sonst hinter die ganzen Funktionen springen und starten
do2: ;Pfad+Datei auslesen
movsb;ein Byte verschieben
jmp weiter;zurück
do1: ;Parameter auslesen
cmp ecx,0;Prüfen ob es der erste Parameter ist
je makepar1;Wenn ja String schreiben
jmp makepar2;Sonst DWORD-Parameter schreiben
weiter2:;Zurück von den Funktionen
inc ecx;Parameterzähler erhöhen
jmp weiter;zurück
makepar1: ;Parameter 1(datei), string
mov edi,datei;Pointer zu String
makepar11:;innere Schleife zum String schreiben
movsb;Ein Byte verschieben
cmp byte[esi]," ";Prüfen ob es das Ende des Parameters war
jne makepar11;Schleife wiederholen
jmp weiter2;zurück
makepar2: ;Parameter 2-4, DWORD
mov edi,[cmdline+ecx*4];Adresse des Arrays+Index ########### Pointer/Wert?
movsd;ganzen DWORD schreiben
jmp weiter2;zurück
nachcmdline:;Nach dem Parameterzeugs:
;Aus dem Array die CommandLineWerte endlich auslesen (Variable datei wurde schon beschrieben)
mov eax,[cmdline+4]
mov [screenw],eax
mov eax,[cmdline+8]
mov [screenh],eax
mov eax,[cmdline+12]
mov [vidfps],eax
;Vorbereiten
invoke GetDC,0;Desktop-DC
mov [sourcedc],eax;in sourcedc schreiben und speichern
invoke CreateCompatibleDC,[sourcedc];für BitBlt brauch man eine Compatible DC
mov [destdc],eax;auch speichern
invoke CreateCompatibleBitmap,[sourcedc],[screenw],[screenh];CompatibleBitmap, hier kommen die Screenshots rein
mov [hbmp],eax;auch speichern
invoke SelectObject,[destdc],[hbmp];Compatible-DC mit -Bitmap verknüpfen
mov [flag],SRCCOPY;Flag für BitBlt erstellen
or [flag],CAPTUREBLT ;SRCCOPY und CAPTUREBLT
mov eax,[sltime];1000 nach eax (1s)
mov ebx,[vidfps];FPS nach ebx
mov edx,0;Für div
div ebx;um auszurechnen wie lange in der Schleife gewartet werden muss
;Schleife
schleife:
;Prüfen ob das Bild gleich das vorherige ist?
;invoke BitBlt,destdc,0,0,[screenw],[screenh],sourcedc,0,0,SRCINVERT
;
;Bild kopieren
invoke BitBlt,[destdc],0,0,[screenw],[screenh],[sourcedc],0,0,[flag]
cmp eax,0
je fehl
nfnow:
;und speichern (Video)
;Warten, um FPS zu regulieren
;
invoke Sleep,[sltime]
;Schleife wiederholen, wenn nicht Ende in StdIn steht
invoke GetStdHandle,buffer,1
cmp [buffer],"E" ;Exit
je ende
jmp schleife
fehl:;bei einem Fehler
invoke GetLastError;letzten Error -> eax
mov [fehler],eax ;BitBlt meldet Fehler
jmp nfnow;zurück
ende: ;bereinigen und beenden
invoke ReleaseDC,0,[sourcedc]
invoke DeleteDC,[destdc]
invoke DeleteObject,[hbmp]
invoke ExitProcess,[fehler]
.end start
section '.data' data readable writeable ;die ganzen Variablen
datei db ?
screenw dd 0
screenh dd 0
vidfps dd 0
fehler dd 0
flag dd 0
buffer db ?
sltime dd 1000
tmpstr db ?
cmdline dd 1 dup(3)
CAPTUREBLT dd 0x40000000
sourcedc dd ?
destdc dd ?
hbmp dd ?
;icon main_icon,icon_data,'vid.ico'
;section '.text' executable ;[SECTION .text] ; Section containing code
;extrn stdin ;extern stdin ; Standard file variable for input
;section '.idata' import data readable writeable ;Noch mehr Dll-Funktionen laden
; library avi,'Avifil32.dll',\
; import avi,\
;AVIFileInit,'AVIFileInit',\
;AVIFileExit,'AVIFileExit',\
;AVIFileOpen,'AVIFileOpenW',\
;AVIFileCreateStream,'AVIFileCreateStream',\
;AVIStreamSetFormat,'AVIStreamSetFormat',\
;AVIStreamWrite,'AVIStreamWrite'
Alles anzeigen