Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Još jedno pitanje u vezi Runtime Linkinga...

[es] :: C/C++ programiranje :: Još jedno pitanje u vezi Runtime Linkinga...

[ Pregleda: 2617 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Još jedno pitanje u vezi Runtime Linkinga...12.09.2005. u 23:03 - pre 226 meseci
Samo da još pitam ovo:

Ako pri korištenju DLL-a koristim runtime linking kako da napravim instancu neke klase koja se nalazi u tom dll-u?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...13.09.2005. u 05:44 - pre 226 meseci
Pogledaj ovde:
http://tinyurl.com/docqr
... ako je to ono sto si trazio.
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.ubisoft.com.cn.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...13.09.2005. u 05:52 - pre 226 meseci
Citat:
Processes explicitly linking to a DLL call GetProcAddress to obtain the address of an exported function in the DLL. You use the returned function pointer to call the DLL function. GetProcAddress takes as parameters the DLL module handle (returned by either LoadLibrary, AfxLoadLibrary, or GetModuleHandle), and either the name of the function you want to call or the function's export ordinal.

Because you are calling the DLL function through a pointer and there is no compile-time type checking, make sure that the parameters to the function are correct so that you do not overstep the memory allocated on the stack and cause an access violation. One way to ensure type safety is to look at the function prototypes of the exported functions and create matching typedefs for the function pointers. For example:
Code:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}

How you specify the function you want when calling GetProcAddress depends on how the DLL was built.

You can only obtain the export ordinal if the DLL you are linking to was built with a module definition (.DEF) file, and if the ordinals are listed with the functions in the EXPORTS section of the DLL's .DEF file. Calling GetProcAddress with an export ordinal, as opposed to the function name, is slightly faster if the DLL has many exported functions because the export ordinals serve as indexes into the DLL's export table. With an export ordinal, GetProcAddress can locate the function directly as opposed to comparing the specified name to the function names in the DLL's export table. However, you should call GetProcAddress with an export ordinal only if you have control over assigning the ordinals to the exported functions in the .DEF file.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 08:30 - pre 226 meseci
Ovaj zadnji post se odnosi na pozivanje funkcije, a ne na kreiranje instance nekog objekta iz DLL-a. X Files, hvala na linku, ali nisam tamo našao što mi treba jer tamo su opisane alternative umjesto DLL-a, a za njega baš ništa... Ako itko zna kako se ovo radi bio bih zahvalan da napiše...

Da li je možda moguće to izvesti da u programu koji koristi DLL deklariram

Variant*

a u DLL-u eksportiram funkciju koja dinamički alocira i vraća adresu te instance? Kasnije napravim cast... Jasno, tad bi memorija bila alocirana u DLL-u, no bolje išta nego...

[Ovu poruku je menjao itf dana 15.09.2005. u 09:47 GMT+1]
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.ubisoft.com.cn.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 09:17 - pre 226 meseci
Pa moraces da pozoves funkciju da bi kreirao bilo sta, sve je tu sto ti treba.
A to sto je alociran objekat u memoriji dll-a, dodaj u klasu nesto ovako:
Code:

void OslobodiMe()
{
    delete this;
}
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 09:55 - pre 226 meseci
Razumijem, ali onda mi uz DLL treba i Header datoteka da bi kasnije mogao pristupiti članovima te klase..., a onda mi se Runtime Linking ne isplati ako imam Header jer mogu napraviti Static Linking...

[Ovu poruku je menjao itf dana 15.09.2005. u 10:56 GMT+1]
 
Odgovor na temu

tosa
上海, 中国

Član broj: 1811
Poruke: 1342
*.ubisoft.com.cn.

ICQ: 14293955
Sajt: https://github.com/milost..


+48 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 10:46 - pre 226 meseci
Svakako ti treba header da bi koristio klasu, za bilo kakav linking.
Ne znam kakav konkretno projekat pravis, mozda bi COM mogao da ti pomogne
ili neka slicna varijanta. Sa COM-om mozes preko OS-a da instanciras klase.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 10:59 - pre 226 meseci
Da. COM rješava stvar.
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16687
*.dip.t-dialin.net.



+7173 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 11:00 - pre 226 meseci
Citat:

Razumijem, ali onda mi uz DLL treba i Header datoteka da bi kasnije mogao pristupiti članovima te klase..., a onda mi se Runtime Linking ne isplati ako imam Header jer mogu napraviti Static Linking...


Kao sto Tosa rece, ne postoji ni jedan nacin da zaobidjes nekakav header - jer za pozive klasa tvoj kompajler mora znati koji su pozivajuci parametri i return tip, kao i sta se u toj klasi zapravo nalazi.

U teoriji mozes to da zaobidjes ako bi napravio ciste ANSI-C funkcije koje bi vracale/prihvatale samo pointere na klasu nesto tipa:

Code:

class MojaKlasa {
  MojaKlasa();
  ~MojaKlasa();

public:
  int SaberDvaBroja(int broj1, int broj2)
}


Pa napravis C callback funkcije koje exportujes iz DLL-a, a koje u stvari u DLL-u operisu nad klasom i vracaju/prihvataju pointer na instancu klase:

Code:

  void * MojaKlasa_Construct(); 
__declspec(dllexport)  void MojaKlasa_Release(void *ptr_na_klasu);
__declspec(dllexport)  int MojaKlasa_SaberiDvaBroja(void *ptr_na_klasu, int broj1, int broj2)


U tom slucaju ne moras nista da znas o klasi, ali opet moras da znas pozivne funkcije i njihove parametre, a i nece raditi ako imas istoimene funkcije u klasi sa razlikom samo u povratnom/pozivnim tipu/tipovima ;-) Mada ovo je cisto budzenje, pa se postavlja pitanje sto bi to radio ;-)

Daleko bolje resenje je COM, kao sto je vec navedeno - sa kojim mozes instancirati klasu cak i ako nemas originalni .h fajl.
DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 11:11 - pre 226 meseci
Ma ionako bih ja to radio preko COM-a, ali me zanimalo da li je i ovo moguće ;)
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.americas.bgsinternal.com.



+6 Profil

icon Re: Još jedno pitanje u vezi Runtime Linkinga...15.09.2005. u 13:33 - pre 226 meseci
Možeš da radiš sa apstraktnim klasama (interfejsima) slično kao u COM-u, ali sa običnim dll-ovima.

Header sadrži samo deklaraciju apstraktne klase, npr:

Code:

struct ISlika
{
virtual void Crtaj(HWND prozor) = 0;
virtual void UcitajIzFajla(HANDLE file) = 0;
virtual void ~ISlika() {}
};


a iz dll-a eksportuješ funkciju npr NapraviSliku koja bi radila nešto kao:

Code:

void* NapraviSliku()
{
  ISlika* slika = new KonkretnaSlika();
  return reinterpret_cast<void*>(slika);
}


Onda iz tvog koda dinamički učitaš dll, pozoveš NapraviSliku i kastuješ pointer na void u pinter na ISlika.

E sad je pitanje kako da oslobodiš memoriju. Jedan način je onaj koji ti je tosa opisao. Drugi način bi bio da linkuješ dll i exe da dinamički koriste CRT i onda možeš direktno da pozoveš delete na pointer na ISlika (zato ima virtualni destruktor). Treća varijanta je da napraviš specijalizovan operator new za klasu Konkretna slika koji bi ispod haube koristio CoTaskMemAlloc ili nešto slično umesto malloc i delete koji bi koristio CoTaskMemFree i onda opet možeš da koristiš delete direktno.

U svakom slučaju, uživaj :)

[Ovu poruku je menjao Dragi Tata dana 15.09.2005. u 14:35 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Još jedno pitanje u vezi Runtime Linkinga...

[ Pregleda: 2617 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.