PDA

View Full Version : [C/C++]problema msvcr90d.dll


m.distrutti
31-03-2008, 21:29
provo a spiegarvi senza stampare il codice

ho esteso una semplicissima applicazione win32 con una funzione di render

in pratica il loop dei messaggi prima era un ciclo GetMessage,
ora contiene il PeekMessage che non appena restituisce il controllo al programma nel caso non abbia trovato nulla nella coda messaggi richiama la funzione render() nella quale le uniche funzioni d3d9 usate dei relativi device sono : Clear e Present(e la funzione di cleanup Release dopo essere uscito dal ciclo in seguito ad un messaggio WM_QUIT)

appena ho implementato questa funzione la compilazione va a buon fine ma appena tento di eseguire l'applicazione mi da errore di DLL non trovata >.>
la dll esatta e' :
msvcr90d.dll

ho provato a capire l'utilita di questa dll ma non so ne come (e da dove ) inserirla e a cosa serve(l'unica cosa che mi e' sembrato di aver capito che serve per il debug di qualcosa :S)

il compilatore che uso e' Visual Studio 2008
grazie in anticipo ^_^

m.distrutti
05-04-2008, 10:32
scusate l'up :mc: :mc: :mc:
ma sono bloccato ancora in questo programma Q_Q vi riporto il codice cmq magari provate a eseguirlo voi :S(con directX 9.0 sdk installate pero)
non capisco proprio :S

se dovessi provare a cambiare ed interfacciarmi alle librerie in C# quella dll viene richiamata lo stesso vero?


#include <windows.h>
#include <d3d9.h>

//header
bool initWindow(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

bool initDirect3D(void);
void render(void);
void cleanUp(void);

//global variables
HINSTANCE hInst;
HWND wndHandle;

//variables
LPDIRECT3D9 pD3D; //the Direct3D object
LPDIRECT3DDEVICE9 pd3dDevice;//the Direct3D device

/*...Entry Point Application...*/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow){
//body of window form
if(!initWindow(hInstance)){
return false;
}

if(!initDirect3D())//this function creates a direct3D object & device
return false;

MSG msg;
ZeroMemory(&msg, sizeof(msg));

while(true){
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)){
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}else//if there is no message render all
render();
}
cleanUp();
return (int) msg.wParam;
}

bool initWindow(HINSTANCE hInstance){
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("DirectXExample");
wcex.hIconSm = 0;

RegisterClassEx(&wcex);

wndHandle = CreateWindow(TEXT("DirectXExample"),
TEXT("DirectXExample"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
480,
NULL,
NULL,
hInstance,
NULL);
if(!wndHandle)
return false;

//Display the window on the Screen
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
}

//window procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

bool initDirect3D(void){
pD3D = NULL;
pd3dDevice = NULL;

if((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return false;
//fill the presentation parametre structure
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferWidth = 640;
d3dpp.hDeviceWindow = wndHandle;

if(FAILED( pD3D->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
wndHandle,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&pd3dDevice)))
return false;
return true;

}

void render (void){
//check to make sure you have a valid Direct3D device
if(pd3dDevice == NULL)
return;
//clear the back buffer to a blue color and presents it into the main screen

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
pd3dDevice->Present(NULL, NULL, NULL, NULL);
}

void cleanUp(void){
//Release the device and the Direct3D object
if(pd3dDevice != NULL)
pd3dDevice->Release();

if(pD3D != NULL)
pD3D->Release();
}

Tommo
05-04-2008, 10:39
Non ti basta copiare la dll nella cartella dell'eseguibile? :mbe:

Cmq non ti so dire cosa faccia esattamente, credo che sia collegata a VC++...

m.distrutti
05-04-2008, 10:51
Non ti basta copiare la dll nella cartella dell'eseguibile? :mbe:

Cmq non ti so dire cosa faccia esattamente, credo che sia collegata a VC++...

le soluzioni riportate anche dalla msdn se non sbaglio stanno al fatto che che devo compilare in modalità Release e non Debug ma facendo questo mi
riporta degli errori durante il Link(la compilazione sempre corretta)

------ Build started: Project: winF, Configuration: Release Win32 ------
Linking...
winmain.obj : error LNK2001: unresolved external symbol _Direct3DCreate9@4
C:\Documents and Settings\Kayne\Documenti\Visual Studio 2008\Projects\Project1\Project1\winF\Release\winF.exe : fatal error LNK1120: 1 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Kayne\Documenti\Visual Studio 2008\Projects\Project1\Project1\winF\winF\Release\BuildLog.htm"
winF - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

non ho provato a metterla nella directory perche gia immagino che se metto quella poi non ne trova un altra e in qualsiasi caso sto cercando di capire quale e' il problema :muro:

stdecden
05-04-2008, 10:51
Si, dovrebbe essere la dll di runtime(debug) di visual c++ 9 (2008)

Tommo
05-04-2008, 11:00
Il problema è che manca quella DLL... l'exe dovrebbe averla a disposizione...

stdecden
05-04-2008, 11:31
Il problema è che manca quella DLL... l'exe dovrebbe averla a disposizione...

Hai provato a cercarla nel tuo computer e a copiarla nella cartella del eseguibile. Se hai vc++ da qualche parte ci dovrá pur essere

m.distrutti
05-04-2008, 11:40
appena fatto ma non funziona, la dll esiste nelle sottodir

di VS

\VC\cl\dll\<in tutte le sotto dir di questa directory>

e di Windows
\WINDOWS\WinSxS\<nelle cartelle di Debug CRT>

>_<'

EDIT:ho riprovato nelle due compilazioni con la dll nella stessa dir ma nulla...

m.distrutti
05-04-2008, 12:12
prova a metterla nella cartella di windows...

questo e' l'errore se la copio li :S

http://img187.imageshack.us/img187/7269/errorexj3.jpg

stdecden
05-04-2008, 12:32
Copiala sotto C:\windows\system32\

m.distrutti
05-04-2008, 12:36
Copiala sotto C:\windows\system32\

sisi gia fatto anche quello con tutte le altre dll se aspettate un sec
hosto e posto l'immagine dell'errore, era diverso la dentro:mc:

m.distrutti
05-04-2008, 12:38
no adesso e' identico al precedente errore postato io non ci sto piu capendo nulla >_<'

m.distrutti
05-04-2008, 14:43
strano... forse si è corrotto il file... ma te lo fa solo con questo progetto o anche con altri progetti?

ho provato a fare altri progetti di finestre e me le esegue , poi in un altro ancora ho rieseguito lo stesso codice per colorare la finestra con le directX e sta volta in questo progetto da questo errore

not found or not built by the last incremental link; performing full link

m.distrutti
05-04-2008, 14:44
sta facendo di tutto per non farmi usare le librerie sto compilatore:D

m.distrutti
05-04-2008, 15:32
disinstallo il compilatore che metto il 2005, cosi ho la scusa di mettere XNA >.>'