Citat:
X Files: Samo da napomenem da ceo VCL nije "dll safe"...
Upotrebu VCL-a unutar DLL-a treba svesti na najmanju moguću meru, po mogućstvu sasvim isključiti kako u kodu tako i u 'čekiranju' u DLL Wizardu. Postoji istorijat misterioznih AV-a kada je VCL uključen u DLL.
Po mom iskustvu, čak i kada u kodu nije bilo ni jedne jedine linije VCL koda, ali kada je VCL ostalo čekirano u DLL Wizardu, znalo je da proizvede probleme sa AV-ima i Stack-om . Slično je i sa čekiranjrm za Multithreaded podršku (odnosno da li će biti linkovan cc3260mt.dll ili cc3260.dll)
U principu, možda u konkretnom slučaju nije to u pitanju ali vredi pokušati da se napravi par TEST dll sa čistim API-jima i sa tim različitim header situacijama da se utvrdi do čega je.
Možda ne bi bilo loše da se vidi i proba neko minimalno parče koda.
već sam pomislio i na to, no nikada još nisam imao problema s time. ovdje mi je nadasve i cilj upotrijebiti vcl funkcionalnost tj. što više ju pojednostaviti za neke konzolne aplikacije (i u drugim razvojnim okruženjima). Primjerice:
Code:
//"MojeDllFunkcije.h"
#include <windows.h>
extern "C" void __declspec(dllexport) __stdcall _GetRezolucija(int *x, int *y);
void GetRezolucija(int* x, int* y)
{
HINSTANCE MojDll;
typedef void(*__stdcall pGetRezolucija)(int*, int*);
pGetRezolucija _pGetRezolucija;
if((MojDll = LoadLibrary("MojDll.dll"))==NULL)
{
MessageBox(0,"DLL nije moguce pronaci!", "Greska", 0);
return;
}
if((_pGetRezolucija = (pGetRezolucija)GetProcAddress(MojDll, "_GetRezolucija"))==NULL)
{
MessageBox(0, "U DLL-u nema te funkcije!", "Greska", 0);
return;
}
_pGetRezolucija(x, y);
FreeLibrary(MojDll);
}
sadržaj dll-a...
Code:
//DllMain.cpp
#include <vcl.h>
#include <windows.h>
#include "MojeDllFunkcije.h"
void __stdcall _GetRezolucija(int *x, int *y)
{
*x = Screen->Width;
*y = Screen->Height;
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
..i aplikacija:
Code:
#include <iostream.h>
#include "MojeDllFunkcije.h"
int main(int argc, char* argv[])
{
int x, y;
GetRezolucija(&x, &y);
cout << x << "x" << y;
cin.ignore();
return 0;
}
Ako iz MojeDllFunkcije.h prebacim cijelo tijelo funkcije GetRezolucija u ovaj cpp od aplikacije onda nema access violationa, a ako ostane u header-u tj. na ovaj način onda ima...
[Ovu poruku je menjao itf dana 27.05.2008. u 12:32 GMT+1]