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

Langage Delphi Discussion :

Déclaration et appel d'une fonction d'une DLL ecrite en C


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Par défaut Déclaration et appel d'une fonction d'une DLL ecrite en C
    Bonjour,
    j'ai recherché sur le forum ou google (sans succès) avant de poster ce message ici.

    C'est tres simple, sauf pour moi, voila :
    j'ai une dll ecrite en C, et j'essaie via delphi de la chargée et d'interfacer les fonctions exportées.

    voici un exemple :
    la déclaration de la fonction en C de la DLL qui genere un aléa de longueur "length" et et le stocke dans "Random"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char FunctRandom(unsigned char *random, unsigned char   length);
    les valeurs retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define OK 0x55
    #define NOK 0xAA
    un exmple en C de l'appel de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char random[16];
    while (FunctRandom(random, 16) != OK);
    et en delphi
    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
    procedure executeRND;
    type
       TFunctRandom = function (_Random : Pointer; _Length : Pointer) : Pointer ; cdecl;
       Trnd = array [1..8] of Byte; 
    var
       random : ^Trnd ;
       length : ^integer ;
       GenRandom : TFunctRandom;
       DLLHandle : THandle;
       Status : Pointer
    begin
       length^ := 8;
       DLLHandle := LoadLibrary(Pchar('maDLL.dll'));  
       if DLLHandle <> 0 then begin
          try
             @GenRandom :=   GetProcAddress(DLLHandle, 'RandomGen');
             Status := GenRandom(random ,length);
             {le tableau random est bien mise a jour et le status est OK}
          except
             FreeLibrary(CryptoDLLHandle);
          end;
       end;
       FreeLibrary(CryptoDLLHandle); 
    end;
    Au final je ne sais pas trop quel type mettre à random et length (pointer, PChar...) mais toujours est il que ca plante bien mechant a la sortie de la procedure executeRND...

    Pouvez vous m'aiguiller s'il vous plait ?

  2. #2
    Membre Expert
    Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut Declaration et appel fonction d'une DLL ecrite en C
    example d'une API
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DWORD GetEnvironmentVariable(
     
        LPCTSTR lpName,	// address of environment variable name 
        LPTSTR lpBuffer,	// address of buffer for variable value 
        DWORD nSize 	// size of buffer, in characters 
       );
    et si tu regarde windows.pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function GetEnvironmentVariable(lpName: PChar; lpBuffer: PChar; nSize: DWORD): DWORD; stdcall;
    dans l'aide de delphi sur la convention d'appel :stdcall
    Les conventions register et pascal transmettent les paramètres de gauche à droite ; c'est-à-dire que le paramètre de gauche est évalué et transmis en premier, le paramètre de droite est évalué et transmis en dernier. Les conventions cdecl, stdcall et safecall transmettent les paramètres de droite à gauche.
    alors, pour ton function d'example, pas sûr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function FunctRandom(random:PCahr;length:byte):boolean;stdcall;
    et l'appel se fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var  s:string[16];
    begin
       if FunctRandom(@s,16) then;
    end;

  3. #3
    Membre émérite
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Par défaut
    alors, pour ton function d'example, pas sûr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     function FunctRandom(random:PCahr;length:byte):boolean;stdcall;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
     
    function FunctRandom(random:PCahr;length:byte):boolean;stdcall external 'maDLL.dll';

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 11h18
  2. Appel d'une fonction dans une fonction (sql server 2005)
    Par catchouse dans le forum Développement
    Réponses: 10
    Dernier message: 06/05/2009, 13h03
  3. getattr() ? Appel d'une fonction depuis une fonction
    Par frites.saucisse dans le forum Général Python
    Réponses: 8
    Dernier message: 10/10/2008, 15h21
  4. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 10h39
  5. Réponses: 4
    Dernier message: 17/03/2004, 18h24

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