Probleme mit DLL
-
Sagt mal kann es sein dass DLL's richtig
scheisse
sind ??
Ich habe nur Probleme damit: z.B. Das Programm stürzt ab mit einer Speicherschutzverletzung. Ich grenze den Fehler bis auf 2 - 3 Zeilen ein, obwohl ich da nirgens einen Fehler sehe. Ich setzte also Breakpoints und siehe da, folgendes Szenario:
Methode a ruft Methode b auf. Ich setzte einen Breaktpoint in der Methode a und zwar unmittelbar nach dem Aufruf von Methode b. Scheisse, das Programm stürtzt vorher ab. Ok dann setzte ich einen weiteren Breakpoint ganz am Ende von Methode b. Nun kommt das unfassbare: Am Ende von Methode b ist noch kein Fehler passiert, doch unmittelbar nach dem Aufruf der Methode b in der Methode a ist der Fehler schon passiert !!! Was soll denn dass ???Höhepunkt der Probleme war dann eine Fehlermeldung in der Art:
Die Anweisung in "0x00f5d39c" verweist auf Speicher "0x00f5d39c" oder teilweise noch besser:
Die Anweisung in "0x00000000" verweist auf Speicher "0x00000000"Wenn das Programm dann als normales Projekt compiliere verläuft alles wunderbar...
So eine Gottverdammte Scheisse !!!!!!!!!!!!!
-
Zeig lieber Code anstatt hier rumzuschreien
-
wenn du an der letzten anweisung von b angekommen bist, dann stepp mit StepIn (F11 beim VC++) weiter, du kommst dann in die destruktoren der einzelnen objekte, die du instaziert hast. Ich denke, in irgendeinem destruktor hauts dich raus.
-
@Mad
Ich verstehe, dass es einfacher ist, wenn man etwas code dazu sehen kann, doch das Problem ist, dass es über 1000 Zeilen Code sind, und auschnitte daraus bringen eigentlich nicht viel, denn es fängt immer erst dann an, komisch zu tun, wenn es mehr als 500 - 600 Zeilen Code sind. Vielleicht hat ja auch er verdammte MSV++ 6.0 ein Problem damit. Es ist mir auch aufgefallen, dass nach ca. 600 Zeilen Code einfach die Synthax - Vervollständigung ausfällt, obwohl Synthaktisch alles korrekt ist und sich auch problemlos kompilieren lässt.Nun wie dem auch sein, ich zeige die Beiden Funktionen, um die es geht:
// ---------------------- private Method to setup the DirectX - Environment ------------------- void K2D_Kyroforce2D::setup(bool bInit){ // declare and init local variables D3DPRESENT_PARAMETERS d3dpp = {0}; char pBuf[96]; bool bSuccess = false; // set the Window - Mode as acquired (d3dpp.Windowed = this->bWindowed) ? SetWindowLong(this->hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW) : SetWindowLong(this->hWnd,GWL_STYLE,WS_SYSMENU|WS_POPUP); // setup the D3DPRESENT_PARAMETERS struct d3dpp.hDeviceWindow = this->hWnd; d3dpp.FullScreen_RefreshRateInHz = d3dpp.Windowed ? 0 : this->refreshRate; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.BackBufferCount = 1; d3dpp.BackBufferWidth = d3dpp.Windowed ? 640 : this->backBufferWidth; d3dpp.BackBufferHeight = d3dpp.Windowed ? 480 : this->backBufferHeight; d3dpp.BackBufferFormat = d3dpp.Windowed ? D3DFMT_UNKNOWN : static_cast<D3DFORMAT>(this->format); d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D16; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // create a dynamic C - String for the Log - File if(this->bWindowed) sprintf(pBuf,"Ein <strong>IDirect3DDevice9 (%i x %i %i Hz Fenster)</strong> Objekt wird %s",640,480,60,(bInit || this->bRecreateDev) ? "erzeugt" : "reinitialisiert"); else sprintf(pBuf,"Ein <strong>IDirect3DDevice9 (%s %s Vollbild)</strong> Objekt wird %s",this->getDisplayModeString(),this->format == _16Bit ? "16-Bit" : "32-Bit",(bInit || this->bRecreateDev) ? "erzeugt" : "reinitialisiert"); // release the Direct3DDevice9 - Object if necessary //this->addLogEntry("Status des bRecreateDev - Flag",0x00,this->bRecreateDev); if(this->bRecreateDev && this->pDev){ this->pDev->SetTexture(0,0x00); this->pDev->Release(); this->addLogEntry("Ein <strong>IDirect3DDevice9</strong> Object wird freigegeben",this->pDev,true); this->pDev = 0x00; this->bRecreateDev = false; } else if(this->pDev) bSuccess = SUCCEEDED(this->pDev->Reset(&d3dpp)); // create a IDirect3DDevice9 Object if necessary if(bInit || this->bRecreateDev) bSuccess = SUCCEEDED(this->pD3D->CreateDevice(this->adapter,static_cast<D3DDEVTYPE>(this->deviceType),this->hWnd,static_cast<DWORD>(this->vrtProcess),&d3dpp,&thi s->pDev)); // write the appropriate Log - Entry this->addLogEntry(pBuf,this->pDev,bSuccess); if(!bError){ // set the flexible Vertex - Format this->pDev->SetFVF(D3DFVF_XYZ|D3DFVF_TEX1); // set some render states this->pDev->SetRenderState(D3DRS_COLORVERTEX,false); this->pDev->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT); this->pDev->SetRenderState(D3DRS_LIGHTING,true); this->pDev->SetRenderState(D3DRS_AMBIENT,0xffffffff); this->pDev->SetRenderState(D3DRS_ALPHABLENDENABLE,true); this->pDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); this->pDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); // set some texture stage states this->pDev->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE); this->pDev->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_CURRENT); this->pDev->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE); this->pDev->SetTextureStageState(0,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_COUNT2); } // show the window SetWindowPos(this->hWnd,HWND_TOP,0,0,640,480,SWP_NOMOVE|SWP_FRAMECHANGED); ShowWindow(this->hWnd,SW_SHOW); this->addLogEntry("Bevor die void K2D_Kyroforce2D::setup(bool bInit) Methode zurückkehrt",0x00,true); // Diese Zeile wird noch ausgeführt } // --------------------------- resetting the Direct3D - Environment --------------------------- void K2D_Kyroforce2D::reset(void){ this->addLogEntry("Bevor die void K2D_Kyroforce2D::setup(bool bInit) Methode aufgerufen wird",0x00,true); this->setup(false); this->addLogEntry("Nachdem die void K2D_Kyroforce2D::setup(bool bInit) Methode zurückkehrt",0x00,true);// Diese Zeile wird nicht mehr ausgeführt wegen einer Speicherschutzverletzung, die vorher entsteht... if(!this->bError){ // set the VertexBuffer as the current this->pDev->SetStreamSource(0,this->pVB,0,sizeof(Vertex)); // reqcquire the Keyboard and Mouse this->pKeyboard->Acquire(); this->pMouse->Acquire(); } } // --------------------------------------------------------------------------------------------
[ Dieser Beitrag wurde am 25.05.2003 um 19:43 Uhr von Ishildur editiert. ]
-
Original erstellt von dEUs:
wenn du an der letzten anweisung von b angekommen bist, dann stepp mit StepIn (F11 beim VC++) weiter, du kommst dann in die destruktoren der einzelnen objekte, die du instaziert hast. Ich denke, in irgendeinem destruktor hauts dich raus.gelesen??
-
Original erstellt von dEUs:
gelesen??jo
-
Siest du irgendwo ein lokales Objekt, dass einen Destruktor haben könnte ???
-
D3DPRESENT_PARAMETERS ist eine C-Struktur und hat folgedessen keinen Destruktor...
-
Hat diese struktur irgendwelche member, die nen dtor haben? strukturen haben ürbigens seit c++ auch dtors!
-
@dEUs
Ja, doch dies ist eine C-Struktur, die haben doch keine Destruktoren ??typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth, BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;Ausserdem: Wenn ich genau denselben Code in einem gewöhnlichen Win32 Projekt kopiliere, dann funktioniert auch alles, nur in diesen verflixten DLL's habe ich nur Probleme...
-
Klassen in DLLs... Tsetsetse
Das führt sowieso nur zu Problemen.
Machs z.B. als statische .lib, das kommt beim Ausführen (für deinen konkreten Fall) aufs selbe raus, außer dass dabei Klassen nicht nachträglich reingehackt wurden.
Oder nimm gleich COM. Das ist wirklich für Klassen gedacht.Warum schreibst du eigentlich überall this-> vor die Elementvariablen? Das ist irgendwie sinnlos und eher verwirrend als hilfreich (genauso wie die Präfixe).
-
Bist Du sicher, dass unten genannte Zeichenkette in pBuf[96] überhaupt reinpasst?
char pBuf[96]; sprintf(pBuf,"Ein <strong>IDirect3DDevice9 (%s %s Vollbild)</strong> Objekt wird %s",this->getDisplayModeString(),this->format == _16Bit ? "16-Bit" : "32-Bit",(bInit || this->bRecreateDev) ? "erzeugt" : "reinitialisiert");
-
Nur so nebenbei:
aus MSDN:
StringCbPrintf is a replacement for sprintf
-
@ D@niel
Allerdings frage ich mich, wozu man für eine Coca-Cola-Flasche eine 5cm dicke Schaumstoffummantelung braucht, nur weil 0,1% der Bauarbeiter nicht in der Lage sind, ihre Flaschen festzuhalten, wenn sie 10m über der Erde was trinken wollen.