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 :

possibilité d'appeler qu'une seule fois une fonction dans une dll


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut possibilité d'appeler qu'une seule fois une fonction dans une dll
    Bonjour,

    Je fais appel à des fonctions qui sont dans une dll delphi, depuis une application .Net/C#. Je ne suis pas sur d'être dans la bonne section :p

    Mon problème est donc: depuis mon code .NET j'appelle des fonctions qui sont dans une dll écrite en delphi,
    - la première fois que j'appelle la fonction, cela marche bien,
    - MAIS lorsque je rappelle la fonction j'ai un message d'erreur comme quoi la ressource n'est pas accessible

    Du cote.NET, ma déclaration de fonction dans une class Global
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     [DllImport("KinevolutionEngine.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
            public static extern int GGetPosition(uint pos);
    mon appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uint currentposition = 0;
    Global.GGetPosition(currentposition);
    if (currentposition > 1)
    {
    //code
    }
    Du cote Delphi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function GGetPosition(var value : Single) : integer;stdcall;
    begin
    // function GetPosition(var value : Single) : integer; 
    // est la fonction qui récupère la position dans la variable 'value' venant d'un robot (qui fonctionne c'est sur)
      result := GetPosition(value); 
    end;
     
    //...
     
    exports
      GGetPosition;
    Merci de votre aide et/ou de vos suggestion. n'hésitez pas à demander des explication si j'ai manqué de clarté.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    l'appel à la fonction passe en paramètre un UInt par valeur alors que la dll attend un Single par référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("KinevolutionEngine.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
            public static extern int GGetPosition(float *pos);
    je ne suis pas sûr que le float soit équivalent au Single...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    en fait j'ai oublié une modif au moment du post :p
    merci de la remarque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("KinevolutionEngine.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true)]
            public static extern int GGetPosition(ref uint pos);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    uint currentposition = 0;
    Global.GGetPosition(ref currentposition);
    if (currentposition > 1)
    {
    //code
    }
    et l’équivalent du single est le uint apparemment.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    single c'est un flottant sur 4 octets
    uint c'est l'équivalent du cardinal, entier non signé sur 4 octets
    double, c'est un flottant sur 8 octets

    Tu as ajouté une trace dans la DLL ?
    Où s'arrête l'appel de la fonction ?
    Est-ce que cela n'arrive même pas à l'appel du code Delphi ou alors cela invoque le code est c'est au retour que cela échoue !
    Surveille DLLEntryPoint, pour voir si ta DLL n'est pas prématurément déchargée ?

    Sinon, si tu en as la possibilité, je ferais un objet COM qui respecte la convention safecall, cela sera plus simple à utiliser en .NET qu'une DLL non managée (c'est bien une DLL Win32 ?)
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Ho c'est une honte, tu as raison, j'ai confondu single et cardinal :S

    Sinon dans le désordre,
    Oui c'est une dll win32,
    Je n'ai pas le loisir d'en faire un objet COM(1- parce que je ne sais pas comment faire :p,
    2- la dll est utilisée par d'autre partie du programme .NET faisant même appelle à d'autres fonctions,
    et 3- avant que j'arrive dans la société c'était un objet COM je crois bien, qui ne marchait pas et ils l'ont donc passé en dll :S)
    Je n'ai pas de trace dans le delphi a proprement parlé, mais je sais que l'erreur survient dans le delphi dès le debut du traitement, donc pas au moment de la remonté.
    Et dernier point, je ne connais pas le DLLEntryPoint, je vais cherchais autour de cela, mais n'hésitez pas envoyer des idée et /ou des indices

    Merci de votre aide.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par titou640 Voir le message
    Je n'ai pas le loisir d'en faire un objet COM(1- parce que je ne sais pas comment faire :p,
    cours de programmation Delphi & Pascal : Système et Automation - COM et OLE

    Citation Envoyé par titou640 Voir le message
    2- la dll est utilisée par d'autre partie du programme .NET faisant même appelle à d'autres fonctions,
    Interessant

    Citation Envoyé par titou640 Voir le message
    et 3- avant que j'arrive dans la société c'était un objet COM je crois bien, qui ne marchait pas et ils l'ont donc passé en dll :S)
    C'est pourtant le plus pratique en .NET, j'ai fait justement des Wrapper COM en safecall pour encapsuler des DLL Win32 pour des partenaires développant en .NET dont les compétences se limitaient au .NET et rien qu'au .NET et même la notion de convention d'appel leur était inconnu !
    Perso, j'utilisais du VBS pour limiter mes prototypes de fonction au plus limitatif late binding que le .NET n'aura aucun problème à utiliser !

    Citation Envoyé par titou640 Voir le message
    Je n'ai pas de trace dans le delphi a proprement parlé, mais je sais que l'erreur survient dans le delphi dès le debut du traitement, donc pas au moment de la remonté.
    Mets-en ! Ecrit dans un fichier par exemple !
    Pense que tu peux débuggueur ta DLL en mettant le programme .NET comme application Hôte !
    N'hésite pas a faire une application de test en Delphi, déjà il faudrait que ton code fonctionne parfaitement dans ce contexte !

    Il faudrait savoir précisément le message d'erreur !

    Citation Envoyé par titou640 Voir le message
    Et dernier point, je ne connais pas le DLLEntryPoint, je vais cherchais autour de cela, mais n'hésitez pas envoyer des idée et /ou des indices
    Tu peux utiliser les sections initialization et finalization
    System.DLLProc Variable
    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
     
    library titou640;
     
    ...
     
    procedure DllEntryPoint(dwReason : dword);
    begin
      case dwReason of
        DLL_PROCESS_ATTACH : ...
        DLL_PROCESS_DETACH : ...
      end;
    end;
     
    begin
      DLLProc := @DllEntryPoint;
      DLLEntryPoint(DLL_PROCESS_ATTACH); // Il faut l'appeler manuellement pour le démarrage en Delphi !
    end.
    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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Merci ShaiLeTroll, je n'ai pas pu explorer le dllentrypoint, mais en loggant la dll, et en observant minutieusement le fonctionnement (sans m’énerver et envoyer le pc en l'air) j'ai découvert l'origine de mon pb (je pense a 99% sûr)... le multiThreading!! Ahhhh on l'aime ce multithreading, il n'y a pas a dire!

    Donc, je vais m'atteler à mettre en place un mutex , dans un premier temps, je pense (en espérant que je puisse le passer proprement au thread qui tourne depuis la dll) pour éviter l'acces concurentiel aux ressources. Et ensuite il faudra voir pour y mettre une gestion des priorité .... Je sens que c'est de la résolution de "petit" problème qui va me mettre hors délais :S

    Je vais clore ce post mais je risque de revenir poser des questions bêtes sous peu.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  2. Appeler une fonction q'une seule fois
    Par kit dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/05/2009, 10h22
  3. Réponses: 2
    Dernier message: 02/01/2008, 15h31
  4. executer fonction javascript une seule fois sur un onchange
    Par sebdu dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 24/08/2007, 14h44
  5. [Tableaux] Remplacer une seule fois un mot dans un texte.
    Par psychoBob dans le forum Langage
    Réponses: 38
    Dernier message: 24/01/2006, 16h07

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