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

Windows Forms Discussion :

Appel DLL delphi depuis C#


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut Appel DLL delphi depuis C#
    Bonjour,

    J'ai travaillé sur l'appel d'une dll Delphi en C#.
    J'arrive à faire quelques manipulations (afficher un texte, écrire dans un fichier, ....).

    Mon souci est le suivant :
    Je n'arrive pas à ouvrir une base de données depuis la dll.
    J'appelle la même dll depuis un exe Delphi ca marche....

    Voici l'appel en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [DllImport("YMsSqlDbUpdate.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            static extern int yConnectedDatabase();
     
            static public void MainUpdate()
            {
                yConnectedDatabase();
            }
    Et voilà le code en Delphi 7
    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
     
    procedure yConnectedDatabase; StdCall;
    begin
        fMsSqlDbUpdate.yConnectedByDLL;
    end;
     
    procedure TfMsSqlDbUpdate.yConnectedByDLL;
    var
        cnx : TYSqlConnection;
    begin
        try
           cnx := TYSqlConnection.Create(nil);
          cnx.Connected      := false;
          cnx.ConnectionName := 'SQLServerConnection';
          cnx.DriverName     := 'SQLServer';
          cnx.GetDriverFunc  := 'getSQLDriverSQLServer';
          cnx.KeepConnection := true;
          cnx.LoginPrompt    := false;
          cnx.LibraryName    := 'dbexpsda.dll';
          cnx.VendorLib      := 'sqloledb.dll';
     
          cnx.Params.Values['DriverName']  := 'SQLServer';
          cnx.Params.Values['HostName']    := 'MyServer';
          cnx.Params.Values['DataBase']    := 'MyBDD';
          cnx.Params.Values['User_Name']   := 'USER';
          cnx.Params.Values['Password']    := '1';
     
          cnx.Params.Values['BlobSize']    := '-1';
          cnx.Params.Values['LongStrings'] := 'True';
          cnx.Params.Values['EnableBCD']   := 'False';
          cnx.Params.Values['FetchAll']    := 'True';
     
          try
             cnx.Connected := true;
            except
              on e:Exception do
                 DebugSource('c:\tltl.txt', e.Message);
          end;
       finally
            DetruitObjet(cnx);
       end;
    end;
    Voila, merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Alors pour moi il y a deux erreurs.

    * D'abord côté Delphi, ça fait un moment que j'ai pas touché à ça mais que je sache il faut explicitement exporter les fonctions avec Delphi ce qui donne
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure yConnectedDatabase; StdCall;export;
    begin
        fMsSqlDbUpdate.yConnectedByDLL;
    end;
     
    ...
     
    exports yConnectedDatabase;

    * Et ensuite en C# ça devrais être
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("YMsSqlDbUpdate.dll", CallingConvention = CallingConvention.StdCall)]
            static extern void yConnectedDatabase();
    Il n'y a pas de raison que la fonction en C# renvoi int alors qu'en Delphi c'est une procédure (qui ne renvois rien donc).

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Tu as raison sur les 2 points.

    L'export était plus bas dans mon code (mais pas mit dans le poste). Je l'ai reprisé dans sur la description de la procédure.
    Idem j'ai changé le int en void coté C#.

    Je résume mon problème.
    L'appel se fait bien car je peux affciher un message, écrire dans un fichier.
    C'est lorsque la DLL ouvre une connexion à la base de données, ou la j'ai une violation d'accès.

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    C'est la seule fonction que tu appelles dans la DLL ? il n'y a pas une fonction à laquelle tu passes des arguments ?

  5. #5
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Pour mes essais j'ai élagué au maximum ma dll.
    Il ne reste que cette procédure, sans paramétre.

    Si je trace sa pète sur le
    C'est vraiment l'ouverture de la connexion à la BDD qui pose problème....

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projets
    Inscrit en
    Août 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 127
    Points : 195
    Points
    195
    Par défaut
    Bon ben j'ai résolu mon problème....

    En fait ca ne venait ni du code Delphi ni du code C#, mais une dll d'accès aux données coté Delphi qui ne permettait pas l'ouverture de base dans un contexte d'appel de la dll depuis C#

    Il faut donc la dll : dbexpsda.dll en version 4.25.0.10

    Merci pour votre aide

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

Discussions similaires

  1. Appeler dll 32bits depuis un process 64nits
    Par pepito3364 dans le forum C++
    Réponses: 7
    Dernier message: 02/04/2015, 17h05
  2. Appel dll .NET depuis Java
    Par olibara dans le forum C#
    Réponses: 5
    Dernier message: 23/03/2009, 16h28
  3. Appeler dll VB depuis VC++
    Par jdesert dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 24/04/2008, 11h29
  4. Réponses: 4
    Dernier message: 01/06/2006, 16h55
  5. appel DLL C++ en Delphi (pb avec type)
    Par fkerbourch dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 18h31

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