[ mica99 @ 25.06.2015. 23:18 ] @
Imam ovakav jedan slučaj;
U dll imam jedan exe fajl koji je u resource. U pitanju je putty koji je compajliran u dll kao res
Kako mogu da iz druge aplikacije učitam LoadLibrary i pokrenem putty u memoriju bez da ga ekstrktujem iz res-a?
[ savkic @ 25.06.2015. 23:51 ] @
Za izvrsavanje koda direktno iz memorije ti trebaju neke specijalizovane biblioteke, Delphi sam po sebi nema takvu mogućnost. Najbolje da potrazis na netu nesto na tu temu, ali imaj na umu da ce mnogi antivirusi neka od tih resenja tretirati kao maliciozni kod.
Moj ti je savet da prosto raspakujes exe u temp dir i da ga odatle startuje, isti efekat a daleko manje problema.
[ mica99 @ 29.06.2015. 12:56 ] @
Ok hvala na savetu. Odlucio sam da prvo ekstraktujem res i dll-a i tek onda da ga pokrenem ali mi nešto ne ideo od ruke.

Proceduru za ekstract imam u dll-u a procedu pozivam iz exe aplikacije. Kad ekstraktujem dobijem putty.exe od 0 bytes. Procedura je ok jer kad sam istu proceduru stavio u exe aplikaciju sve je radilo kako treba.

Code:

// Procedure u DLL-u 
procedure ExtractRes(ResName,ResType,ResPath:String);
var
  ResourceLocation: HRSRC;
  cFileHandle, cResourceDataHandle: THandle;
  cResourceSize, cBytesWritten: Longword;
  cResourcePointer: PChar;
begin
  ResourceLocation := FindResource(HInstance,PChar(ResName),PChar(ResType));
  cResourceSize := SizeofResource(HInstance,ResourceLocation);
  cResourceDataHandle := LoadResource(HInstance,ResourceLocation);
  cResourcePointer := LockResource(cResourceDataHandle);
  cFileHandle := CreateFile(PChar(ResPath),GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
  WriteFile(cFileHandle, cResourcePointer^, cResourceSize,cBytesWritten,nil);
  CloseHandle(cFileHandle);
end;

Procedure Extract;
begin
  ExtractRes('putty', 'exe', 'putty.exe');
end;
  exports
   Extract;

// Procedura u EXE Aplikaciji

procedure Extract; stdcall; external moj.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
DLLHandle: THandle;
Trans: TTransferPtr;
begin

// Učitaj dll
   DLLHandle := LoadLibrary ('moj.dll');

    // Ako je uspešno učitavanje ...
     if DLLHandle <> 0 then Extract;
    else
        Showmessage('Greška je došlo pri učitavanju dll-a');
end;        


[Ovu poruku je menjao savkic dana 29.06.2015. u 14:23 GMT+1]
[ mica99 @ 29.06.2015. 13:35 ] @
Izvini ali nevidim sta si promenio u proceduri.

Pitam jer vidim poruku "[Ovu poruku je menjao savkic dana 29.06.2015. u 14:23 GMT+1]"
[ savkic @ 29.06.2015. 13:35 ] @
Delphi ima TResourceStream sa kojim je lakše:

Code:

procedure ExtractRes(const AName: string; const APath: string);
var
  rs: TResourceStream;
begin
  try
    rs := TResourceStream.Create(hInstance, AName, RT_RCDATA);
    try
      rs.SaveToFile(APath);
    finally
      rs.Free;
    end;
  except
  end;
end;


Što se tiče tvog dela koda, proveri da li se hInstance koji koristiš odnosi na exe u kome ti se nalazi resurs ili na dll. A takodje možeš dodati i error handling što uglavnom javi grešku, npr:

Code:

  hRes := FindResource(HInstance, PChar(ResName), PChar(ResType));
  if hRes = 0 then
    MessageBox(0, PChar(SysErrorMessage(GetLastError)), nil, MB_OK);

[ savkic @ 29.06.2015. 13:55 ] @
> Izvini ali nevidim sta si promenio u proceduri.

Dodao sam code tagove oko tvog primera kako bi tekst bio lakši za praćenje.