Probleme mit DLL
-
@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.