Home | Chi sono | Contattami
 

Progr. lineare

Delphi
 
Componenti
  Database
 
Miei articoli

Windows

Miei articoli 

 

Da .exe a .dll: Parte 3

Nell'articolo articolo78.htm abbiamo visto come caricare la dll direttamente da un buffer in memoria; questo può essere il punto di partenza per svariate implementazioni. In pratica una volta creato il nostro programma, lo convertiamo in dll come descritto nell'articolo articolo77.htm e ci creiamo un eseguibile semplice semplice che carica la nostra dll nel suo spazio di memoria: in questo modo otteniamo un applicativo che ha lo stesso comportamento del nostro eseguibile originale; la dll può essere prelevata ad esempio dal web (si specifica un url e si esegue il download proprio come nel caso del .exe nell'articolo articolo75.htm) e caricata da un buffer in memoria senza doverla prima salvare su disco (come descritto nell'articolo articolo78.htm). La dll può anche essere integrata come risorsa all'interno del .exe che fa da loader: la procedura è semplicissima ed è già stata descritta nell'articolo articolo8.htm dove appunto viene spiegato come inglobare un file all'interno di un eseguibile. Di seguito il risultato dell'immagazzinamento della dll nel .exe visto con Resource Hacker

Come si può vedere abbiamo creato una risorsa di nome A01 e ci abbiamo messo dentro al dll. Quello che resta da fare è modificare il .exe addetto al caricamento specificando il codice per estrarre la dll dalla risorsa e mapparla nel proprio spazio di memoria:

program Runner; uses Windows, Classes, SysUtils, BTMemoryModule; {$R prog.res} //contiene la dll type TMainProc = procedure(); stdcall; var pMemoryModule: PBTMemoryModule; MainProc: TMainProc; function LoadDllResource(resName: string): PBTMemoryModule; var rs: TResourceStream; begin try rs := TResourceStream.Create(HInstance, resName, RT_RCDATA); Result := BTMemoryLoadLibary(rs.Memory, rs.Size); finally rs.Free; end; end; begin pMemoryModule := LoadDllResource('a01'); if pMemoryModule = nil then Exit; MainProc := TMainProc(BTMemoryGetProcAddress(pMemoryModule, 'MainProc')); MainProc(); BTMemoryFreeLibrary(pMemoryModule); end.

exe_convertito_dll_resource.7z

 

 

 

 
 
Your Ad Here