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 :

Utiliser une dll C# avec delphi


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 41
    Points : 23
    Points
    23
    Par défaut Utiliser une dll C# avec delphi
    Bonjour,

    Je debute en delphi et je dois utiliser les fonctions d'une DLL en C#.

    J'ai cru compremdre a travers les nombreux posts que c'est legerement plus complique que d'appeller un simple DLL en C.

    J'ai essaye de suivre les instructions sur cette page :
    http://www.drbob42.com/examines/examin36.htm

    Apres avoir installe ma dll,
    quand je fait appel aux fonctions de ma dll, ca leve une Exception 'EAccessViolation'.

    Auriez vous une piste pour m'aider a avancer ?

    Merci d'avance

    PS : je travaille avec delphi 7 c'est pour cela que je n'ais pas poste dans dotnet

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour et bienvenue sur les forums de Développez.com

    Sans bouts de code de votre part nous permettant de voir comment vous vous y prenez nous ne pourrons pas vous aider.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    Merci et desole pour le manque d'infos.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, OleServer, TCMM18Library_TLB;
    Ma librairie est TCMM18Library.dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      Form1: TForm1;
     
      NumberOfDevices : Integer;
      ResultComTest : Integer;
      ConfigPath: PChar;
      ThermoPath: PChar;
      PortCOM: PChar;
      mTCMM18Lib : TCMM18Lib;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    initialization
    begin
     
    ConfigPath:= 'C:\Documents and Settings\S.T\Desktop\C#\test.xml';
    ThermoPath:= 'C:\Documents and Settings\S.T\Desktop\C#\Thermocouples.tcdata';
    PortCOM:= 'COM4';
     
     
    NumberOfDevices := mTCMM18Lib.SetConfiguration(ConfigPath,2000);
    end;
    L'execption se leve a l'appel de SetConfiguration.

    en C# set configuration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int SetConfiguration(string aFileName, double aTimerPeriod)
    Il y a deux classes et une structure dans ma dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public struct TempData{}
    public class TCMM18Lib{}
    public class MeasureDoneArgs : System.EventArgs{}

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Comme ça brut de fonderie au vu de ce que vous avez envoyé le problème est que vous n'instanciez visiblement pas votre variable mTCMM18Lib.

    Si TCMM18Library_TLB est le fichier généré via le module d'importation comme dans les instructions sur la page que vous avez précédemment cité, alors il y devrait y avoir une classe CoCMM18Lib qui existe ou un truc comme ça et vous devez alors faire un mTCMM18Lib := CoCMM18Lib.Create;
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    En effet, la classe CoTCMM18Lib a l'air d'exister mais quand je rajoute cette ligne apres le begin d'"initialization":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mTCMM18Lib := CoTCMM18Lib.Create ;
    Il me fait une autre exception : EOleSysError : 'CoInitialize has not been called'

    Il faut initaliser autre chose je suppose, mais quoi ? :s

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Mmmh mmh dans ce cas il faut appeler CoInitialize; (définit dans l'unité Windows à priori) avant toute chose
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    Quelle est cette entite en Co.... que vous m'avez fait rajouter ?

    merci j'ai rajoute ceci :
    Cela fait une exception apres avec l'interface, je vais chercher un peu.

    Merci beaucoup

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    D'après l'aide de Delphi sur le SDK Windows cette fonction permet d'initialiser le moteur COM, c'est une action essentielle à faire avant tout appel à un objet COM. Consultez l'aide pour plus de détails, notamment pour traiter les valeurs qu'elle retourne.

    A noter aussi que pour tout CoInitialize il doit y avoir un pendant CoUninitialize (à placer dans la section Finalization du coup dans votre cas).


    Bon sinon on va faire un récapépét' parce que je t'ai peut-être embrouillé les pinceaux (et moi aussi ).

    En important la DLL le fichier _TLB va contenir plusieurs choses, déjà pour chaque interface de ton objet COM, tu vas avoir autant de IXXX, pour chaque interface qui implémente IDispatch tu vas avoir deux classes supplémentaires : une CoXXX qu'on appelle CoClasse et qui permet d'instancier un objet COM via sa méthode Create (retournant un IXXX) et une TCXXX qui est ce qu'on appelle un "Wrapper" c'est à dire une classe qui englobe l'instance de ton objet COM (normalement stocké dans une variable de type IXXX ou OleVariant) et reproduit la même structure méthodes/propriétés que l'interface mais en langage Delphi.

    Donc si ta variable est de type IXXX ou OleVariant tu dois utiliser la CoClasse pour la créer et si tu utilises le Wrapper dans ce cas là tu créé le composant comme de normalement.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 41
    Points : 23
    Points
    23
    Par défaut
    Finallement, je sais pas trop pourquoi mais ca marche.

    J'ai bouge mon code de la partie 'initialization' pour le mettre dans une fonction appelle par la creation de la fenetre (FormCreate).

    J'ai fait disparaitre tout les 'trucs' avec Co etc, et j'ai rajoute sur le dessin,
    la classe que j'utilise (instanciation automatique ?)

    Merci pour ton aide Aka Guymelef.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2015, 10h23
  2. 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
  3. Utiliser une dll C# avec vba
    Par Dadedi dans le forum C#
    Réponses: 10
    Dernier message: 29/09/2009, 14h15
  4. Utiliser une DLL Matlab sous Delphi
    Par airefrais dans le forum Langage
    Réponses: 4
    Dernier message: 24/07/2009, 10h16
  5. Chargement d'une dll C++ avec Delphi
    Par rudi0 dans le forum Langage
    Réponses: 6
    Dernier message: 26/08/2007, 19h15

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