Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: #Develop, resurssit ja WAV

Sivun loppuun

Juice [04.10.2004 21:00:48]

#

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 :)

Juice [06.10.2004 18:10:21]

#

Eikö kukaan tiedä :(

Juice [06.10.2004 19:26:18]

#

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

tuomas [06.10.2004 19:34:31]

#

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ä.

Juice [06.10.2004 20:17:21]

#

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.

Antti [06.10.2004 22:31:15]

#

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ä?

Juice [07.10.2004 18:59:25]

#

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)

Blaze [07.10.2004 19:33:39]

#

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 :)

Antti [08.10.2004 08:28:11]

#

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...

Juice [08.10.2004 18:55:02]

#

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.

Juice [08.10.2004 20:10:55]

#

Äh, tympii noiden resurssien kanssa painiminen. Laitan ne joskus myöhemmin, ratkaisin sen System.App­Domain.­Cur­rent­Domain.­Ba­se­Direc­to­ry.­To­String:llä (ex-App.Path :P)

Antti [08.10.2004 21:59:59]

#

Oletko kuullut Application luokasta?

Juice [09.10.2004 19:53:07]

#

Antti kirjoitti:

Oletko kuullut Application luokasta?

Joo, Application.StartupPath.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta