Seite 1 von 1

DLL {Dummheit zu gross, um selber eine Lösung zu finden}

Verfasst: 01.06.2005 19:54
von Green Snake
hallo

habe irgendwie ein volles blackout.
ich habe tailbite, mit dem mann ja userlibrary erstellen kann.

dieser code wird zur userlibrary gemacht

Code: Alles auswählen

ProcedureDLL InitSound_ABC()
  If OpenLibrary(0,"Sound_ABC.dll") = 0
    MessageRequester("Sound_ABC - Error","",0)
    End
  EndIf
EndProcedure

ProcedureDLL LoadABCSound(Sound,Pfad$)
  CallFunction(0,"ABC",Sound,Pfad$)
EndProcedure
dan dieser, wird zur Sound_ABC.dll gemacht

Code: Alles auswählen

ProcedureDLL LoadABCSound(Sound,Pfad$)
  LoadSound(Sound,Pfad$)
EndProcedure
und schliesslich benutze ich diesen code, der das ganze benützt

Code: Alles auswählen

InitSound()
InitSound_3()
LoadABCSound(0,"AAA.wav")
PlaySound(0)
MessageRequester("","",0)
was geschehen soll

diese codes sollen den Sound AAA.wav laden, und dann abspielen, als wait effekt, sollte eine msgbox kommen.

wieso geht das nicht?
muss ich das zeugs irgendwie anders machen?

ps. dieser code ist nicht mein projekt, habe ihn nur als beispiel mal gemacht, jedoch funzt er nicht :allright:


edit:

liegt es daran, das die dll funktion dann die gleiche ist wie die userlibrary funktion?
ich denke nicht, habe ich auch schon ausprogbiert, ging aber doch nicht

Verfasst: 02.06.2005 15:21
von Spirit
Die DLL ist an sich ein eigenständiges Programm. Du benutzt jetzt in der DLL einen Befeht, der DirectX benötigt, was du natürlich vorher initialisieren musst (mit InitSound()). Das hast du zwar in dem Programm getan, das die DLL benutzt, doch da die DLL unabhängig vom Programm ist, das sie aufruft, ist es in der DLL nicht initialisiert. Ich bin mir aber nicht ganz sicher, ob man in einer DLL überhaupt DirectX initialisieren kann.

Verfasst: 02.06.2005 16:17
von Green Snake
hallo

dh. in der dll initsound oben hinknallen. :wink:
werds mal probieren, und wenns nicht geht?
aber wurumm kan mna dann, nach deiner meinung, kein directx benutzen?

Edit:
doch, das kann man.
ich habe mal mein ganzes spiel spassens halber in ne dll gepackt, un dann die funktion mit einer clientr exe aufgerufen, und alles ging reibungs los.
aber an was kann es dann liegen?

Verfasst: 02.06.2005 19:44
von Spirit
Green Snake hat geschrieben: aber wurumm kan mna dann, nach deiner meinung, kein directx benutzen?
Vor einiger Zeit, als ich noch ein Anfänger war, hatte ich das Problem auch mal. Aber mit meiner wenigen Erfahrung habe ich es damals nicht hinbekommen und seitdem habe ich es nie wieder probiert. Wenn du InitSound() in der DLL verwendest, solltest du aber dafür eine extra Funktion in die DLL schreiben (sonst wird jedesmal, wenn die LoadABCSound()-Funktion aufgerufen wird, versucht DX neu zu initialisieren) und außerhalb einer Prozedur darf (außer Variablendefinitionen usw.) nichts stehen.

Verfasst: 02.06.2005 19:47
von ts-soft
Code UserLibrary:

Code: Alles auswählen

ProcedureDLL InitSound_ABC()
  Global DLL
  DLL = OpenLibrary(#PB_Any,"SoundABC.dll")
  If DLL
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
EndProcedure

ProcedureDLL LoadABCSound(Pfad$)
  ProcedureReturn CallFunction(DLL, "LoadABCSound_", Pfad$)
EndProcedure

ProcedureDLL DeInitSound_ABC()
  If DLL : CloseLibrary(DLL) : EndIf
EndProcedure
Code DLL:

Code: Alles auswählen

ProcedureDLL LoadABCSound_(Pfad$)
  Static IsInit
  If IsInit = 0 : IsInit = InitSound() : EndIf
  ProcedureReturn LoadSound(#PB_Any, Pfad$)
EndProcedure 
Code Test

Code: Alles auswählen

If InitSound()
  If InitSound_ABC()
    sound = LoadABCSound("abc.wav")
    PlaySound(sound)
    MessageRequester("","")
    DeInitSound_ABC()
  EndIf
EndIf
Ich hoffe, so meinst Du es :)

geändert Danke für den Hinweis

Verfasst: 02.06.2005 19:53
von Spirit
In der PB Hilfe steht aber:
- DirectX Initialisierungsroutinen dürfen nicht innerhalb der AttachProcess Prozedur geschrieben werden.

Verfasst: 02.06.2005 19:59
von ts-soft
Kein Problem, habs gerade gelesen, werde es nochmal anpassen

[edit]Ist angepasst, siehe oben[/edit]