Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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:
Quellcode: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

zum Seitenanfang zum Seitenende 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.

zum Seitenanfang zum Seitenende 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:
Quellcode: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

zum Seitenanfang zum Seitenende 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!

zum Seitenanfang zum Seitenende Profil || Suche