[ itf @ 02.03.2006. 17:05 ] @
Htio bih napraviti obican DLL, ali uvijek mi za svaku funkciju javi Bad Calling convention. Znam sto je to, ali ne kuzim u cemu je greska. Ovo bi mi radilo na VS 2003. Molim pomoc. Zahvaljujem

Code:
#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

extern "C" double __declspec(dllexport) Suma(double a, double b){
    return a + b;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif


Problem nije u prevodjenu. Problem nastaje kada funkciju Suma treba pozvati npr. iz nekog EXE programa. Tad javlja bad calling convention


[Ovu poruku je menjao itf dana 02.03.2006. u 18:15 GMT+1]
[ leka @ 03.03.2006. 13:24 ] @
Da li, kada koristis taj DLL, koristis u deklaraciji te funkcije __declspec(dllimport) ?
[ itf @ 03.03.2006. 13:55 ] @
Citat:
leka: Da li, kada koristis taj DLL, koristis u deklaraciji te funkcije __declspec(dllimport) ?

Ne. A zasto? Nikad to nisam koristio a uvijek mi je sve radilo. Ovaj isti kod dobro radi kada se Dll compilira pod VS 2003. Tada mi ne javlja gresku da je kriva konvencija poziva, ali ako ovaj kod prevedem u VS 2005 tada mi kada zelim pozvati tu funkciju iz nekog C++ ili VB programa izbaci "bad calling convention".

Zanima me sto se tocno promjenilo u VS 2005 pa da vise stari kod ne daje iste rezultate kao u VS 2003?

[Ovu poruku je menjao itf dana 03.03.2006. u 14:57 GMT+1]
[ NrmMyth @ 03.03.2006. 20:41 ] @
Mislim da je pojacana podrska standardu.
[ Dragi Tata @ 03.03.2006. 20:53 ] @
Probaj da dodaš "WINAPI" deklaraciji.
[ SambucusELF @ 18.02.2007. 11:39 ] @
ok,

Citat:
leka: Da li, kada koristis taj DLL, koristis u deklaraciji te funkcije __declspec(dllimport) ?


kako to uopste?

kako se poziva dll iz c++ programa?

jel dovoljno da stavim header tog dll-a u program, deklarisem ga i pozovem,

radim u gcc kompajleru na win32 platformi u Dev-C++
[ SambucusELF @ 18.02.2007. 11:51 ] @
ok, skontao sam sam... hvala na potencijalnom odgovoru...


marko
[ SambucusELF @ 21.02.2007. 12:31 ] @
jos jedan dodatak + jedno pitanje...

pozivanje dll -a mi je pomoglo da skontam kako to generalno funkcionise, ali sta se desava
kad hocu da pozovem nesto sto treba da radi sa pointer-om

dakle, proceduri za zbir se proslede dva pointera do objekata klase koja sadrzi samo
konstruktor, desktroktor, i metode za upis i citanje jedine promeljive - int broj;

i dll i program imaju ubacen header file klase u kojoj joj je deklaracij, a definicija klase se ubacuje na kraju
header file-a sa deklaracijom, komandom #include.

kompajliraju se i program i dll. iskopiram dll gde je program i to ne radi...

pretpostavljam da je zbog toga sto promenljivu u kojoj je rezultat inicijalizujem

ovako u proceduri:
Code:

DllClass::DllClass(){
Celi* sadrzaj = new Celi(); 
}

i ovako unistavam:

DllClass::~DllClass()
{
delete(sadrzaj);
sadrzaj=NULL;
}


...

mozda bi trebalo tamo gde je DLL_ATTACH_PROCESS:
i
DLL_DETACH_PROCESS:
.

Ovo ne moze da se odradi u proceduri u kojoj se racuna zbir posto ona vraca pointer,
pa posle ne mogu da ga obrisem, a necu da napravim memory leak;

probacu kad dodjem kuci ovu drugu varijantu, ali ... da li do tada ima nekih novih saveta?

Poslacu i ceo kod kad dodjem kuci, ako treba.