Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

MCISendString

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 30.06.2007, 14:17    Titel: MCISendString Antworten mit Zitat

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
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 30.06.2007, 16:01    Titel: Antworten mit Zitat

Wie übermittelst du den String?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 30.06.2007, 17:15    Titel: Antworten mit Zitat

Gleiche Frage in einem C++ Forum
Gegenfrage: Was ist der Sinn?

Code:
#include once "windows.bi"
#include once "win/mmsystem.bi"

asm nop

mciSendString( "play mymidifile", NULL, 0, 0 )

asm nop

mit FB und Parameter -r kompiliert:

FB ASM Code hat Folgendes geschrieben:
nop
push 0
push 0
push 0
push offset _Lt_0003
call _mciSendStringA@16
nop

_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 30.06.2007, 18:22    Titel: Antworten mit Zitat

Code:
invoke mciSendString "mp3Alias", szFileName, 0, 0, 0


Habe mit den Parametern so ziemlich jede Moeglichkeit probiert.

Ja, die Frage hatte ich in dem C-Forum gestellt vor "ewiger" Zeit, und da kam keine Antwort darum habe ich sie hierhin kopiert. In dieser Zeit habe ich nur vergessen wo ich den Quellcode gespeichert habe (und ob ueberhaupt) lächeln Weiss darum nicht mehr was ich dort hatte, habe nun einen neuen erstellt. zsFileName kommt von einem Open-Dialog.

EDIT: Habe den Code wieder gefunden mit dem ich es versuchte:
Code:
  invoke mciSendString ("open " and szFileName and "type MPEGVideo alias" and "MyAlias",0,0,0)
            invoke mciSendString ("close" and "MyAlias",0,0,0)



Uebrigens, der Sinn? In MASM32 muss man ja ASM nehmen lächeln Und der Sinn davon, ich werde/wurde nach kleineren Moeglichkeiten fuer einen Player gefragt und kann damit auch mit MASM32 ueben. Ich finmde im Vergleich zu anderen Programmiersprachen die WinAPI nicht wirklich schwieriger als in ASM (in C muesste ich auch nachsehen wie man MCI anwendet und kuerzer ist der Code ja nicht wirklich, ausserdem weiss ich in ASM wenigstens wie man einen String deklariert durchgeknallt )[/code]
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 30.06.2007, 20:49    Titel: Antworten mit Zitat

lol?
Mit MCI-String geht man aber leicht anders um, hatte irgendwo hier im Forum mal das offizielle Helpfile dazu publiziert...

Und du kannst auch ruhig FB nehmen, läuft aufs gleiche raus, FB nutzt schl. nen Assembler happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 30.06.2007, 23:51    Titel: Antworten mit Zitat

Habe erst vor kurzem eie kleine Basic.bi fuer den MCI Sendstring gebastelt um es dann doch net zu benutzen durchgeknallt

MCI_Basic.bi
Code:

Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" (Byval As String, Byval As String, Byval As Uinteger, Byval As Integer) As Uinteger
Declare Function MCI_Open (Byval MCI_File As String, Byval MCI_Alias As String) As Integer
Declare Function MCI_Play (Byval MCI_Alias As String) As Integer
Declare Function MCI_Position (Byval MCI_Alias As String) As Uinteger
Declare Function MCI_Length (Byval MCI_Alias As String) As Uinteger
Declare Sub MCI_Stop(Byval MCI_Alias As String)
Declare Sub MCI_Close(Byval MCI_Alias As String)   

Function MCI_Position (Byval MCI_Alias As String) As Uinteger
  Dim Null_Buffer As String * 255
  mciSendString "status " + MCI_Alias + " position", Null_Buffer, Len(Null_Buffer), 0
  Function = Val(Null_Buffer)
End Function

Function MCI_Length (Byval MCI_Alias As String) As Uinteger
  Dim Null_Buffer As String * 255
  mciSendString "status " + MCI_Alias +" length", Null_Buffer, Len(Null_Buffer), 0
  Function = Val(Null_Buffer)
End Function

Function MCI_Open (Byval MCI_File As String, Byval MCI_Alias As String) As Integer
    Dim MCI_Type As String
    MCI_Type = "MPEGVideo"
    '"MPEGVideo" 'MP3
    '"waveaudio" 'Wav
    Function = mciSendString ("open " + MCI_File +" type "+ MCI_Type +" alias " + MCI_Alias, "", 0, 0)
End Function

Function MCI_Play (Byval MCI_Alias As String) As Integer
    Function = mciSendString ("play " + MCI_Alias + " from 0", "", 0, 0)
End Function

Sub MCI_Close(Byval MCI_Alias As String)
  mciSendString "close " + MCI_Alias, "", 0, 0
End Sub

Sub MCI_Stop(Byval MCI_Alias As String)
  mciSendString "stop "+ MCI_Alias, "", 0, 0
End Sub


Beispiel1.bas
Code:

#include "mci_basic.bi"

Dim MCI_File as string
Dim MCI_Alias as String
Dim SLength as UInteger
Dim SPosition as UInteger

MCI_File = "brick-test.wav"
MCI_Alias = "Music1"

MCI_Open (MCI_File,MCI_Alias)
MCI_Play (MCI_Alias)

SLength=MCI_Length(MCI_Alias)
do
    SPosition = MCI_Position (MCI_Alias)
    If SPosition > SLength-5 Then MCI_Play (MCI_Alias)
    sleep 1,1
loop until multikey(&h01)

MCI_Stop (MCI_Alias)
MCI_Close (MCI_Alias)


sleep

_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 01.07.2007, 09:07    Titel: Antworten mit Zitat

Mal ein Vorschlag wie du an den ASM Code für den Aufruf kommst.
(Aufbauend auf meinem Vorherigen Posting, bei dem ja "nur" call _mciSendStringA@16 nicht aufgelöst ist)

Schreib in einer Hochsprache den Code zum Ansprechen dieser DLL und umklammere die Funktion wie in meinem Beispiel mit den Asembler Befehlen NOP.
Dann kannst du das Programm deasemblieren und zwischen den beiden NOPs die Adresse "abholen".

Oder ist dein Problem "nur" die Übergabe des Strings?
Dann probiere es doch mal mit einem Pointer auf den String und prüfe ob das Ende des Strings sauber mit 0 geschlossen ist und ob die länge überhaupt stimmt.
Kannst du dein Programm überhaupt asemblieren oder gibt es vorher einen Syntax Fehler?

Zitat:
Und der Sinn davon, ich werde/wurde nach kleineren Moeglichkeiten fuer einen Player gefragt und kann damit auch mit MASM32 ueben.

lachen
In dem man auf bereits im Betriebsssytem Vorhanden Funktionen Zugreift kann man natürlich sehr kleine "Multimedia Player" schreiben durchgeknallt

@Eternal_pain
Kennst du das Examples verzeichniss von FB zwinkern
FreeBASIC\examples\Windows\winmm
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.07.2007, 09:50    Titel: Antworten mit Zitat

Michael Frey hat Folgendes geschrieben:

@Eternal_pain
Kennst du das Examples verzeichniss von FB zwinkern
FreeBASIC\examples\Windows\winmm


Finde meine Version aber uebersichtlicher grinsen
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 01.07.2007, 18:30    Titel: Antworten mit Zitat

Also mit
Code:
invoke mciSendString "open " and szFileName and "type MPEGVideo alias" and "MyAlias",0,0,0
invoke mciSendString "close" and "MyAlias",0,0,0

erscheint "Missing operator in expression".

Klar wird es kleiner mit den Betriebssystemfunktionen, aber die VB-Version konnte schonmal ein mp3 abspielen welches der Mediaplayer nicht spielte (irgend ein DirectX-Problem vermutlich)
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 01.07.2007, 18:36    Titel: Antworten mit Zitat

Wäre ok, wenn der Media Player denn DirectX benutzen würde, AFAIK tut er das näml. nicht grinsen

MPlayer2 (der klassische, der is auch in XP noch dabei, bei Vista weiß ich es nicht) nutzt MCI für alles.
WinAMP dagegen hat seine eignen Plugins hierfür und spielt an MP3's egtl. auch alles ab, und die 2er-Version ist auch noch für sehr betagte Rechner geeignet (Völlig problemloser Einsatz unter Win95 @ 100 MHz, ich musste jahrelang damit auskommen happy)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 01.07.2007, 20:40    Titel: Antworten mit Zitat

Ach was? Aber nicht der 9 oder? Hatte naemlich mal ein DirectX-Problem, die Windows-Sounds kamen noch aber der Media Player blieb stumm... aber tatsaechlich ging auch mal ein mp3 mit dem mp nicht auf, und mit meinem MCI in Visual Basic war es kein Problem lächeln
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 01.07.2007, 20:48    Titel: Antworten mit Zitat

WMP nutzt DirectX Afaik nur für die Visualisierung. Kann nat. sein dass ich mich irre, aber ich glaub mal sowas gehört zu haben grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 02.07.2007, 06:32    Titel: Antworten mit Zitat

Eigenartig... bei mir kam jedenfalls nichts mehr ohne DirectX lächeln
Nur, was will MASM32 nocht für Argumente?
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 02.07.2007, 11:08    Titel: Antworten mit Zitat

Gibt es denn eine genaue Fehlermeldung oder so?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 02.07.2007, 12:42    Titel: Antworten mit Zitat

Nur missing operator in expression, bei den beiden Zeilen mit mci...
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 02.07.2007, 20:23    Titel: Antworten mit Zitat

Wieso
Code:
"open " and szFileName and "type MPEGVideo alias" and "MyAlias"

und nicht
Code:
"open type MPEGVideo alias MyAlias"

?

Dein Problem scheint mir, das du mehr Probleme mit den Asembler hast als mit MCI.

Kannst du auch bitte mal den Kompletten Code Posten?
Ich frage mich nämlich woher der Asembler wissen soll wo er die Funktionen mciSendString finden soll.
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 02.07.2007, 23:54    Titel: Antworten mit Zitat

Code:
includelib winmm.lib
daher weiss der Assembler von der Funktion und der entscheidende Teil des Codes (der Rest ist unwichtig, habe ich vor dem Versuch erfolgreich getestet, läuft alles):
Code:


.if wParam == 1001
         
            mov szFileName[0],0   
            invoke GetFileName,hWin,SADD("Open"),
                                    SADD("All files",0,"*.*",0)
            cmp szFileName[0],0     
            je @F
         
            invoke MessageBox,hWin,ADDR szFileName,ADDR szDisplayName,MB_OK
            invoke mciSendString "open " and szFileName and "MyAlias",0,0,0
            invoke mciSendString "close" and "MyAlias",0,0,0

Werde mal versuchen; was mich irritiert, braucht doch ADDR szFileName wie bei der MessageBox vorher; aber das akzeptierte er erst recht nicht (vielleicht war gestern etwas zu spät, probiere nochmal).
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 16.07.2007, 15:25    Titel: Antworten mit Zitat

Problem gefunden! Eigentlich gar nicht so schwer (sind immer Details)... so geht es:
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


Die Übernahme von langen Dateinamen (aus einem Dialog) funktioniert (noch) nicht; braucht dazu eine Routine zum umwandeln (für VB habe ich die).
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz