IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Charge une DLL dynamiquement


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut Charge une DLL dynamiquement
    Yop
    J'essaye de charger une DLL dynamiquement , et utiliser l'une de ses fonctions , pour mon code j'utilise urlmon.dll qui contient UrlDownloadToFile , mais je n'y arrive pas , aucune erreur mais le fichier ne se telecharge pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    type
     
    	// Déclare un type function pour pouvoir manipuler la fonction 
     
    	TMyProc = function(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD): HResult; stdcall;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Handle: THandle;
    Maproc: TMyProc;
    begin
    	// Charge une DLL dynamiquement et la libère ensuite
     
    	Handle := loadlibrary('Urlmon.dll'); // Charge la DLL
     
    	if Handle <> 0 then
     
    	begin
     
    		try
     
    			// Charge dynamiquement une fonction de la DLL
     
    			@Maproc := GetProcAddress(Handle, 'URLDownloadToFile');
     
    			if @Maproc<> nil then
     
    			begin
          Maproc(nil,'http://fahde.free.fr/bug/rel/ICrypt%201.0.rar','C:\hahga.rar',0);
       			end;
     
    		Finally
     
    			FreeLibrary(Handle);
     
    		end;
    	end
     
    	else
     
    		ShowMessage('Impossible de charger la DLL.');
     
    end;
     
     
    end.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 867
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 867
    Points : 15 278
    Points
    15 278
    Par défaut
    Yep !

    Bon,
    J'ai pu downloader avec les 'tites modifs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	TMyProc = function(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD;LPBINDSTATUSCALLBACK: pointer): HResult; stdcall;
    ajout du dernier paramètre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			@Maproc := GetProcAddress(Handle, 'URLDownloadToFileA');
    Pas trouvé de URLDownlaodToFile dans urlmon.dll ; mais avec "A" et "W", oui !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         Maproc(nil,'http://fahde.free.fr/bug/rel/ICrypt%201.0.rar','C:\hahga.rar',0, nil);
    Ajout de "nil" pour être en phase avec la déclaration et le SDK !

    HTH,
    JP

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut
    Ca marche merci , voila ce que ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    type
    
    	// Déclare un type function pour pouvoir manipuler la fonction 
    
    TMyProc = function(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD;LPBINDSTATUSCALLBACK: pointer): HResult; stdcall;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Handle: THandle;
    Maproc: TMyProc;
    mavar1 : Pansichar;
    begin
    	// Charge une DLL dynamiquement et la libère ensuite
    mavar1:='URLDownloadtofileA';
    	Handle := loadlibrary('Urlmon.dll'); // Charge la DLL
    
    	if Handle <> 0 then
    
    	begin
    
    		try
    
    			// Charge dynamiquement une fonction de la DLL
    
    			@Maproc := GetProcAddress(Handle, mavar1);
    
    			if @Maproc<> nil then
    
    			begin
         Maproc(nil,'http://fahde.free.fr/bug/rel/ICrypt%201.0.rar','C:\hahga.rar',0, nil);
       			end;
    
    		Finally
    
    			FreeLibrary(Handle);
    
    		end;
    	end
    
    	else
    
    		ShowMessage('Impossible de charger la DLL.');
    
    end;
    
    
    end.
    Mais j'ai un nouveau probleme , comme tu l'a surement remarqué j'ai declaré une nouvelle variable mavar1 : Pansichar; , et j'ai remplacé @Maproc := GetProcAddress(Handle, URLdownloadtoFile); par @Maproc := GetProcAddress(Handle, mavar1);
    Et boum ca marche plus , aucune erreur mais le telechargement n'a pas lieu...
    cette variable est elementaire pour moi , quelqu'un a une explication a ca ??
    J'y tiens a ma variable

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 867
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 867
    Points : 15 278
    Points
    15 278
    Par défaut
    Aucune erreur, aucune erreur, c'est vite dit, ça !

    Modifie donc l'appel à Maproc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			if @Maproc <> nil then
           Maproc(nil, 'http://fahde.free.fr/bug/rel/ICrypt%201.0.rar', 'C:\hahga.rar', 0, nil)
           else
             raise EInOutError.Create('Erreur  : ' + SysErrorMessage(GetLastError));
    et tu verras que ça te dit : "Erreur : La procédure spécifiée est introuvable" !

    Bon, là, je passe la main aux pros des appels système...
    Et il est taaaaaaaaaard !
    JP

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Jipété
    Aucune erreur, aucune erreur, c'est vite dit, ça !

    Modifie donc l'appel à Maproc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			if @Maproc <> nil then
           Maproc(nil, 'http://fahde.free.fr/bug/rel/ICrypt%201.0.rar', 'C:\hahga.rar', 0, nil)
           else
             raise EInOutError.Create('Erreur  : ' + SysErrorMessage(GetLastError));
    et tu verras que ça te dit : "Erreur : La procédure spécifiée est introuvable" !

    Bon, là, je passe la main aux pros des appels système...
    Et il est taaaaaaaaaard !
    JP
    Un indice de plus que celui de "Jipété" concernant l'erreur : penser à bien écrire les noms de fonctions.

    Tard ? Non...

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 98
    Points : 74
    Points
    74
    Par défaut
    Veuillez excuser mon impertinence .
    Merci

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 867
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 867
    Points : 15 278
    Points
    15 278
    Par défaut
    Io !

    Bah, c'est pas de "l'impertinence", c'est juste pour mieux s'y retrouver !

    Sinon, j'ai pas l'explication car il me semblait bien que Ouinouin n'était pas sensible à la casse, et pourtant,
    en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mavar1:='URLDownloadtofileA';
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mavar1:='URLDownloadToFileA';
    ben chez moi ça fonctionne !

    Any guru here ?

    Tard ? Non...
    À 4h08 ? Certes non, c'est tôôôôôôt !
    JP

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété
    [...]
    il me semblait bien que Ouinouin n'était pas sensible à la casse
    [...]
    Any guru here ?
    [...]
    Désolé si je tente de répondre avant le gourou tant attendu, mais je pense que son intervention serait inutile concernant ton interrogation :
    Citation Envoyé par [url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/getprocaddress.asp]Aide de GetProcAddress[/url]
    Remarks
    The spelling and case of a function name pointed to by lpProcName must be identical to that in the EXPORTS statement of the source DLL's module-definition (.def) file.
    Voilà...

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 867
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 867
    Points : 15 278
    Points
    15 278
    Par défaut
    Désolé si je tente de répondre avant le gourou tant attendu, mais je pense que son intervention serait inutile concernant ton interrogation :
    Citation:
    Aide de GetProcAddress a écrit :
    Remarks
    The spelling and case of a function name pointed to by lpProcName must be identical ...
    Bien vu !
    Merci pour le retour d'info, car j'avais bêtement copié/collé le code proposé
    JP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compiler une DLL dynamique en statique
    Par Pgs dans le forum C++Builder
    Réponses: 1
    Dernier message: 04/12/2007, 17h02
  2. Réponses: 7
    Dernier message: 05/12/2006, 08h33
  3. Recompiler une librairie dynamique (DLL) en statique
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 07/04/2005, 19h28
  4. Réponses: 8
    Dernier message: 22/12/2004, 22h57
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo