[ BinaryRuler @ 02.06.2008. 21:45 ] @
Na koji nacin mogu da ugradim dll file u exe?
Mozda da se ubaci u resource ili na neki drugi nacin?
[ Eurora3D Team @ 03.06.2008. 00:41 ] @
Mozes preko resursa.
Da bi je procitao iz resursa i snimio na HD pozovi sledece win api fn (tim redom). Normalno , prvo proctaj kako se koriste ...
GetModuleHandle(ako nemas handler),FindResource,LoadResource,LockResource,SizeofResource,CreateFile,WriteFile,CloseHandle(fajla).
[ BinaryRuler @ 03.06.2008. 07:18 ] @
Ok, hvala na odgovoru, ali mene interesuje kako da koristim dll direktno bez snimanja na HDD?
[ icobh @ 03.06.2008. 08:54 ] @
Da li zelis da tvoj program samo nosi u sebi daj dll ili mu je on sastavni dio runtime-a?

Ako ne moze da radi bez njega, onda vidi Thinstall. A ako samo nosi u sebi, onda kao sto ti je vec preporuceno, strpaj ga u resource...
[ deerbeer @ 03.06.2008. 08:55 ] @
Pogledaj ovde : http://www.joachim-bauch.de/tutorials/load_dll_memory.html
Imao sam slicnu situaciju da sam morao da snimim na HD pa onda da ucitam module koje raspakujem iz exe-a
Ova biblioteka cita DLL iz samog EXE bez snimanja na HD ...
[ Eurora3D Team @ 04.06.2008. 00:20 ] @
Citat:
deerbeer: Pogledaj ovde : http://www.joachim-bauch.de/tutorials/load_dll_memory.html
Imao sam slicnu situaciju da sam morao da snimim na HD pa onda da ucitam module koje raspakujem iz exe-a
Ova biblioteka cita DLL iz samog EXE bez snimanja na HD ...

Ovo sam ja koristio u jednom poslu ... trebalo je da se pokrene fajl zapisan u nizu (char*) u source fajlu ...
U principu dobar kod , mada ... daleko od toga da ces moci komotno da pozivas funkcije iz dll-a u formatu funkcija(char* ovo,int ono);
Kod ima jednu fn koja se zove, cini mi se, MemoryGetProcAddres kojom mozes da nadjes adresu procedure a posle bi najbolje bilo da koristis inline assembler (ako je VC++) tako sto argumente funkcije obrnutim redom (sa desna na levo) guras u stack i onda pozivas fn. Nesto kao
Code:

__asm{
   push arg2
   push arg1
   call fn
   mov rezultat, eax // povratna vrednost je u eax registru
}
[ BinaryRuler @ 05.06.2008. 08:04 ] @
Uff, probacu.

Ako ima jos predloga pisite.
[ deerbeer @ 05.06.2008. 09:00 ] @
Citat:
Eurora3D Team: Ovo sam ja koristio u jednom poslu ... trebalo je da se pokrene fajl zapisan u nizu (char*) u source fajlu ...
U principu dobar kod , mada ... daleko od toga da ces moci komotno da pozivas funkcije iz dll-a u formatu funkcija(char* ovo,int ono);
Kod ima jednu fn koja se zove, cini mi se, MemoryGetProcAddres kojom mozes da nadjes adresu procedure a posle bi najbolje bilo da koristis inline assembler (ako je VC++) tako sto argumente funkcije obrnutim redom (sa desna na levo) guras u stack i onda pozivas fn. Nesto kao
Code:

__asm{
   push arg2
   push arg1
   call fn
   mov rezultat, eax // povratna vrednost je u eax registru
}


Hvala za __asm al nisam jos dotle stigao ..
Probao sam sa MemoryLoadLibrary i ne ide :(

Code:
 
HMEMORYMODULE hModule = MemoryLoadLibrary((const void*)szBuffer) ;


BuildImportTable() funkcija u MemoryLoadLibrary vraca FALSE ...
I cini mi se da je ovde negde problem

Code:
 
for (; !IsBadReadPtr(importDesc, sizeof(IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++)
{
DWORD *thunkRef, *funcRef;
HMODULE handle = LoadLibrary((LPCTSTR)(codeBase + importDesc->Name)); //222 linija 

//handle je posle ovog poziva NULL  
//a u debugerru "codeBase + importDesc->Name" je KERNEL32.dll
}


module->modules[module->numModules++] = handle;
if (importDesc->OriginalFirstThunk)
{
  thunkRef = (DWORD *)(codeBase + importDesc->OriginalFirstThunk);
  funcRef = (DWORD *)(codeBase + importDesc->FirstThunk);
} else {
   // no hint table
   thunkRef = (DWORD *)(codeBase + importDesc->FirstThunk);
   funcRef = (DWORD *)(codeBase + importDesc->FirstThunk);
}

for (; *thunkRef; thunkRef++, funcRef++)
{
   if IMAGE_SNAP_BY_ORDINAL(*thunkRef)
     *funcRef = (DWORD)GetProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(*thunkRef));  // 251 warning message 
   else {
       PIMAGE_IMPORT_BY_NAME thunkData = (PIMAGE_IMPORT_BY_NAME)(codeBase + *thunkRef);
       *funcRef = (DWORD)GetProcAddress(handle, (LPCSTR)&thunkData->Name);  //254 warning message 
   }
   if (*funcRef == 0)
    {
      result = 0;
      break;
     }
}

return result ; 


Ovde je *funcRef == 0 i BuildImportTable vraca result = 0

Zanimljive poruke koje dobijam u output prozoru sa compiler warning porukama:
1>.\core\MemoryModule.cpp(251) : warning C4311: 'type cast' : pointer truncation from 'FARPROC' to 'DWORD'
1>.\core\MemoryModule.cpp(254) : warning C4311: 'type cast' : pointer truncation from 'FARPROC' to 'DWORD'

i pored pragma direktive :
// disable warnings about pointer <-> DWORD conversions
#pragma warning( disable : 4311 4312 )

Da napomenem :
Pre nego sto probam da otvorim DLL iz buffer-a pre toga ga snimim u fajl i ucitam ga sa LoadLibrary i radi normalno ...



[Ovu poruku je menjao deerbeer dana 05.06.2008. u 12:44 GMT+1]
[ Eurora3D Team @ 06.06.2008. 00:21 ] @
Nisam video da ste pisali od proslog puta ...
Radi sigurno , pogledacu kod mene...
Secam se da sam te fajlove preradio da moze da ucita i exe (ustvari dll sam mislim i izbacio :) jer mi je trebao exe)
[ BinaryRuler @ 08.06.2008. 21:41 ] @
Eurora3D ajde postuj kod ako mozes.
[ Eurora3D Team @ 09.06.2008. 21:24 ] @
Mogu ... bilo i obrisano

[Ovu poruku je menjao Eurora3D Team dana 10.06.2008. u 16:17 GMT+1]
[ BinaryRuler @ 10.06.2008. 07:13 ] @
Hvala na upload-u
[ deerbeer @ 10.06.2008. 10:30 ] @
@Eurora3D
Hvala puno ... evo mozes sad da skines sa sajta kod da te ne juri joachim :) :)
Probacu pa cu javiti rezultate ....

[ Eurora3D Team @ 11.06.2008. 01:27 ] @
Ma nista ... dodjete mi neki kod kad meni bude trebalo :)