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 :

Créer et utiliser une dll en 64 bits


Sujet :

Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Créer et utiliser une dll en 64 bits
    Bonjour,

    c'est une question que j'ai déjà évoquée et qui reste pour moi d'actualité puisque je m'y attelle à nouveau pendant ces vacances scolaires.

    J'utilise en Windev plusieurs bases en parallèle c'est à dire en simultané. J'utilise également d'une manière générale le transactionnel et les verrous. Mes bases sont actuellement mariaDB. J'utilise les privilèges assez finement.

    En Windev pour utiliser le transactionnel (et les blocages) sur plusieurs requêtes en MySQL, je devrais être obligé d'utiliser SQLConnect qui ne permet d'utiliser qu'une base à la fois. C'est totalement inacceptable. Une autre solution est d'utiliser l'analyse classique et HExecuteRequeteSQL mais les blocages fonctionnent mal et surtout le transactionnel ne fonctionne que sur une seule requête. Or bon nombre d'opérations nécessite plusieurs requêtes enchaînées au terme desquelles on "commit" ou non. J'ai essayé aussi les affreux Hlitxxxx sans plus de succès.

    Pour pallier ce problème, je fais appel à une dll delphi qui est appelée par Windev. En 32 bits (depuis Windev 7.5 et Delphi 7 ), l'ensemble est fonctionnel. Windev permet également de compiler en 64 bits (et disposent des drivers MySQL et MariaDB en 64 bits). Je compile le projet en 64 bits, la dll (VCL) Delphi aussi et j'obtiens un plantage totalement muet du programme au moment de l'appel de la méthode de la dll : gelé !

    Je passe des Pchars à la dll (les requêtes et les Params). Elle me retourne un entier (un N° d'erreur). La question est de savoir si la réalisation d'une dll et son appel en 64 bits présentent une différence notable que j'ignorerais avec la même réalisation et l'appel en 32 bits.

    Merci.
    Dernière modification par Invité ; 22/12/2014 à 10h07.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Rebonjour,

    C'est réglé. Le problème était du côté de Windev avec ses entiers (en 32 bits) et ses entiers système (en 64 bits)... et les pointeurs. J'ai un peu de mal à suivre avec les entiers système en 64 bits : Parfois requis, parfois non, et parfois interdits...
    Si cela intéresse quelqu'un, voici mon exemple de test :

    Code de la dll en Delphi/Lazarus
    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
    library libTest;
     
    {$mode objfpc}{$H+}
     
    uses
      SysUtils,
      Classes,
      strutils;
     
    function Min(X, Y: Integer): Integer; stdcall;
    begin
      if X < Y then Min := X else Min := Y;
    end;
     
    function WordsCount(aChar : Pchar): Integer; stdcall;
    begin
      WordsCount := WordCount(aChar, [' ']);
    end;
     
    function ShowCoucou(aChar : Pchar): PChar; stdcall;
    var
      sTmp : String;
    begin
      sTmp := aChar;
      ShowCoucou := Pchar ('Coucou, '+ sTmp);
    end;
     
    exports
      Min index 1,
      WordsCount index 2,
      ShowCoucou index 3;
    begin
    end.
    Rappel : pas de string pour passer des chaines mais des ShortStrings (jamais essayés) ou des PChars.

    Code d'appel en Windev 18
    Code wd : 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
    SI PAS EnMode64bits() ALORS
     
    	hInst32 est un entier 
    	Res32 est un entier
     
    	hInst32 = ChargeDLL("LibTest.dll")
    	SI hInst32 = 0 ALORS
    		Erreur(ErreurInfo())
    	SINON
    		Info("DLL chargée en  32 bits")
    		Res32=AppelDLL32("LibTest.dll", "WordsCount","Ceci est une phrase de 7 mots.")
    		Info(Res32)
    		Res32=AppelDLL32("LibTest.dll", "ShowCoucou", "Untel")
    		Info(ChaîneRécupère(Res32, crAdresseASCIIZ))
     
    	   DéchargeDLL(hInst32)
    	FIN
    SINON
    	hInst64 est un entier système
    	Res64 est un entier système 
    		hInst64 = ChargeDLL("LibTest.dll")
    		SI hInst64 = 0 ALORS
    			Erreur(ErreurInfo())
    		SINON
    			Info("DLL chargée en 64 bits")
    			Res64=AppelDLL32("LibTest.dll", "WordsCount","Ceci est une phrase de 7 mots.")
    			Info(Res64)
    			Res64=AppelDLL32("LibTest.dll", "ShowCoucou", "Untel")
    			Info(ChaîneRécupère(Res64, crAdresseASCIIZ))
     
    			DéchargeDLL(hInst64)
    		FIN
    FIN
    Pour accéder à mes bases, j'ai testé indifféremment FireDac et ZeosLib : RAS.
    Dernière modification par tourlourou ; 19/04/2015 à 11h53.

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

Discussions similaires

  1. [Lazarus] Créer et utiliser une librairie .dll ou .so
    Par parhelie dans le forum Lazarus
    Réponses: 2
    Dernier message: 08/08/2010, 15h24
  2. Créer, utiliser une dll ressource
    Par trent94 dans le forum Windows
    Réponses: 2
    Dernier message: 07/12/2006, 15h39
  3. Réponses: 7
    Dernier message: 13/01/2005, 10h30
  4. [DLL] utiliser une DLL a partir d' une DLL et un .def
    Par venomelektro dans le forum MFC
    Réponses: 9
    Dernier message: 07/12/2004, 14h01
  5. [MFC] Comment créer et utiliser une base Access
    Par maitre hibou dans le forum MFC
    Réponses: 3
    Dernier message: 10/05/2004, 18h11

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