000
17.08.2001, 21:18
TheTinySteini
|
Ok, Jungs, ich wende mich jetzt vertrauensvoll an die C++-Cracks hier. Ich möchte gerne die fmod.dll (ihr wisst schon, die mit der man mp3s abspielen kann) nicht per fmodvc.lib bereits im VC++-Projekt einbinden, sondern zur Laufzeit mit LoadLibrary und GetProcAddress laden. Das ganze funktioniert auch schon, aber ich habe dabei einen sehr seltsamen Fehler: Ich benutze 2 Variablen, um MP3-Dateinamen zu speichern, song und song2, jeweils so in der main() erstellt: char song[] = "1.mp3"; char song2[] = 2.mp3"; Gut. Nun lade ich also die FMod-Funktionen, und was muss ich bestürzt feststellen? Eine der FMOD-Initialisierungsfunktionen scheint irgendwie auf den Speicherbereich dieser chars zuzugreifen, jedenfalls werden sie verändert, bevor ich sie überhaupt an die Abspielroutine übergeben kann. Gut, ich habe also den Debugger angeschmissen und die Strings verfolgt. Genau hier werden sie verändert:
00401227 push 0 00401229 call dword ptr [pFMOD+10h (00404840)] 0040122F add esp,4 81: pFMOD.INIT( 44100, 1, 0 ); 00401232 push 0 <--- hier! 00401234 push 1 00401236 push 0AC44h 0040123B call dword ptr [pFMOD+14h (00404844)] 00401241 add esp,0Ch Na das erklär mir jetzt mal jemand! Dort, wo er den ersten Parameter für die Funktion auffen Stack schiebt, verändert er die Strings? Davon steht doch gar nix im Assemblercode! */me is confused* Ich kann es mir eigentlich nur so erklären, dass er wohl den Streambuffer dort in die Region legt. Aber eigentlich sollte er das nicht tun, denn song2 z.B. liegt bei 0x0063fddc, der Stream Pointer ist dort noch nicht initialisiert, und pFMOD.INIT liegt bei 0x1001af56 (0x00404844 ist die Pointeradresse).
Guckt es euch am besten selber an: fmod.zip. Es handelt sich nur um ein kleines Testprogramm inklusive Projektumgebung und fmod.dll, ihr müsst einfach nur zwei MP3s als 1.mp3 und 2.mp3 in das Projektverzeichnis kopieren.
Hoffentlich hat jemand von euch Lust, mit mir zusammen den Fehler zu finden - wäre echt nett! Vielleicht habe ich ja auch nur irgendwo ein absolutes faux-pas begangen, und hab es bisher nicht gemerkt (wäre fast zu schön, um wahr zu sein).
Ok, vielen vielen vielen Dank schonmal im Voraus, ihr würdet mir echt helfen (und auch Poke646 ein gutes Stück professioneller machen - ihr kriegt auch nen Eintrag in der Readme!).
PS: Es gibt noch einen weiteren Fehler, der in dem Zusammenhang auftritt: Das ganze lässt sich nicht per FreeLibrary entladen :-/ Aber lasst uns der Reihe nach die Probleme lösen, erstmal hat das oben geschilderte Priorität!
--
TheTinySteini Coder Poke646 "Don't Panic" - Hitchhiker's Guide to the Galaxy
|
|
Profil || Suche
|
001
17.08.2001, 21:54
Prefect
|
Also, ich hab mir die .zip mal runtergeladen, aber da ich grad in Linux bin, wird die Diagnose auf sich warten lassen.
Ansonsten kann da eigentlich was nicht stimmen. Überprüf mal deine Stackpointer usw. auf Sanity. Überschreibt das push evtl. die Strings? Es kann ja eigentlich nicht an irgendwelchen Streams oder durch Interrupts ausgelösten Dingen liegen wenn du debuggst.. (probier mal, zwischen den einzelnen Steps unterschiedliche Zeiten zu warten; wenn das was veränderst hast du in der Tat ein Problem).
Dann: auf welche Art wird der String denn verändert? Wieviele Bytes werden verändert, und auf welche Werte werden sie gesetzt?
Achja, Windows wäre es außerdem zuzutrauen, dass das Stacksegment SS irgendwie wild in der Gegend rumfliegt.. ich hoffe, das ist nicht der Fall.
cu, Prefect
--
Widelands - Gemütliche Aufbaustrategie, Free Software Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.
|
|
Profil || Suche
|
002
17.08.2001, 22:50
TheTinySteini
|
Whoohoo, Prefect ist der Größte!
Nach einer längeren Chat-Diskussion haben wir herausgefunden, dass die Funktionspointer-Deklarationen falsch waren. So müssen sie wirklich heißen:
struct fmod_funcs { signed char (_stdcall * SECB) (FSOUND_STREAM *stream, FSOUND_STREAMCALLBACK callback, int userdata); signed char (_stdcall * SCL) (FSOUND_STREAM *stream); signed char (_stdcall * SOP) (int outputtype); signed char (_stdcall * SBS) (int len_ms); signed char (_stdcall * SDRV) (int driver); signed char (_stdcall * INIT) (int mixrate, int maxsoftwarechannels, unsigned int flags); FSOUND_STREAM * (_stdcall *SOF) (const char *filename, unsigned int mode, int memlength); int (_stdcall * SPLAY) (int channel, FSOUND_STREAM *stream); void (_stdcall * CLOSE) ( void ); } pFMOD;
(man beachte das zusätzliche _stdcall!)
Vielen Dank!
--
TheTinySteini Coder Poke646 "Don't Panic" - Hitchhiker's Guide to the Galaxy
|
|
Profil || Suche
|
003
18.08.2001, 00:21
Another1
|
ui, immer diese dummen aufrufskonventionen =P wenigstens funzt es jetzt =)
--
Another1
...relaxing..atm =) ... und Schweiz suckt!
|
|
Profil || Suche
|