VBA: Musik abspielen in/aus .exe

Hallo,

ich möchte gerne eine Musikdatei aus einer .exe datei heraus abspielen - ich möchte aber die Musikdatei nicht extra ins Verzeichnis kopieren - ich will nur die .exe-Datei haben und die Musik soll irgendwie mit in diese .exe Datei.

Bitte schreibt eine einigermaßen ausführliche Antwort - vielleicht mit einem kleinen Beispiel, da ich nicht so der Held im Programmieren bin, und mit Stichworten so meine Probleme hab!

Tausend Dank für Antworten!
Werner

Hallo Werner
Also erstmal ist eine Musikdatei standardmäßig keine Ressource einer VB-exe.
Es gibt extra ein Control für Musik und Video, um seinen eigenen Player zu prpgrammieren und noch anderes, aber ein VB-Programm mit Musik drin wäre auch extrem groß!
Eine Möglichkeit einer Ressource sind Bilddateien. Wird das Bild nicht dargestellt, könnte das Programm seine Bildressource in eine temporäre Datei speichern es dann als Musikdatei abspielen.
Allerdings könnte es Ärger geben, wenn das Bild nicht einem entsprechendem Format entspricht.
Als Abhilfe könnte man ein Programm schreiben, welches in ein Bild in die Pixel die Musikdaten hineinschreibt.
Oder man schreibt einen Coder, also ein Programm, welches unendlich lange Texte wie:
Public Const Musiktext1 = chr$(&H10) & chr&(&H200)
usw. erstellt.
Ein solcher Coder muß nicht extern erstellt werden , sondern es gibt auch den Code, welcher nur zur Compilierungszeit ausgeführt wird.
Das geht auch mit Datenfeldern usw… aber eigentlich erscheint mir solches als etwas zu viel Arbeit.
Ein String ( = Text) ist auch eine Resource, welche man als Musikdatei speichern und abspielen kann. Hinweis auf Doppelbytezeichen und Speicherverbrauch.
Was man mit dem zur Kompilierungszeit laufendem Code alles machen kann, muß ich erst noch erforschen, weil ich es bis jetzt noch nicht gebraucht habe.
MfG

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Werner,

packe doch die Musik in eine Resource. Diese kannst du dann im Programm auslesen, temp. speichern und abspielen. Ist rel. simple und schnell bewerkstelligt.
Nachteil ist das dein Exe File dann sehr gross wird

Wobei hast du denn deine Probleme?
Wenn du mir sagst um was für ein Musikfile es sich handelt, kann ich dir auch ein Demo posten :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Werner,

packe doch die Musik in eine Resource. Diese kannst du dann im
Programm auslesen, temp. speichern und abspielen. Ist rel.
simple und schnell bewerkstelligt.
Nachteil ist das dein Exe File dann sehr gross wird

Nun, die Grösse spielt vorerst keine Rolle!, aber ich bin (noch) nicht wirklich gut in VBA und hab leider keine Ahnung was eine „Resource“ ist.

Wobei hast du denn deine Probleme?
Wenn du mir sagst um was für ein Musikfile es sich handelt,
kann ich dir auch ein Demo posten :smile:

Es ist ne ganz kurze MP3-Datei - ich kann sie aber auch in ein anderes Format konvertieren, falls das einfacher ist. (WAV z.B.)
Das mit dem Demo wäre super !!!

MfG
Werner

Hallo Werner,

ich habs mal schnell geschrieben aber nicht getestet aber ich denke mal das das ganze funzt :smile:

ich poste dir ein Modul. Darin ist enthalten wie du die Resource extrahierst. Danach hast du ein Mp3 File.
Dann habe ich dir noch fix geschrieben wie du es abspielen kannst.
Es gibt da etliche Wege und welchen du nimmst das liegt an dir :smile:

Code fürs Modul

Option Explicit

'Allgemeine Deklarationen

Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByVal lpszReturnString As String, ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long
Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpszCommand As String, ByVal lpszReturnString As String, ByVal cchReturnLength As Long, ByVal hwndCallback As Long) As Long

'Function um die Resource aus der Datei zu extrahieren, Rückgabewert=true = erfolgreiches extrahieren 

Public Function SaveResItemToDisk(ByVal iResourceNum As Integer, ByVal sDestFileName As String) As Boolean
On Error GoTo SaveResItemToDisk\_err
Dim bytResourceData() As Byte
Dim iFileNumOut As Integer
 bytResourceData = LoadResData(iResourceNum, "Custom")
 iFileNumOut = FreeFile
 Open sDestFileName For Binary Access Write As #iFileNumOut
 Put #iFileNumOut, , bytResourceData
 Close #iFileNumOut
 SaveResItemToDisk = True
 Exit Function
SaveResItemToDisk\_err:
 SaveResItemToDisk = False
End Function

'Function um das Mp3 abzuspielen, Rueckgabewert=true = erfolgreiches abspielen

Public Function MP3\_Play(ByVal sFile As String, ByVal sAlias As String) As Boolean
 Dim bResult As Boolean
 Dim sBuffer As String
 Dim lResult As Long
 sBuffer = Space$(255)
 lResult = GetShortPathName(sFile, sBuffer, Len(sBuffer))
 If lResult 0 Then
 sFile = Left$(sBuffer, InStr(sBuffer, vbNullChar) - 1)
 lResult = mciSendString("open " & sFile & " type MPEGVideo alias " & sAlias, 0, 0, 0)
 If lResult = 0 Then
 If mciSendString("play " & sAlias & " from 0", 0, 0, 0) = 0 Then
 bResult = True
 End If
 End If
 End If
 MP3\_Play = bResult
End Function

'Function um das Mp3 zu stoppen

Public Sub MP3\_Stop(ByVal sAlias As String)
 mciSendString "stop " & sAlias, 0, 0, 0
 mciSendString "close " & sAlias, 0, 0, 0
End Sub

Aufrufen kannst du das alles aus deinem Modul oder der Form über

'Datei extrahieren

 dim retval as boolean
 retval= SaveResItemToDisk(Number, "c:\test.mp3") 

über der Variable Retval kannst du nun prüfen ob das Mp3 erfolgreich extrahiert wurde.
als Nummer musst du die Resource ID angeben. Mehr dazu nachher :wink:
Als Pfad musst du angeben wo das Mp3 File hinextrahiert werden soll

'mp3 abspielen

 dim retval as boolean
 Retval=MP3\_Play ("c:\test.mp3", "MyAlias")

über der Variable Retval kannst du nun prüfen ob das Mp3 abgespielt wird.
Unter MyAlias kannst du einen x beliebigen Bezeichner angeben. Den musst du aber wissen um das Mp3 anzuhalten :wink:

'Mp3 stoppen

MP3\_Stop "MyAlias"

Unter MyAlias einfach den Namen angeben wessen Mp3 angehalten werden soll.
Soweit der kleine Code.
Nun zum erstellen der Resourcen Datei.
Wenn du sie hast ( es ist eine \*.res datei) dann einfach in deinem Project datei hinzufügen und die \*.res Datei angeben.
so nun schaue mal auf in dem Verzeichnis wo du VB hininstalliert hast ob du da eine Datei mit dem Namen rc.exe findest. Bei mir ist sie unter "DevStudio\VB\Wizards
gehe in das Verzeichnis lege dort eine Datei an mit dem Namen \*.rc.
Für den Stern kannst du irgendein namen angeben.Wichtig ist nur das die Datei mit .rc aufhört.
Diese öffnest du nun mit einen normalen Editor. ( Notepad etc.)
dann schreibst du folgendes in die Datei

ResourceID CUSTOM DISCARDABLE Mp3Name

Beispiel:

1 CUSTOM DISCARDABLE "f:\bier.GIF"

Als ResourceID musst du eine Zahl angeben. Diese wird später benötigt um die richtigen daten zu laden.
Du kannst auch mehrere Daten angeben, wie zum Beispiel

1 CUSTOM DISCARDABLE "c:\test.mp3"
2 CUSTOM DISCARDABLE "c:\test.gif"
3 CUSTOM DISCARDABLE "c:\test.jpg"
4 CUSTOM DISCARDABLE "c:\test.doc"

Mit der Angabe CUSTOM sagst du nur das es sich um eine benutzerdefinierte Angabe handelt. Die daten werden dann binaer ausgelesen und geschrieben. 
DISCARDABLE bedeutet das die Resource entfernt werden kann wenn sie nicht mehr gebraucht wird.
 danch schreibst du den Pfad zu der mp3 datei darein.

Danach speicherst du sie und schliesst das \*.rc File nun rufst du einfach rc.exe auf und als Parameter übergibst du das \*.rc File.
Beispiel : du hast das File sound.rc genannt dann rufst du nun rc.exe sound.rc auf.
Nach einer kurzen weile solltest du nun das gewünschte \*.res File haben :smile:

Ich hoffe ich konnte dir ein wenig weiterhelfen :smile:

MFG Alex


> > Hallo Werner,




> > packe doch die Musik in eine Resource. Diese kannst du dann im  
> > Programm auslesen, temp. speichern und abspielen. Ist rel.  
> > simple und schnell bewerkstelligt.  
> > Nachteil ist das dein Exe File dann sehr gross wird
> 
>   
> Nun, die Grösse spielt vorerst keine Rolle!, aber ich bin  
> (noch) nicht wirklich gut in VBA und hab leider keine Ahnung  
> was eine "Resource" ist.  
>   
>   
> 
> > Wobei hast du denn deine Probleme?  
> > Wenn du mir sagst um was für ein Musikfile es sich handelt,  
> > kann ich dir auch ein Demo posten :smile:
> 
>   
> Es ist ne ganz kurze MP3-Datei - ich kann sie aber auch in ein  
> anderes Format konvertieren, falls das einfacher ist. (WAV  
> z.B.)  
> Das mit dem Demo wäre super !!!  
>   
> MfG  
> Werner

Hallo,

Danke für die Antwort - das sieht echt gut aus - ich glaub das krieg ich jetzt hin - Danke vielmals für die extrem ausführliche Antwort !!!

Werner