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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

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

Beitrag 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
-.-"
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag 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.
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag 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?
-.-"
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
Zuletzt geändert von ts-soft am 02.06.2005 20:02, insgesamt 2-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

In der PB Hilfe steht aber:
- DirectX Initialisierungsroutinen dürfen nicht innerhalb der AttachProcess Prozedur geschrieben werden.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kein Problem, habs gerade gelesen, werde es nochmal anpassen

[edit]Ist angepasst, siehe oben[/edit]
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten