Seite 1 von 1

WEBCAM per ASM erreichen: INCLUDE geht net!!

Verfasst: 05.02.2008 20:42
von Max_der_Held
Einleitung
  • oook.. nehmen wir an, man lädt sich den flat assembler herunter, der in der Purebasic-hilfe beschreiben wird.
    http://flatassembler.net

    jetz will man das beispiel für "how to use a camera" in Pb reinwerfen.
    da man sich ja schon etwas damit auskennt, setzte man alles in !.
    wenn ichs in den Ordner INCLUDE von Fasm reinwirft ( indem die gebrauchten Dateien sind)
    kann man mit Fasm das ganze compilieren. bei Purebasic kommt der Fehler: couldn't find WIN32A.INC.
    (sinngemäß)
Problem:
  • wie bring ich den Include 'win32a.inc' befehl zum laufen?
WERS Probieren will: woran liegts?? hab schon das ganze include-verzeichnis in COMPILERS von purebasic kopiert... kein erfolg. sogar den Flat assembler ausgetauscht.. gleiches wie vorher..


edit:
code soweit verstanden optimiert...o_O
/edit

Code:

Code: Alles auswählen

; +-------------------------------------------+
; | Program ...... FASMCam                    |
; | Author ....... Marcus Araujo              |
; | Description .. this application shows how |
; |                to access webcam via FASM. |
; +-------------------------------------------+


!Include 'C:/Dokumente und Einstellungen/Max/Desktop/WEBCAM per PB-ASM/WIN32A.INC'

!  IDD_MAIN                     =  100
!  WM_CAP_DRIVER_CONNECT        =  WM_USER + 10
!  WM_CAP_DRIVER_DISCONNECT     =  WM_USER + 11
!  WM_CAP_FILE_SAVEDIB          =  WM_USER + 25
!  WM_CAP_SET_PREVIEW           =  WM_USER + 50
!  WM_CAP_SET_PREVIEWRATE       =  WM_USER + 52
!  WM_CAP_SET_SCALE             =  WM_USER + 53
!  ID_START                     =  201
!  ID_STOP                      =  202
!  ID_CLICK                     =  203
!  _camtitle                    db 'FASMWEBCAM'

!  _filename  db 'IMAGE.BMP'    ; Filename
!  nDevice    dd   0            ; Device Number -> It can range from 0 through 9
!  nFPS       dd 50            ; Frames per second. Must be 1000/FPS. E.g. 20 FPS = 50


!  proc MainDlg hdlg, msg, wParam, lParam
!    push    Ebx Esi Edi
!    cmp     [msg], WM_INITDIALOG
!    je      .wminitdlg
!    cmp     [msg], WM_COMMAND
!    je      .wmcommand
!    cmp     [msg], WM_CLOSE
!    je      .wmclose
!    Xor     Eax, Eax
!    jmp     .finish
!    .wminitdlg:
!      invoke  capCreateCaptureWindow, _camtitle, WS_VISIBLE + WS_CHILD, 10, 10,\
!                                        266, 252, [hdlg], 0
!      mov     [hWebcam], Eax
!      jmp     .finish
!    .wmcommand:
!      cmp     [wParam], BN_CLICKED shl 16 + ID_START
!      je      .startbutton
!      cmp     [wParam], BN_CLICKED shl 16 + ID_STOP
!      je      .stopbutton
!      cmp     [wParam], BN_CLICKED shl 16 + ID_CLICK
!      je      .clickbutton
!    .wmclose:
!      invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
!      invoke  EndDialog, [hdlg], 0
!    .finish:
!      pop     Edi Esi Ebx
!      ret
!    .startbutton:
!      invoke  SendMessage,  [hWebcam], WM_CAP_DRIVER_CONNECT, [nDevice], 0
 !     invoke  SendMessage,  [hWebcam], WM_CAP_SET_SCALE, TRUE, 0
!      invoke  SendMessage,  [hWebcam], WM_CAP_SET_PREVIEWRATE, [nFPS], 0
!      invoke  SendMessage,  [hWebcam], WM_CAP_SET_PREVIEW, TRUE, 0
!      jmp     .finish
!    .stopbutton:
!      invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0
!      jmp     .finish
!    .clickbutton:
!      invoke  SendMessage, [hWebcam], WM_CAP_FILE_SAVEDIB, 0, _filename
!      jmp     .finish
!  endp

!section '.data' Data readable writeable
!  hInstance     dd ?
!  hWebcam       dd ?

!section '.code' code readable executable
!  codestart:
!    invoke  GetModuleHandle, 0
!    mov     [hInstance], Eax
!    invoke  DialogBoxParam, Eax, IDD_MAIN, HWND_DESKTOP, MainDlg, 0
!    invoke  ExitProcess, 0

!section '.idata' Import Data readable writeable

!   library kernel, 'KERNEL32.DLL',\
!          user,   'USER32.DLL',\
!          avicap, 'AVICAP32.DLL'

!  Import  kernel,\
!          GetModuleHandle,'GetModuleHandleA',\
!          ExitProcess,    'ExitProcess'

!  Import  user,\
!          DialogBoxParam, 'DialogBoxParamA',\
!          EndDialog,      'EndDialog',\
!          SendMessage,    'SendMessageA'
!
!  Import  avicap,\
!          capCreateCaptureWindow, 'capCreateCaptureWindowA'

!section '.rsrc' resource Data readable
!  directory     RT_DIALOG, dialogs
!  resource      dialogs,\
!                IDD_MAIN, LANG_ENGLISH + SUBLANG_DEFAULT, main_dialog
!  dialog        main_dialog, 'FASM Webcam', 0, 0, 190, 200, WS_CAPTION + WS_POPUP + WS_SYSMENU +\
!                                                            DS_MODALFRAME + DS_CENTER
!                dialogitem 'BUTTON', 'START', ID_START,  10, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
!                dialogitem 'BUTTON', 'STOP',  ID_STOP,   70, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
!                dialogitem 'BUTTON', 'CLICK', ID_CLICK, 130, 170, 50, 20, WS_VISIBLE + WS_TABSTOP
!  EndDialog

; IDE Options = PureBasic 4.10 (Windows - x86)
; CursorPosition = 21
; FirstLine = 10
End 

Verfasst: 05.02.2008 21:00
von edel
Gib ein absoluten pfad an. Fasm sucht ohne immer im Temp Ordner wo natuerlich nichts ist.

Verfasst: 05.02.2008 21:35
von Scarabol
Ich habs mal gemacht, dann fängt er aber schon in der ersten Zeile bei format mit einem Error an...

Gruß
Scarabol

Verfasst: 05.02.2008 22:08
von Max_der_Held
genauer:
Bild

bin noch am bastelsuchen. danke, für die tipps :)

(ich versuch mal, alles auf temp zu verschieben..)
[edit]
wars nicht
[/edit]

Verfasst: 05.02.2008 23:17
von Helle
Max, so wird das nichts! "format" bestimmt in FAsm das Ausgabeformat (z.B. (Windows-)Exe oder Obj.-Datei) und wird von PB selbst bestimmt, also weg damit. Selbiges mit "entry" (Einstiegspunkt). Dafür alle "sections" ans Ende des Codes, Code mit "End" abschliessen. Pfade wie edel schon schrieb am besten direkt angeben. "invoke" ist ein Thema für sich, ich empfehle Auflösung in die Grundbestandteile, also z.B. invoke Aufruf, a,b,c zu push c, push b, push a, call Aufruf@12. Aufruf muss vorher wieder deklariert werden als "extrn _Aufruf@12". 12 hier für 3 Parameter (a 4 Bytes).

Gruß
Helle

Verfasst: 06.02.2008 23:35
von Max_der_Held
erstmal danke :) habs soweit verstanden aktualisiert :)

bin ja nicht grad soo weit mit assembler, dass ich sagen könnte, ich hätte das alles verstanden.
wenn mein Laptop mehr batterieleistung hätte, könnte man sich darüber länger den kopf zerbrechen.. o_O

habs jetz soweit optimiert. jetz kommt er mit anderen fehlermeldungen (und des mit inkove hab ih auch noch nicht so ganz verarbeitet... ich kenn bzw. kannte den befehl bisher nicht o_O)

kannst du bitte den code lauffähig machen ? :roll: ich hab getan, was ich konnte.. und will nun doch wissen, wie's geht.

und: welches Buch über Fasm, vor allem für einsteiger, sind zu empfehlen? bzw. auch gute tutorials?

mfg, draufgeher.

Verfasst: 09.02.2008 18:32
von Helle
Hier der (bei mir) unter PB-lauffähige Code:

Code: Alles auswählen

;Webcam-Test "Helle" Klaus Helbing, 09.02.2008, PB4.10 
;FAsm-Ursprung: FASMCam von Marcus Araujo 

Global hcap.l 
Global hdlg.l 

!include "E:\Programme\FlatAssembler\Include\win32a.inc"   ;Pfad persönlich anpassen! 

!extrn "__imp__SendMessageA@16" as SendMessage:dword 
!extrn "__imp__GetModuleHandleA@4" as GetModuleHandle:dword 
!extrn "__imp__DialogBoxParamA@20" as DialogBoxParam:dword 

!  WM_CAP_DRIVER_CONNECT        =  WM_USER + 10 
!  WM_CAP_DRIVER_DISCONNECT     =  WM_USER + 11 
!  WM_CAP_FILE_SAVEDIB          =  WM_USER + 25 
!  WM_CAP_SET_PREVIEW           =  WM_USER + 50 
!  WM_CAP_SET_PREVIEWRATE       =  WM_USER + 52 
!  WM_CAP_SET_SCALE             =  WM_USER + 53 

Procedure Webcam()                     ;ob hier sinnvoll lassen wir mal dahingestellt 
Repeat 
  EventID = WaitWindowEvent() 
    If EventID = #PB_Event_Gadget 
      Select EventGadget() 
        Case 0 
          hcap=CallFunction(0, "capCreateCaptureWindowA","Test2", #WS_VISIBLE + #WS_CHILD, 10, 10, 320, 240, hdlg, 0) 
!         mov eax,[v_hcap]             ;für Wechsel PB-FAsm-Variable  
!         mov [hWebcam], eax 
!         invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_CONNECT, [nDevice], 0 
!         invoke  SendMessage, [hWebcam], WM_CAP_SET_SCALE, TRUE, 0 
!         invoke  SendMessage, [hWebcam], WM_CAP_SET_PREVIEWRATE, [nFPS], 0 
!         invoke  SendMessage, [hWebcam], WM_CAP_SET_PREVIEW, TRUE, 0 
        Case 1 
!        invoke  SendMessage, [hWebcam], WM_CAP_DRIVER_DISCONNECT, _camtitle, 0 
        Case 2 
!         invoke  SendMessage, [hWebcam], WM_CAP_FILE_SAVEDIB, 0, _filename        
      EndSelect 
    EndIf 
Until EventID = #PB_Event_CloseWindow Or EventGadget() = 1 
EndProcedure 

;entspricht Code-Section 
OpenLibrary(0, "E:\Windows\System32\avicap32.dll")         ;Pfad persönlich anpassen! 
hdlg=OpenWindow(0, 0, 0, 340, 300, "WebCam-Test") 
CreateGadgetList(WindowID(0)) 
ButtonGadget(0, 10, 260, 80, 30, "Start") 
ButtonGadget(1, 130, 260, 80, 30, "Stop") 
ButtonGadget(2, 250, 260, 80, 30, "Click") 

!invoke  GetModuleHandle, 0 
!mov     [hInstance], Eax 
Webcam() 
CloseWindow(0) 
CloseLibrary(0) 

End 

!section '.data' Data readable writeable 
!_camtitle  db 'FASMWEBCAM' 
!_filename  db 'E:\Codes\PureBasic 4.0\Video\IMAGE.BMP'    ;Filename  persönlich anpassen! 
!nDevice    dd  0                      ;Device Number -> It can range from 0 through 9 
!nFPS       dd 50                      ;Frames per second. Must be 1000/FPS. E.g. 20 FPS = 50 
!hInstance  dd  ? 
!hWebcam    dd  ?
Bitte als eine Art kleine Demo betrachten, so nach dem Motto: Hier ist reiner ASM-Code, bring das Programm halbwegs sinnvoll unter PB zum Laufen. Das Hauptproblem liegt darin, PB bettet den Code in das Format MS-COFF (erstellt Obj-Datei und übergibt benötigte Include-Dateien als Parameter an den Linker) ein, der Ursprung ist aber im PE-Format (erstellt Exe mit im Code aufgeführten Includes, Resourcen usw.). PB übergibt (automatisch) Kernel32, User32 und GDI32 (denke ich mal), alles was dort nicht enthalten ist, muss eben im Programm explizit aufgeführt ("includiert") werden (hier mit OpenLibrary). So gibt es z.B. im COFF-Format keine "idata"-Section. "invoke" ist übrigens kein (ASM-)Befehl, sondern ein Macro, das auch nicht in allen Compilern zur Verfügung steht. Durch den von mir gewählten (Include-)Weg ist es hier wählbar (FAsm unterstützt natürlich invoke).

Gruß
Helle

Verfasst: 11.02.2008 17:09
von Max_der_Held
wow.. super :D :allright: :allright: