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 :

DLL stdcall ou non ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut DLL stdcall ou non ?
    Bonjour,

    Il semble que la directive sdtcall provoque des erreurs quand on crée un DLL.
    Peut-être qu'il faut changer le type de paramètres ?

    exemple :
    Function CreateFichier(Nom : string):Boolean;export;
    fonctionne très bien

    mais

    Function CreateFichier(Nom : string):Boolean;stdcall;export;
    génère une erreur quand l'exécutable appelant ferme. J'ai même tenté un type Pchar pour le paramètre.

    Si je veux que VB (ou autre) utilise ma DLL il me faut stdcall pour compatibilité non ?

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Moi, pour ma DLL, j'ai utilisé stdcall sans problème.
    Testé avec un exe Delphi et un exe C++

    D'après l'aide de Delphi, ça fait en sorte que les paramètres soient traités dans le bon ordre.

    Par contre, j'ai été obligé d'utiliser PChar pour les chaînes de caractères.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par Steff2
    Bonjour,

    Il semble que la directive sdtcall provoque des erreurs quand on crée un DLL.
    Peut-être qu'il faut changer le type de paramètres ?

    exemple :

    fonctionne très bien

    mais

    génère une erreur quand l'exécutable appelant ferme. J'ai même tenté un type Pchar pour le paramètre.

    Si je veux que VB (ou autre) utilise ma DLL il me faut stdcall pour compatibilité non ?
    la convention d'appel importe peu...pour peu que l'EXE et le DLL utilisent les mêmes. Le C utilise cdecl par défaut me semble-t-il.

    quand à l'usage d'un STRING par un exe VB c'est niet !

    au niveau Delphi il faut déclarer un PCHAR et au niveau VB un STRING BYREF
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut
    ok,
    je vous remercie à tous.

    Je vais faire des test sans stdcall avec VB et c++

  5. #5
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Si tu fais de l'inter-langage, tu ne peux pas utiliser register, la convention par défaut de Delphi. En effet, la convention register est la convention "fast-call" de Delphi, et les conventions fast-call sont différentes dans chaque langage.

    Il faut utiliser une autre convention (stdcall, safecall, cdecl ou pascal), mais pas register, car register n'a pas d'équivalent dans VB ou C++.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Par défaut
    ok merci,

    pour register je savais.
    mon problème est que normalement même avec stdcall ou autre cela ne devrait pas planter. Du moins, c'est la première fois que ça m'arrive.

    ça plante toujours à la sortie de la fonction ou procédure. je pense qu'il y a un pointeur qui se perd

  7. #7
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Par défaut
    Salut,

    Déjà, confirmation, pour que ce soit compatible avec Visual Basic 6, il FAUT que la convention soit stdcall (Sauf si on fait du COM, bien entendu).

    Pour ce qui est de l'emploi de chaînes, il est très dangereux d'utiliser le type String de Delphi. En effet, ce type utilise le gestionnaire de mémoire de Delphi pour allouer ces chaînes, et est donc le seul abilité à les libérer (C'est pour ça qu'il faut mettre ShareMem lors d'un dev avec exe+dll en Delphi : pour que le gestionnaire de mémoire soit commun à l'exe et à la dll).

    Comme tu ne peux pas mettre ShareMeme dans les uses de VB , il faut que tu alloue et libère tes chaînes que d'un seul côté, comme ça se fait dans l'API Windows, ou c'est très souvent l'exe qui passe en paramètre un buffer avec sa taille. Le buffer est ensuite rempli par la dll, et c'est l'exe qui se chargerat de la libération du buffer à un moment ou à un autre.Dans ces cas là, on utilise effectivement un PChar comme signalé plus haut, mais on passe les arguments ByVal. Avec Un String ByRef, on passerait plutôt un pointeur sur un pointeur sur la chaine. Alors que notre PChar est un pointeur sur la chaîne.

    Autre solution : utiliser SysAllocString et consort, ce qui est ce qui est utilisé par VB6 pour allouer ces chaînes en interne. Comme c'est Windows qui se charge de l'allocation (Certainement avec un LocalAlloc ou GlobalAlloc), aucun problème : VB6 pourrat traiter cette chaîne comme s'il l'avait alloué lui même.

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

Discussions similaires

  1. C# DLL managé et non managé
    Par damien77 dans le forum C#
    Réponses: 1
    Dernier message: 01/07/2007, 03h32
  2. Réponses: 12
    Dernier message: 30/01/2006, 21h13
  3. Creation d'un message dans une dll non MFC
    Par dug dans le forum Windows
    Réponses: 1
    Dernier message: 29/11/2005, 12h50
  4. Réponses: 6
    Dernier message: 20/10/2005, 21h36
  5. Noyau du deboggeur BORDBK41.dll est manquant ou non rescencé
    Par Colinbayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/12/2004, 00h09

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