 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 30.06.2007, 14:17 Titel: MCISendString |
|
|
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 |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 30.06.2007, 16:01 Titel: |
|
|
Wie übermittelst du den String? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 30.06.2007, 17:15 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 30.06.2007, 18:22 Titel: |
|
|
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) 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 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 )[/code] _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 30.06.2007, 20:49 Titel: |
|
|
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  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 30.06.2007, 23:51 Titel: |
|
|
Habe erst vor kurzem eie kleine Basic.bi fuer den MCI Sendstring gebastelt um es dann doch net zu benutzen
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 |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 01.07.2007, 09:07 Titel: |
|
|
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. |
In dem man auf bereits im Betriebsssytem Vorhanden Funktionen Zugreift kann man natürlich sehr kleine "Multimedia Player" schreiben
@Eternal_pain
Kennst du das Examples verzeichniss von FB
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 |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 01.07.2007, 09:50 Titel: |
|
|
Michael Frey hat Folgendes geschrieben: |
@Eternal_pain
Kennst du das Examples verzeichniss von FB
FreeBASIC\examples\Windows\winmm |
Finde meine Version aber uebersichtlicher  _________________
 |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 01.07.2007, 18:30 Titel: |
|
|
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 |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 01.07.2007, 18:36 Titel: |
|
|
Wäre ok, wenn der Media Player denn DirectX benutzen würde, AFAIK tut er das näml. nicht
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 ) |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 01.07.2007, 20:40 Titel: |
|
|
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ängre blomstre gamle nord... |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 01.07.2007, 20:48 Titel: |
|
|
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  |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 02.07.2007, 06:32 Titel: |
|
|
Eigenartig... bei mir kam jedenfalls nichts mehr ohne DirectX
Nur, was will MASM32 nocht für Argumente? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 02.07.2007, 11:08 Titel: |
|
|
Gibt es denn eine genaue Fehlermeldung oder so? |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 02.07.2007, 12:42 Titel: |
|
|
Nur missing operator in expression, bei den beiden Zeilen mit mci... _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 02.07.2007, 20:23 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 02.07.2007, 23:54 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 16.07.2007, 15:25 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|