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 :

Utilisation de DLL et fichier .h avec Delphi7


Sujet :

Langage Delphi

  1. #1
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Utilisation de DLL et fichier .h avec Delphi7
    Bonjour à tous,

    J'utilise Delphi7 et je dois interfacer mon application avec une application externe dont on me fournit les DLL et les fichiers include en c++.

    Comment puis je faire pour utiliser ces dll ?

    Voici par exemple le fichier .h qui m'est fourni
    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
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #ifndef INC_PRNNT_DM_API
    #define INC_PRNNT_DM_API 
     
    #ifdef __cplusplus
       extern "C" {
    #endif
     
    /* PF4 Device manager errors */
     
    #define PRN_OK            0
    #define PRN_ERR_NOTEXIST  1
    #define PRN_ERR_TIMEOUT   2
    #define PRN_ERR_DUPE      3
    #define PRN_ERR_INIT      4
    #define PRN_ERR_LOCKED    5 //@31
     
    /* PF4 Device Manager Status */
     
    #define PRN_STS_ONLINE    0
    #define PRN_STS_OFFLINE   1
    #define PRN_STS_INIT      2
    #define PRN_STS_POWEROFF  3
     
    #define PRN_RESAEMULSTS_ONLINE    3
    #define PRN_RESAEMULSTS_OFFLINE   4
    #define PRN_RESAEMULSTS_INIT      14
    #define PRN_RESAEMULSTS_POWEROFF  11
     
    	   /* PF4 Write Device Manager Type */
    #define PRT_MODE_AEA      1	/* Automatic Add of AR; */
    #define PRT_MODE_GEN      2
    #define PRT_MODE_LOGO     3
    #define PRT_MODE_CTX      4
    #define PRT_MODE_ADMIN    5
     
    /* PF4 Type of devices */
    #define PRN_PRT_BPP_    "BPP"
    #define PRN_PRT_BTP_    "BTP"
     
    //---longueur max d'une selection--- 
    #define MAX_SELECTIONNAME_    30
     
    //--- PF4 return codes for Batch---
    #define PRN_BAT_NO_ERROR          0x00  /* OK                                 */
    #define PRN_BAT_ERROR_NET         0x01  /* LAN error                          */
    #define PRN_BAT_ERROR_ALREADYOPEN 0x02  /* Already opened					  */
    #define PRN_BAT_ERROR_MAXLENGTH   0x03  /* Data length overflow               */ 
    #define PRN_BAT_ERROR_SHELL       0x04  /* Shell Type unknown                 */
    #define PRN_BAT_ERROR_PARAMETER   0x05  /* Wrong parameter                    */
    #define PRN_BAT_ERROR_MEMORY      0x06  /* Memory allocation error            */
    #define PRN_BAT_ERROR_NOTFOUND    0x07  /* non trouve						  */
    #define PRN_BAT_ERROR_ENDSESSION  0x08  /* End of session 					  */
    #define PRN_BAT_ERROR_NOTOPENED   0x09  /* Not opened	 					  */
     
    #define PRN_PM_NO_ERROR           0     // OK
    #define PRN_PM_ERROR_LOCKED       203   // PM Device locked
    #define PRN_PM_ERROR_NOTFOUND     213	  // PM Device not found
    #define PRN_PM_ERROR_NOTREADY     211	  // PM Device not ready
     
    /* ************************************************ */
    /* PRN_DM_OPEN Opens a peripheral on Device manager */
    /*                                                  */
    /* szType = type of device                          */
    /*          "MSG" Message                           */
    /*          "RTE" Reader                            */
    /*                                                  */
    /* Order = Order of peripheral                      */
    /*          if 2 periph. with same type =>          */
    /*          0 : first one       1 : second one      */
    /*                                                  */
    /* fTrace = Activate trace to the trace server      */
    /*          0 : No Trace                            */
    /*          else : Trace                            */
    /*                                                  */
    /* RETURN ERC :                                     */
    /*          PRN_OK : Correct Open                   */
    /*          PRN_ERR_NOTEXIST : Peripharal doesn't exist */
    /*          PRN_ERR_DUPE : Already open             */
    /*                                                  */
    /* ************************************************ */
     
    unsigned short PRN_DM_OPEN( char * szType, unsigned short Order, unsigned short fTrace);
    unsigned short WINAPI PRNVB_DM_OPEN( char * szType, unsigned short Order, unsigned short fTrace);
     
     
    /* ************************************************ */
    /* PRN_DM_UNLOCK - lock device                  		*/
    /*                                                  */
    /* szCtx  = Name of context (3 alphanumeric chars)  */
    /*                                                  */
    /* szType = type of device                          */
    /*          "MSG" Message                           */
    /*          "RTE" Reader                            */
    /*                                                  */
    /* Order = Order of peripheral                      */
    /*          if 2 periph. with same type =>          */
    /*          0 : first one       1 : second one      */
    /*                                                  */
    /* RETURN ERC :                                     */
    /*          PRN_OK : Switch OK                      */
    /*          PRN_ERR_NOTEXIST : Peripheral doesn't exist */
    /*          PRN_ERR_INIT : Peripheral in initialization */
    /*          PRN_ERR_TIMEOUT : Peripheral not ready  */
    /*	    PRN_ERR_LOCKED : Peripharal locked      */ 
    /*                                                  */
    /* ************************************************ */
     
    unsigned short PRN_DM_UNLOCK( char * szType, unsigned short Order);
    unsigned short PRN_DM_UNLOCK_CTX( char * szCtxIn, char * szType, unsigned short Order);
    unsigned short WINAPI PRNVB_DM_UNLOCK( char * szType, unsigned short Order);
    unsigned short WINAPI PRNVB_DM_UNLOCK_CTX( char * szCtxIn, char * szType, unsigned short Order);
     
     
    #ifdef __cplusplus
       }
    #endif
     
    #endif INC_PRNNT_DM_API

    Si quelqu'un peut m'aider à transcrire cela afin que je puisse utiliser la DLL avec mon application en Delphi7 il est le bienvenu.

    Merci d'avance pour vos réponses,

    Wilco

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Tu dois traduire le .H en code Delphi !
    Bon Courage, si tu as besoin d'aide pour certains fragments, reviens nous voir !

    pour débuter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function PRN_DM_OPEN(szType: PChar; Order: Byte; fTrace: Byte): Byte; stdcall;
    ensuite cherche autour de external et LoadLibrary\GetProcAddr
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Tanscription .h vers Delphi7
    Merci ShaiLeTroll pour ce début de réponse.

    J'ai commencé la transcription, cependant, je bute sur ces lignes de code :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    #define PRN_BAT_NO_ERROR          0x00  /* OK                                 */
    #define PRN_BAT_ERROR_NET         0x01  /* LAN error                          */
     
    unsigned short WINAPI PRNVB_DM_OPEN( char * szType, unsigned short Order, unsigned short fTrace);


    Comment déclarer les CONST avec des valeurs en hex : 0x01 ou 0xFF par exemple ?

    Comment déclarer la fonction WINAPI ?


    Merci d'avance pour vos réponses

    Wilco

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    const
     PRN_BAT_NO_ERROR          =$00;  //* OK                                 */
     PRN_BAT_ERROR_NET         =$01:  //* LAN error                          */
     
    // unsigned short -> Word
    // WINAPI  -> stdcall
    // PRNVB_DM_OPEN( 
    // char * szType, -> PChar
    // unsigned short Order, 
    // unsigned short fTrace
    //);
    function PRNVB_DM_OPEN( szType: PChar; Order, fTrace : Word): Word; stdcall;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut Delphi7 transcription fichier .h pour DLL
    Merci Paul, j'avance pas à pas ...


    Sur la fonction suivante, il y a char * szSelection que je transcrits en szSelection: PChar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short WINAPI CRWVB_DM_SELECTIONINFOS(char * szSelection, CHAR  SeachCode, char  *Infos, WORD timeout);
    Mais comment je transcrits CHAR SeachCode ?


    Et sur cette fonction, comment je transcrits les unsigned char *pMsg ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short CRW_DM_WRITE_ASYNC( char * szType, unsigned short Order, unsigned char *pMsg , unsigned short sMsg , unsigned short type , unsigned short timeout);

    Merci d'avance,
    Wilco

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    en C "char *" veux dire pointeur sur un char, c'est le "^char" de Delphi (ou PChar)

    donc un Char ben c'est tout simplement un Char ... encore que le C ne fait pas de distinction entre Char et Byte

    "unsigned Char" et "Char" c'est ici la même chose, car en Pascal Char n'est pas signé...donc "unsigned Char *" c'est toujours un PChar.

    Note également que tout ce que tu n'utilises pas n'a pas besoin d'avoir un type exact, donc tout ce qui est "*" de quelque chose et dont tu n'as pas besoin peut devenir un Pointer sans autre précision
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    "unsigned Char" et "Char" c'est ici la même chose, car en Pascal Char n'est pas signé...donc "unsigned Char *" c'est toujours un PChar.
    Cela peut aussi être un PByteArray, ou un ^Byte, en fonction du contexte... Usuellement, les buffers "unsigned char*" en C sont utilisés pour les données binaires brutes, il vaut donc mieux éviter de faire croire à Delphi qu'il pourrait s'agir de chaînes de caractères "normales".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Bonjour et merci à vous pour votre aide ...

    La fonction ci-dessous renvoie 2 pointeurs : pRetMsg et pStatus.
    Je dois récuperer dans mon application Delphi7 ces 2 valeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fonction C
    unsigned short PRN_DM_READ( char * szType, unsigned short Order, unsigned char *pRetMsg , unsigned short * pStatus, unsigned short * sRetMsg , unsigned short timeout);
     
    Delphi 7
    function PRN_DM_READ( szType: PChar; Order: Byte; pRetMsg:PChar; pStatus: PChar; sRetMsg, timeout: Byte): Byte; stdcall; External 'PRN_xp.dll';
    La dll écrite en C++ renvoie 2 pointeurs (pRetMsg et pStatus).

    Comment dois je faire pour récupérer le contenu de pRetMsg et pStatus ?


    Merci d'avance,
    Wilco

  9. #9
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Bonjour à tous,

    J'ai transcris la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {en C++}
    unsigned short PRN_DM_OPEN( char * szType, unsigned short Order, unsigned short fTrace);
     
    {en code Delphi7}
    function PRN_DM_OPEN(szType: PChar; Order: Byte; fTrace: Byte): Byte; stdcall; External 'PRN_dm.dll';

    Ensuite, sur l'évênement onclick d'un bouton j'exécute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TMAIN.pb_PRNClick(Sender: TObject);
    begin
       DLL_Result := PRN_DM_OPEN(0, 0, 1);
       ShowMessage('PRN_DM_OPEN Return value = ' + IntToStr(DLL_Result));
    end;
    Le code s'exécute bien jusqu'au <ShowMessage> puisque le programme m'affiche le message avec la valeur retournée par la DLL. Ensuite, lorsque je clique sur le bouton OK du ShowMEssage, l'application se ferme toute seule et viens à Windows. Aucun message d'erreur ni exception ne s'affiche. J'obtiens une sortie brutale du programme.



    Quelqu'un peut il m'aider ?

    Merci d'avance,
    Wilco

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Comment fais-tu pour passer 0 à un PChar ?
    la déclaration n'est pas la bonne !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    J'ai essayé avec différentes valeur dont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMAIN.pb_PRNClick(Sender: TObject);
    begin
       DLL_Result := PRN_DM_OPEN('0', 0, 1);
       ShowMessage('PRN_DM_OPEN Return value = ' + IntToStr(DLL_Result));
    end;

    la DLL me retourne une valeur qui s'affiche bien dans le ShowMessage mais quand après l'exécution de ce showmessage le programme quitte sans exception ni message d'erreur.

  12. #12
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par Wilco
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {en C++}
    unsigned short PRN_DM_OPEN( char * szType, unsigned short Order, unsigned short fTrace);
     
    {en code Delphi7}
    function PRN_DM_OPEN(szType: PChar; Order: Byte; fTrace: Byte): Byte; stdcall; External 'PRN_dm.dll';
    unsigned short (2 octets) <> Byte (1 octet)

    essaie plutôt cette déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {en code Delphi7}
    function PRN_DM_OPEN(szType: PChar; Order: SmallInt; fTrace: SmallInt): SmallInt; stdcall; External 'PRN_dm.dll';

  13. #13
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci à tous pour votre aide, j'avance pas à pas.

    La fonction ci-dessous retourne 2 pointeurs :
    unsigned char *pRetMsg
    unsigned short * pStatus

    Le premier pointe sur une chaine de caractères, le second sur un entier sur 2 octets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Fonction C
    unsigned short PRN_DM_READ( char * szType, unsigned short Order, unsigned char *pRetMsg , unsigned short * pStatus, unsigned short * sRetMsg , unsigned short timeout);
    J'ai 2 questions :

    1) Comment puis je transcrire cette fonction en Delphi7 ?

    2) Et comment je peux l'appeler et récupérer la valeur de ces 2 pointeurs ?


    Merci d'avance pour vos réponses,
    Wilco

  14. #14
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    unsigned short PRN_DM_READ( char * szType, unsigned short Order, unsigned char *pRetMsg , unsigned short * pStatus, unsigned short * sRetMsg , unsigned short timeout);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function PRN_DM_READ(const szType: pShortInt; const Order: word; var pRetMsg: pChar; var pStatus: pWord; var sRetMsg: pWord; const TimeOut: word): word;
     
    ou
     
    function PRN_DM_READ(const szType: ShortInt; const Order: Word; var pRetMsg: string; var pStatus: Word; var sRetMsg: Word; const TimeOut: word): word;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  15. #15
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    Merci, hélas j'ai toujours une violation d'accès.

    J'essaie avec une autr fonction qui me renvoi un status sur 2 octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // pStatus = pointer to a buffer to read status  2 octets
     
    PRN_DM_STATUS( szType: PChar; Order: Word; pStatus: PWord): Word; stdcall; External 'PRN_dm.dll';

    J'appelle la fonction vec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TMAIN.pb_STATUSClick(Sender: TObject);
    var
       PRN_Status: PWord;
    begin
    PRN_Result := PRN_DM_STATUS('PCL5', 0, PRN_Status);
    end;
    A la compilation j'ai le message d'erreur : PStatus Types incompatibles Windows.word et System.word


    Quelqu'un a t il une idée ?

    Merci d'avance
    Wilco

  16. #16
    Membre régulier

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

    Informations forums :
    Inscription : Août 2003
    Messages : 207
    Points : 91
    Points
    91
    Par défaut
    oups, parfois des choses élémentaires nous échappent ...

    Etant donné que cette fonction renvoie un pointeur il faut ajouter le mot clé Var devant la variable !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Déclaration erronée
    PRN_DM_STATUS( szType: PChar; Order: Word; pStatus: PWord): Word; stdcall; External 'PRN_dm.dll';
    
    
    Délcaration correcte
    PRN_DM_STATUS( szType: PChar; Order: Word; Var pStatus: PWord): Word; stdcall; External 'PRN_dm.dll';
    J'arrive maintenant à exécuter cette fonction et je récupère bien une valeur dans pStatus.

    Merci pour votre aide, j'avance pas à pas

    Wilco

  17. #17
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,
    Citation Envoyé par Wilco Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Déclaration erronée
    PRN_DM_STATUS( szType: PChar; Order: Word; pStatus: PWord): Word; stdcall; External 'PRN_dm.dll';
    Délcaration correcte
    PRN_DM_STATUS( szType: PChar; Order: Word; Var pStatus: PWord): Word; stdcall; External 'PRN_dm.dll';
    non au contraire ! (Ou alors pStatus était déclarée unsigned short **, ce qui n'est pas le cas dans les autres fonctions)

    Plusieurs choses :

    Le passage par référence est un mécanisme n'existant pas en C (il n'y a que le passage par valeur).
    Ce mode de passage d'arguments place sur la pile l'adresse de la variable pour pouvoir ensuite la modifier à l'intérieur de la fonction. En C, on émulera ce mode en passant un pointeur vers la variable souhaitée. Cela revient à peu près à la même chose sauf que l'écriture avec un passage par référence s'en trouve simplifiée (par de déférencement explicite à faire) et n'est pas censée permettre le passage d'une adresse invalide ("censée" car on peut toujours faire quelque chose du type PType(nil)^).
    Donc utiliser var revient déjà à signifier que l'on passera par une adresse. Un var sur un pointeur revient à passer l'adresse sur un pointeur, ce qui serait traduit en C par un pointeur sur pointeur - ce qui n'est pas le cas dans cet exemple.

    Traduire un passage par pointeur en passage par référence est donc possible si la fonction doit toujours prendre comme paramètre un pointeur valide.
    Si il est possible de passer un pointeur nil (ou NULL en C), il vaut alors mieux garder le passage par pointeur pour justement pouvoir passer ce pointeur nil - cela est une technique parfois employée pour signifier qu'un argument est optionnel (cf. les Api Windows).
    Citation Envoyé par Wilco Voir le message
    J'appelle la fonction vec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMAIN.pb_STATUSClick(Sender: TObject);
    var
       PRN_Status: PWord;
    begin
    PRN_Result := PRN_DM_STATUS('PCL5', 0, PRN_Status);
    end;
    Ici tu passes un pointeur non assigné à la fonction. Même sans savoir ce qu'elle est censée réaliser, cela ne peut avoir de sens. Il faut que le pointeur que tu passes soit valide, c'est-à-dire qu'il pointe sur une variable allouée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMAIN.pb_STATUSClick(Sender: TObject);
    var
       PRN_Status: PWord;
    begin
       New(PRN_Status);
       PRN_Result := PRN_DM_STATUS('PCL5', 0, PRN_Status);
       Dispose(PRN_Status);
    end;
    ou tout simplement (avec Word et @)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMAIN.pb_STATUSClick(Sender: TObject);
    var
       PRN_Status: Word;
    begin
       PRN_Result := PRN_DM_STATUS('PCL5', 0, @PRN_Status);
    end;
    Et si le paramètre Status est obligatoire, tu peux comme expliqué plus haut utiliser var mais en écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function PRN_DM_STATUS( szType: PChar; Order: Word; var Status: Word): Word; stdcall; External 'PRN_dm.dll';
     
    procedure TMAIN.pb_STATUSClick(Sender: TObject);
    var
       PRN_Status: Word;
    begin
       PRN_Result := PRN_DM_STATUS('PCL5', 0, PRN_Status);
    end;

Discussions similaires

  1. Utiliser une DLL faite en delphi avec VB6
    Par illuch dans le forum API, COM et SDKs
    Réponses: 12
    Dernier message: 23/05/2014, 06h56
  2. utiliser une DLL faite en vb6 avec VB.net
    Par j.sineau dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/12/2007, 10h33
  3. probleme d'utilisation de DLL developpées en C++ avec python
    Par mandagor dans le forum Interfaçage autre langage
    Réponses: 3
    Dernier message: 23/03/2007, 14h13
  4. [FORMS] Utilisation de DLL avec ORA_FFI
    Par Nounoursonne dans le forum Forms
    Réponses: 2
    Dernier message: 07/12/2004, 09h19
  5. utilisation de dll avec diverses compilateurs
    Par Thylia dans le forum C++
    Réponses: 30
    Dernier message: 21/10/2004, 16h30

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