• Duda mover archivo a temp y hacerle loadlibrary

 #417322  por AndresSalazer
 24 Jun 2013, 17:29
Hola a todos anteriormente también publique cosas que después las termine resolviendo pero ahora necesito ayuda ya que me estanque y no puedo resolver esto , ..

Mis problemas son los siguientes necesito que mi Proyecto, lea un archivo dll lo mueva a temp y le haga LoadLibrary sugerencias de como podría hacerlo algun tutorial especifico alguna ayuda ?

Necesito que mi form -> Proyecto.exe al momento de abrirse estando la dll en la raíz del Proyecto es decir :

En la misma carpeta : Proyecto.exe , Midll.dll (Que la dll sea movida a temp) y se inyecte haciendo loadlibrary .
 #417326  por AndresSalazer
 24 Jun 2013, 18:07
Pink escribió:Y porque no la cargas desde la raiz?


quieres inyectar la dll o solo cargarla?
Lo que me decis vos es hacer algo así ..
const

KE ='kernel32.dll';
LOAD ='LoadLibraryA';

procedure TForm1.FormCreate(Sender: TObject);
begin
//Aca declaro desde donde quiero hacer la Inyección en este caso C:
LoadLibrary(Pchar('C:/Mi dll.dll')); 

hHandle:= GetModuleHandle(KE);

ADDLOAD:= DWORD(GetProcAddress(hHandle,LOAD));
end;
end;
Pero eso no es lo que necesito ..

Mi idea es la siguiente ejemplo :



en vB tengo un codigo que es asi y funciona bien ..
Try
            Kill(My.Computer.FileSystem.SpecialDirectories.Temp & "\Midll.dll")
            My.Computer.FileSystem.CopyFile(Application.StartupPath & "\Midll.dll", _
            My.Computer.FileSystem.SpecialDirectories.Temp & "\Midll.dll")
            X = LoadLibrary(My.Computer.FileSystem.SpecialDirectories.Temp & "\Midll.dll")
            Y = GetProcAddress(X, "MyDLLFunc1")
        Catch ex As Exception
            My.Computer.FileSystem.CopyFile(Application.StartupPath & "\Midll.dll", _
                        My.Computer.FileSystem.SpecialDirectories.Temp & "\Midll.dll")
            X = LoadLibrary(My.Computer.FileSystem.SpecialDirectories.Temp & "\Midll.dll")
            Y = GetProcAddress(X, "MyDLLFunc1")
        End Try
Pero no tengo idea de como hacer lo mismo en delphi , y lo necesito funcionando en delphi
 #417330  por AndresSalazer
 24 Jun 2013, 18:21
Pink escribió:Pero a lo que me refiero que entonces la escribas si o si en temporales y usas
[ Debe registrarse para ver este enlace ]


y listo.
no aparece nada Content not found


SI el problema es que no se como inicializar el codigo para que la mueva a temp y haga el copyfile a temp y desde startuppath que es donde esta la dll con el proyecto la mueva e inyecte..
 #417332  por orlando9427
 24 Jun 2013, 18:27
Sería algo como esto, puede tener algunos errores en las llamadas a las APIs lo hice de memoria.
En sTemp esta la ruta Temp terminada en '\', obtienes un handle de la libreria cargada. Tienes una variable tipo funcion donde debe de estar tu declaración de la funcion en la DLL. Un ejemplo:
Declaracion en la DLL.
function MyDLLFunc1 (Param1: PChar): Integer; stdcall;
Tu variable se declara así
var fpMyFunc: function (Param1: PChar): Integer; stdcall;
Obtienes el puntero a esa funcion y la guardas en la variable. Todo completo queda así.
var hMod: HMODULE;
   fpMiFunc: function (): Integer;
begin
hMod := LoadLibrary(PChar(sTemp + 'Mi Dll.dll'));
@fpMiFunc := GetProcAddress(hMod, 'MyDLLfunc1');
 #417333  por Pink
 24 Jun 2013, 18:38
Yo creo que te refieres a esto:

CopyFile(PChar('midll.dll'), PChar(GetTempDir + 'midll.dll'), true);
SetCurrentDirectory (Pchar(GetTempDir));
//ya aqui puedes hacer el loadlibrary y cargara la que esta en temp




//funcion para el tempdir
function GetTempDir: string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath(SizeOf(Buffer) - 1, Buffer);
  Result := StrPas(Buffer);
end;
saludos
 #417334  por AndresSalazer
 24 Jun 2013, 18:39
orlando9427 escribió:Sería algo como esto, puede tener algunos errores en las llamadas a las APIs lo hice de memoria.
En sTemp esta la ruta Temp terminada en '\', obtienes un handle de la libreria cargada. Tienes una variable tipo funcion donde debe de estar tu declaración de la funcion en la DLL. Un ejemplo:
Declaracion en la DLL.
function MyDLLFunc1 (Param1: PChar): Integer; stdcall;
Tu variable se declara así
var fpMyFunc: function (Param1: PChar): Integer; stdcall;
Obtienes el puntero a esa funcion y la guardas en la variable. Todo completo queda así.
var hMod: HMODULE;
   fpMiFunc: function (): Integer;
begin
hMod := LoadLibrary(PChar(sTemp + 'Mi Dll.dll'));
@fpMiFunc := GetProcAddress(hMod, 'MyDLLfunc1');
Voy a probar todo esto y te digo como funciona yo estaba utilizando algo como esto .. pero no lograba hacer que funcione veremos si funciona lo que me dejaste!!
procedure TForm2.FormCreate(Sender: TObject);
var
dir: string;
  TempPath: array[0..MAX_PATH - 1] of Char;
begin
  GetTempPath(MAX_PATH, TempPath);

  dir := GetCurrentDir;

  CopyFile(PChar('GetCurrentDir\Midll.dll'),PChar('TempPath\Midll.dll'),TRUE);

end;
 #417337  por AndresSalazer
 24 Jun 2013, 18:48
Pink escribió:Yo creo que te refieres a esto:

CopyFile(PChar('midll.dll'), PChar(GetTempDir + 'midll.dll'), true);
SetCurrentDirectory (Pchar(GetTempDir));
//ya aqui puedes hacer el loadlibrary y cargara la que esta en temp




//funcion para el tempdir
function GetTempDir: string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  GetTempPath(SizeOf(Buffer) - 1, Buffer);
  Result := StrPas(Buffer);
end;
saludos

Pink sabes que tengo un problema al declarar estas variables ..
Result := StrPas(Buffer);

CopyFile(PChar('Midll.dll'), PChar(GetTempDir + 'Midll.dll'), true);
 #417368  por AndresSalazer
 25 Jun 2013, 01:41
Hola Pink gracias por la ayuda prestada mira en estos momentos no me da ningún error hice un nuevo proyecto pero sabes que tengo un problema .. al momento de verificar donde se encuentran las dlls como podría hacer en un ..
Edit1.Text := SetCurrentDirectory (Pchar(GetTempDir2)); 

Edit2.Text := PChar(GetTempDir2 + 'midll.dll'), true);
Necesito saber la manera correcta con la sintaxys bien escrita de como chequear la ruta de

StartPath o sea donde tengo la dll y necesito verificar la ruta de %temp% gettempdir
 #417371  por orlando9427
 25 Jun 2013, 01:53
Si deseas revisar si un archivo existe usa la función FileExists.
function FileExists ( const FileName : string ) : Boolean;
Devuelve True si existe, False si no