Okei. Mulla on SharpDevelop. Mulla on resurssitiedosto, jossa on 2 WAVia. SharpDevelopin menut poikkeaa jonkin verran VS.NETin valikoista, joten netissä olevat aiheet eivät paljoa auta. Yhden pätkän löysin C#:lle ja tusinan tavan VB:lle, ja muutaman toimimattoman VB.NETille.
Mulla on NameSpace nimeltä DefaultNameSpace ja resurssitiedosto DefaultNameSpace.MainForm.resources, jossa on siis kaksi wavia, kirjain.wav ja rivinvaihto.wav.
Minulla on myös formi nimeltä MainForm. Siellä lukee mm. näin:
Dim ResStream As System.IO.Stream = _ System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream _ ("DefaultNameSpace.MainForm.kirjain")
Ja sitä yritän soittaa näin:
sndPlaySound(ResStream.ToString, 1)
(Tiedän, ei lähellekään oikein, vaan näin jollain sivulla seisoi)
Kuinka saan WAVin soimaan? sndPlaySound on kyllä mulla määriteltynä:
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Ja ei oikein resurssitiedosto-oppaasta ole apua se kun on "vanhalle" VB:lle. Olen erittäin kiitollinen avusta ja auttaja(t) pääsevät lopputeksteihin Meitzin alle :)
Eikö kukaan tiedä :(
Pääsinpäs etenpäin. Nyt on errori.
Tässä errori:
Runtime errori kirjoitti:
Objektin viittaukseksi ei voi määrittää objektiesiintymää.
Näin kutsun funktiota:
If e.KeyChar <> Chr(13) Then Win32.Winmm.PlayWavResource("kirjain.wav") Else Win32.Winmm.PlayWavResource("rivinvaihto.wav") End If
Ja tässä funktio-namespace:
Namespace Win32 Public Class WinMM 'Declare constants Public Const SND_ASYNC As Int32 = 1 Public Const SND_MEMORY As Int32 = 4 'this is the overload we want to play embedded resource... Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySound"(ByVal data() As Byte, ByVal hMod As IntPtr, ByVal dwFlags As Int32) As Boolean Public Shared Function PlayWavResource(ByVal wav As String) 'get the namespace Dim strNameSpace As String = _ System.Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString() ' get the resource into a stream Dim Str As Stream = _ System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strNameSpace + "." + wav) If Str.CanRead Then 'bring stream into a byte array Dim bStr(Str.Length) As Byte 'bStr = New Byte(Str.Length) Str.Read(bStr, 0, Int(Str.Length)) 'play the resource PlaySound(bStr, IntPtr.Zero, SND_ASYNC Or SND_MEMORY) End If End Function End Class End Namespace
se että kertoisit millä rivillä virhe oli auttaisi asiaa. No, ensinnäkin nuo ensimmäiset rivit eivät ole minkään subin tai funktion sisällä.
Vika on rivillä: If Str.CanRead Then
Testieni mukaan jos kommentoin sen rivin ja end ifin(
'If Str.CanRead Then 'bring stream into a byte array Dim bStr(Str.Length) As Byte 'bStr = New Byte(Str.Length) Str.Read(bStr, 0, Int(Str.Length)) 'play the resource PlaySound(bStr, IntPtr.Zero, SND_ASYNC Or SND_MEMORY) 'End If
, niin tulee taas ajonaikainen virhe, tällä kertaa riville Dim bStr(Str.Length) As Byte.
tuomas kirjoitti:
No, ensinnäkin nuo ensimmäiset rivit eivät ole minkään subin tai funktion sisällä.
Vika ei ole siinä, selvensin asian.
Vika voisi olla siinä, että stramissa ei ole mitään, jolloin sen pituus on null... vika on siis stramin luomisessa:
Dim Str As Stream = _
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strNameSpace + "." + wav)
Mitäköhän tuosta mahtaa syntyä?
Antti kirjoitti:
Vika voisi olla siinä, että stramissa ei ole mitään, jolloin sen pituus on null... vika on siis stramin luomisessa:
Niin minäkin ajattelin
Antti kirjoitti:
Dim Str As Stream = _
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strNameSpace + "." + wav)Mitäköhän tuosta mahtaa syntyä?
Merkkijono,jossa on namespace ja sitten resurssin nimi. Ei kyllä toiminut, vaikka vaihdoin muotoon
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("DefaultNamespace." & wav)
tai
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("DefaultNamespace.MainForm." & wav)
Juice kirjoitti:
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("DefaultNamespace.MainForm." & wav)
Olen joskus haukkunut .NETiä monimutkaiseksi, kömpelöksi, sekavaksi ja eritoten pitkäksi. Kiva nähdä ihan näin käytännön tasolla, että syytökseni eivät ole olleet perusteettomia :)
Voisit kokeilla testata sen Streamin onko se luotu:
if Not Str is Nothing...
En jaksanut nyt pähkäillä voisiko sen hakea resursseista jollain muulla tavalla...liian aikaista ja sorvi kutsuu...
Blaze: Totta toriset - toisaalta, VB.NETin syntaksin tuominen lähemmäksi C:tä on hyvä idea koska näin kirjastot on samat ja mahdollisuudet suuremmat...
Antti kirjoitti:
Totta toriset - toisaalta, VB.NETin syntaksin tuominen lähemmäksi C:tä on hyvä idea koska näin kirjastot on samat ja mahdollisuudet suuremmat...
Ja hyppäys VB.NETistä C.hen (ja toisinpäin) on pienempi.
EDIT:Itse asia unohtui. Str = Nothing tuotti Truen, joten pitääpä tarkkailla tota striimin luontia.
Äh, tympii noiden resurssien kanssa painiminen. Laitan ne joskus myöhemmin, ratkaisin sen System.AppDomain.CurrentDomain.BaseDirectory.ToString:llä (ex-App.Path :P)
Oletko kuullut Application luokasta?
Antti kirjoitti:
Oletko kuullut Application luokasta?
Joo, Application.StartupPath.
Aihe on jo aika vanha, joten et voi enää vastata siihen.