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

API, COM et SDKs Delphi Discussion :

Récupérer un tableau de String provenant d'un objet COM .net


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut Récupérer un tableau de String provenant d'un objet COM .net
    Bonjour

    J'ai un objet com .net installé dans un projet delphi7

    Une des fonctions de cette objet retourne un tableau de String

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       [DispId(0x00000002)]
            string[] GetPluggedReaderInfo();

    En installant cet objet dans delphi 7, j'obtient pour cette fonction la declaration suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IComOjbect = interface(IDispatch)
        ['{4B3AE7D8-FB6A-4558-8A96-BF82B54F329C}']
        procedure ReleaseDevice; safecall;
        function GetPluggedReaderInfo: PSafeArray; safecall;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IComOjbectDisp = dispinterface
        ['{4B3AE7D8-FB6A-4558-8A96-BF82B54F329C}']
        procedure ReleaseDevice; dispid 1;
        function GetPluggedReaderInfo: {??PSafeArray}OleVariant; dispid 2;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function TSC_ComObject.GetPluggedReaderInfo: PSafeArray;
    begin
      Result := DefaultInterface.GetPluggedReaderInfo;
    end;

    j'essaye donc de créer une variable mais je ne sais pas comment la déclarer,
    j'ai essayer un array en direct, psafeArray tout seul sans resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.btGetDeviceClick(Sender: TObject);
    var
    ret : ??????? ;
    List: TStrings;
    begin
    
    ret := device.GetPluggedReaderInfo();

    et comment après lire les données du tableau

    cordialement

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 730
    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 730
    Points : 25 637
    Points
    25 637
    Par défaut
    device c'est un IComOjbect, IComOjbectDisp ou TSC_ComObject ?

    Le type serait PSafeArray, si je me trompe pas, c'est aussi compatible avec un PVarArray
    une vraie joie !
    Dans VarUtils, tu as plein de fonction peu documentée dans les anciens Delphi comme D7 (l'ayant en C++Builder6, tu dois avoir tout ce qu'il faut aussi) comme SafeArrayGetElement ou utiliser
    SafeArrayAccessData avec array of WideString comme second paramètre


    Si tu en as la possibilité, modifie la partie .NET pour renvoyer une Interface IPluggedReaderInfos qui fournis une propriétés Items[] !
    L'intégration en Delphi sera plus simple

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    device c'est un IComOjbect, IComOjbectDisp ou TSC_ComObject ?
    device est un TSC_ComObject

    J'ai bien essayé avec un PSafeArray , plus d'erreur de compilation mais j'ai une erreur de violation de mémoire en sortie de mon objet COM.
    Etant donné que je l'ai teste également sous VB6 j'ai supposé que l'erreur vient de ma déclaration delphi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Si tu en as la possibilité, modifie la partie .NET pour renvoyer une Interface IPluggedReaderInfos qui fournis une propriétés Items[] !
    L'intégration en Delphi sera plus simple
    Je peux effectivement changer mon objet com du moment qu'il reste compatible aussi en VB.
    Ta proposition est bien de créer une propriété vers un tableau de string du résultat de ma fonction C# ?
    Cordialement

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 730
    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 730
    Points : 25 637
    Points
    25 637
    Par défaut
    je ne connais pas bien le C# mais ça serait dans l'idée de
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       [DispId(0x00000002)]
             IPluggedReaderInfo GetPluggedReaderInfo();

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    interface IPluggedReaderInfo
    {
      public property string items[] {get;}
    }
    je suppose que string est compatible avec BSTR étant le type chaine gérant en émoire COM

    Il faudrait aussi vérifier qui doit libérer la mémoire, est-ce l'appelant ou l'appelé ?
    Attention, il faut aussi libérer les locks de SafeArrayAccessData par SafeArrayUnaccessData

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    Merci une nouvelle fois ShailLeTroll

    L'erreur de violation venait de n'avoir pas mis a jour mon objet com.

    Je poste comment je l'ai fait si ça peux aider.
    Donc recuperation d'un tableau de string d'un objet com C# et ajout dans une TStrings

    Cordialement

    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
     
    var
    ListDevice : TStrings;
    getDev : PSafeArray;
    LBound, HBound : Integer;
    I: Integer;
    D: WideString;
    begin
     
    getDev := device.GetPluggedReaderInfo();
     
    SafeArrayGetLBound(getDev, 1, LBound);
    SafeArrayGetUBound(getDev, 1, HBound);
    ListDevice := TStringList.Create;
     
     
      for I := LBound to HBound do
      begin
        SafeArrayGetElement(getDev, I, D);
        ListDevice.Add(D);
      end;
     
    Cordialement

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/12/2010, 15h23
  2. Réponses: 2
    Dernier message: 10/12/2010, 08h58
  3. Réponses: 4
    Dernier message: 03/05/2006, 15h30
  4. [Collections] Conversion de Vector en tableau de String
    Par java_math dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/06/2004, 13h55
  5. [Collections] Tableau de String
    Par gexti dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 02/06/2004, 16h42

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