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

Lazarus Pascal Discussion :

Utilisation d'une DLL externe = crash ! [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Utilisation d'une DLL externe = crash !
    Bonjour,

    Je suis en train de développer une unité pour utiliser la librairie libacarsd.dll dans mon programme.

    J'ai réalisé, pour le moment, ce morceau de code :
    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
     
    unit libacarsd;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
        Windows;
     
    const
        // Type of soundstreams
        // Only 3 types are supported at the moment:
        // 19500 Hz
        // 22050 Hz
        // 44100 Hz
        // all streams have to be MONO, 8bit
        STREAM19500 = 0;
        STREAM22050 = 1;
        STREAM44100 = 2;
     
    type
        // Typedefinition for a single char within ACARS stream
        ACD_CONT = packed record
            error : Byte; // Error indicated by 1. No error = 0
            data  : Byte; // Decoded char - without error? see above
        end;
     
        // Typedefinition for the complete ACARS stream
        ACD = packed record
            len      : Integer; // Count of decoded chars
            errors   : Integer; // Errorcounter
            closed   : Integer; // Transmission correct closed
            flags    : Integer; // Flags for this transmission - see above
            squitter : Integer; // This is a Squitter message
            uplink   : Integer; // This is a Uplink message
            lastpos  : Integer; // Last position within soundstream
            crc      : Word;    // Calcutated CRC. 0 if message is complete and validated!
            c        : array[1..1024] of ACD_CONT;
        end;
     
        P_libacarsd = ^libacarsd;
        libacarsd = packed record
            acarsd_codepos : Integer;
            acarsd_utable  : array[1..10] of LongWord;
            codeholder     : array[1..100] of ACD;
            private        : Pointer;
        end;
     
        function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external 'libacarsd.dll';
     
    implementation
     
    end.
    Je l'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.FormCreate(Sender: TObject);
    const
         Fichier = 'sndfile.snd';
    var
       L : P_libacarsd;
    begin
         if FileExists(ExtractFilePath(Application.ExeName) + Fichier) then
         begin
              L := acarsd_init(FileSize(ExtractFilePath(Application.ExeName) + Fichier), STREAM19500, 8);
         end;
    end;
    Le programme plante...

    Je pense que ma conversion est bonne :
    Code c : 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
     
    /* Typedefinition for a single char within ACARS stream */
    typedef struct {
        unsigned char error; /* Error indicated by 1. No error = 0 */
        unsigned char data;  /* Decoded char - without error? see above */
    } ACD_CONT;
     
    /* Typedefinition for the complete ACARS stream */
    typedef struct {
        int len;             /* Count of decoded chars */
        int errors;          /* Errorcounter */
        int closed;          /* Transmission correct closed */
        int flags;           /* Flags for this transmission - see above */
        int squitter;        /* This is a Squitter message */
        int uplink;          /* This is a Uplink message */
        int lastpos;         /* Last position within soundstream */
        unsigned short crc;  /* Calcutated CRC. 0 if message is complete and validated! */
        ACD_CONT c[1024];    /* Included typedef from above */
    } ACD;
     
    /* Public part of Library structure 
       !!! DONT CHANGE ANYTHING ON THIS DEFINITION !!!
    */
    typedef struct {
        int acarsd_codepos;
        unsigned long acarsd_utable[10];
        ACD codeholder[100];
        void *private;
    } libacarsd;
     
    /* Initialize internal structures */
    EXPORT libacarsd __stdcall *acarsd_init(const int buf,    /* Size of buffer with sounddata  */
    					const int sample, /* Sampling rate (see above)      */
    					const int pass);  /* How many passes on each stream */

    Qu'en pensez-vous ?

    La documentation de la DLL est consultable en ligne à cette adresse : http://www.acarsd.org/docu.html

    Merci pour votre aide,
    ZiP

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Le champ crc dans le record ACD est de type unsigned short, j'aurais plutôt mis Byte en correspondance plutôt que Word. Pour les tableaux, je sais pas si ca a vraiment une incidence, mais en C les tableaux commencent à 0, tu devrais peut-être les faire commencer à 0 aussi.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Pour les types, je me suis basé sur ça : http://wiki.freepascal.org/Pascal_for_C_users

    Je viens de redémarrer Lazarus et en fait, c'est cette erreur là que j'ai :



    Merci,
    ZiP

  4. #4
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Voici la liste des fonctions de ma DLL extraites avec DLL Export Viewer :
    ==================================================
    Function Name : ACARS_Decoder@8
    Address : 0x6a081590
    Relative Address : 0x00001590
    Ordinal : 12 (0xc)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : ACARS_VInfo@4
    Address : 0x6a081570
    Relative Address : 0x00001570
    Ordinal : 2 (0x2)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_destroy@4
    Address : 0x6a081510
    Relative Address : 0x00001510
    Ordinal : 7 (0x7)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_errors_of_msg@8
    Address : 0x6a081bc0
    Relative Address : 0x00001bc0
    Ordinal : 8 (0x8)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_goodoffset@8
    Address : 0x6a081660
    Relative Address : 0x00001660
    Ordinal : 9 (0x9)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_human_readable@8
    Address : 0x6a081890
    Relative Address : 0x00001890
    Ordinal : 10 (0xa)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_init@12
    Address : 0x6a081450
    Relative Address : 0x00001450
    Ordinal : 11 (0xb)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_option@12
    Address : 0x6a081300
    Relative Address : 0x00001300
    Ordinal : 1 (0x1)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : acarsd_sorttables@4
    Address : 0x6a081700
    Relative Address : 0x00001700
    Ordinal : 13 (0xd)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : codetable
    Address : 0x6a084020
    Relative Address : 0x00004020
    Ordinal : 14 (0xe)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : codetable22
    Address : 0x6a084080
    Relative Address : 0x00004080
    Ordinal : 15 (0xf)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : codetable44
    Address : 0x6a0840e0
    Relative Address : 0x000040e0
    Ordinal : 16 (0x10)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : errornames
    Address : 0x6a084140
    Relative Address : 0x00004140
    Ordinal : 17 (0x11)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : LACS_AUT
    Address : 0x6a084004
    Relative Address : 0x00004004
    Ordinal : 3 (0x3)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : LACS_DAT
    Address : 0x6a084008
    Relative Address : 0x00004008
    Ordinal : 4 (0x4)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : LACS_ID
    Address : 0x6a08400c
    Relative Address : 0x0000400c
    Ordinal : 5 (0x5)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : LACS_REV
    Address : 0x6a084000
    Relative Address : 0x00004000
    Ordinal : 6 (0x6)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : libacarsdmajorversion
    Address : 0x6a0812e0
    Relative Address : 0x000012e0
    Ordinal : 18 (0x12)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : libacarsdminorversion
    Address : 0x6a0812dc
    Relative Address : 0x000012dc
    Ordinal : 19 (0x13)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : libacarsdrevision
    Address : 0x6a0812e4
    Relative Address : 0x000012e4
    Ordinal : 20 (0x14)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : preample
    Address : 0x6a0812e8
    Relative Address : 0x000012e8
    Ordinal : 21 (0x15)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : preample2
    Address : 0x6a0812ec
    Relative Address : 0x000012ec
    Ordinal : 22 (0x16)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================

    ==================================================
    Function Name : spec
    Address : 0x6a084180
    Relative Address : 0x00004180
    Ordinal : 23 (0x17)
    Filename : libacarsd.dll
    Full Path : C:\libacarsd.dll
    Type : Exported Function
    ==================================================
    Si je modifie mon code en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; external 'libacarsd.dll' name 'acarsd_init@12';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external 'libacarsd.dll' name 'acarsd_init@12';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; stdcall; external 'libacarsd.dll' name 'acarsd_init@12';
    Je n'ai plus le message d'erreur mais mon programme crash...

    J'ai également essayé des tableaux commençant à 0. Même problème.

    Cordialement,
    ZiP

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,

    Je commencerais déjà par nommer les fonctions appelées correctement, cad soit par leur nom littéral, soit par leur index, mais pas les 2...
    Et en respectant la convention d'appel C puis que cette dll est écrite apparemment en C.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external 'libacarsd.dll' name 'acarsd_init';
    // OU BIEN
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external 'libacarsd.dll' index 12;

  6. #6
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    J'ai corrigé et je vous propose le projet de test ci-joint.

    C'est plus facile pour tester.

    J'ai toujours cette erreur :



    Si je mets ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external NomDLL name 'acarsd_init@12';
    Ou ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function acarsd_init(const buf: Integer; const sample: Integer; const pass: Integer): P_libacarsd; cdecl; external NomDLL index 12;
    Le programme crash...

    Merci pour votre aide,
    ZiP
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [WD12] Utilisation d'une dll externe
    Par rems033 dans le forum WinDev
    Réponses: 4
    Dernier message: 10/12/2009, 14h07
  2. [WD12] utiliser une DLL externe
    Par yann_72 dans le forum WinDev
    Réponses: 8
    Dernier message: 31/07/2008, 09h12
  3. Utilisation d'une classe externe dans une DLL
    Par xChRiSx dans le forum C++
    Réponses: 6
    Dernier message: 04/06/2007, 09h32
  4. Probleme d'utilisation d'une DLL externe
    Par Pasiphae dans le forum C++/CLI
    Réponses: 2
    Dernier message: 19/02/2007, 15h17
  5. dll ActiveX utilisant une DLL externe
    Par Metal3d dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/11/2005, 18h02

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