1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

MCISendString - MASM32

Discussion in 'Programmieren' started by C.M.Obrecht, Jul 8, 2007.

Thread Status:
Not open for further replies.
  1. Hallo,

    kann mir jemand ein Beispiel geben wie ich MCISendString korrekt verwende? Ich habe es unter VIsual Basic schon erfolgreich benützt, doch ich schaffe das nicht auf ASM umzuwandeln (MASM32); habe diverse Versuche hinter mir (der Dateiname soll aus einem Filedialog übernommmen werden).

    Vielen Dank
     
  2. SteveZ

    SteveZ Megabyte

    ka obs dir was nuetzt ;)
     
  3. Danke! Aber das ist die Deklaration unter VisualBasic... die habe ich schon, nun möchte ich das auf Assembler übertragen (braucht keine Deklaration aber den Aufruf, der klappt nicht so wie ich es probiert habe und auch nicht wie es unter VB und C++ geht).
     
  4. SteveZ

    SteveZ Megabyte

    sry da kann ich dir nicht mehr helfen :) hier muessen die spezis ran
     
  5. Danke trotzdem :)
     
  6. RealC++

    RealC++ Kbyte

    Hab die Funktion auch erst in C++ ausgetestet. Da musst du ja erst den Windows-Header(#include <windows.h>) einbinden.
    Ich denke mal, dass das in ASM genau gleich geht. Also mal die Windows-Funktionen einbinden(windows.inc).
    (Windows-Programmierung in ASM gibt es hier: http://andremueller.gmxhome.de/win.html)

    Die Funktion aufrufen geht dann ziemlich sicher ähnlich wie in C++, nur ohne Semikolon:
    mciSendString("play dateiname",NULL,0,0)
     
  7. Unter SAM braucht man eigentlich weniger Headers einzubinden, doch lauf API-Bibliothek findet sich diese Funktion in der winmm.inc, welche ich auch eingebunden habe; der Assembler motzt nicht dass er mciSendString nicht kennt sondern dass die Parameterübergabe nicht stimmt. Muss mal versuchen den Dateinamen direkt anzugeben; als ich "play"&ADDR Dateiname ... schrieb war das ADDR falsch, doch das ist ansonsten nötig für Variablen...
     
  8. So geht es! Habe hier den kompletten COde...:

    Code:
    .386
    .model flat,stdcall
    option casemap:none
    
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    
    
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    include \masm32\include\winmm.inc
    includelib \masm32\lib\winmm.lib
    
    .data
    ClassName db "SimpleWinClass",0
    AppName  db "Our First Window",0
    OurText  db "Win32 assembly is great and easy with MCI!",0
    ButtonText db "play!",0
    ButtonClassName db "button",0
    
    
    msgtext2 db ":-D",0
    msgtext3 db "Win32 Assembly seems to come easyer!",0
    msgtext4 db "Das isch schomol super",0
    open db "open C:\mydocu~1\mp3\ELU08.mp3 alias MyAlias",0
    play db "play MyAlias",0
    stop db "stop MyAlias",0
    mci3 db 0
    close db "close MyAlias",0
    .data?
    hInstance HINSTANCE ?
    CommandLine LPSTR ?
    hwndButton HWND ?
    
    
    .const
    ButtonID equ 1
    
    
    .code
    start:
    	invoke GetModuleHandle, NULL
    	mov    hInstance,eax
    	invoke GetCommandLine
    	invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    	invoke ExitProcess,eax
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    	LOCAL wc:WNDCLASSEX
    	LOCAL msg:MSG
    	LOCAL hwnd:HWND
    	mov   wc.cbSize,SIZEOF WNDCLASSEX
    	mov   wc.style, CS_HREDRAW or CS_VREDRAW
    	mov   wc.lpfnWndProc, OFFSET WndProc
    	mov   wc.cbClsExtra,NULL
    	mov   wc.cbWndExtra,NULL
    	push  hInst
    	pop   wc.hInstance
    	mov   wc.hbrBackground,COLOR_WINDOW+1
    	mov   wc.lpszMenuName,NULL
    	mov   wc.lpszClassName,OFFSET ClassName
    	invoke LoadIcon,NULL,IDI_APPLICATION
    	mov   wc.hIcon,eax
    	mov   wc.hIconSm,0
    	invoke LoadCursor,NULL,IDC_ARROW
    	mov   wc.hCursor,eax
    	invoke RegisterClassEx, addr wc
    	INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
               WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
               CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
               hInst,NULL
    	mov   hwnd,eax
    	INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    	INVOKE UpdateWindow, hwnd
    	.WHILE TRUE
                    INVOKE GetMessage, ADDR msg,NULL,0,0
                    .BREAK .IF (!eax)
                    INVOKE TranslateMessage, ADDR msg
                    INVOKE DispatchMessage, ADDR msg
    	.ENDW
    	mov     eax,msg.wParam
    	ret
    WinMain endp
    WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    	LOCAL hdc:HDC
    	LOCAL ps:PAINTSTRUCT
    	LOCAL rect:RECT
    	.IF uMsg==WM_DESTROY
                invoke mciSendString, ADDR stop, ADDR mci3,0,0
                invoke mciSendString, ADDR close, ADDR mci3,0,0
                invoke MessageBox,NULL,ADDR msgtext3,ADDR msgtext4,MB_OK or MB_ICONERROR 
                   
    
    		invoke PostQuitMessage,NULL
    .ELSEIF uMsg==WM_CREATE
                            invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                            WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                            75,70,140,25,hWnd,ButtonID,hInstance,NULL
    		mov  hwndButton,eax
    
    
    	.ELSEIF uMsg==WM_PAINT
    		invoke BeginPaint,hWnd, ADDR ps
    		mov    hdc,eax
    		invoke GetClientRect,hWnd, ADDR rect
    		invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
    		invoke EndPaint,hWnd, ADDR ps
    
    .ELSEIF uMsg==WM_COMMAND
    		mov eax,wParam
    		.IF ax==ButtonID
                 
                    
                    
    
                    invoke mciSendString, ADDR open, ADDR mci3,0,0
                    invoke mciSendString, ADDR play, ADDR mci3,0,0
                    
                  
                    
                     
                    ret
                    M5: nop                 
                    
                     
            	
    
    .ENDIF 
    	.ELSE
    		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    		ret
    	
    
    .ENDIF
    
    	xor    eax,eax
    	ret
    WndProc endp
    end start
    
     
Thread Status:
Not open for further replies.

Share This Page