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 :

DLL delphi et ADDIN Outlook en Visual Basic


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Par défaut DLL delphi et ADDIN Outlook en Visual Basic
    Bonjour, je développe actuellement un addon Outlook et je suis bloqué sur le partie transfert de Variable de la DLL vers mon addon.
    Ma DLL est censé me retourner un PAnsiChar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res := PAnsiChar(AnsiString(s));
    Result := res;
    Seulement dans mon code VB je ne sais comment la récupérer. J'ai essayé la solution suivante mais l'application plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Declare Function AjoutMail Lib "DLMDLL.dll" Alias "Ajouter_une_piece_jointe_a_un_mail" () As String
    Dim temp As Object
    temp = AjoutMail()
    Merci de vos réponses

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par Skape252 Voir le message
    Bonjour, je développe actuellement un addon Outlook et je suis bloqué sur le partie transfert de Variable de la DLL vers mon addon.
    Ma DLL est censé me retourner un PAnsiChar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res := PAnsiChar(AnsiString(s));
    Result := res;
    Seulement dans mon code VB je ne sais comment la récupérer. J'ai essayé la solution suivante mais l'application plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Declare Function AjoutMail Lib "DLMDLL.dll" Alias "Ajouter_une_piece_jointe_a_un_mail" () As String
    Dim temp As Object
    temp = AjoutMail()
    Quelques remarques :
    • Temp est un object alors que la fonction renvoie un string
    • Delphi natif ou managé ? Visual Basic natif ou managé ? VBA ?
    • Une fonction qui renvoie une chaine ne me parait pas la meilleure façon de faire quand il s'agit de dll, en particulier entre 2 environnements de développements. J'utiliserais plutôt une procédure à laquelle on passe des variables PChar initialisées et gérées côté client (en l'occurrence ByRef String. Est ce une dll que vous avez écrite et dont vous avez les sources ?

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Quelques remarques :
    • Temp est un object alors que la fonction renvoie un string
    • Delphi natif ou managé ? Visual Basic natif ou managé ? VBA ?
    • Une fonction qui renvoie une chaine ne me parait pas la meilleure façon de faire quand il s'agit de dll, en particulier entre 2 environnements de développements. J'utiliserais plutôt une procédure à laquelle on passe des variables PChar initialisées et gérées côté client (en l'occurrence ByRef String. Est ce une dll que vous avez écrite et dont vous avez les sources ?
    Tout d'abord merci de votre réponse.
    Pour l'objet temp c'est une omission de ma pars.
    Je développe sous Delphi 2010 et Visual Studio 2010, aucune idée s'il sagit de natif ou managé.
    Le problème c'est qu'en effet je n'ai pas écrit cette DLL, il me serait alors compliqué de tout reprendre pour remplacer la fonction par une procédure.
    J'ai cru comprendre que la solution pour réaliser ce passage de variable était d'utiliser les BSTR, mais je n'arrive pas à le mettre en oeuvre.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Attention, il faut penser au partage mémoire
    Une fonction ne peut JAMAIS renvoyer de PChar directement si il n'utilise pas un gestionnaire de mémoire partagée tel que ShareMem, FastShareMem (Delphi\C++Builder) ou COMString (tout langage gérant BSTR OLE)

    Il faut que ce soit l'appelant qui fournisse la zone mémoire approprié avec la taille maximale (incluant le zéro terminal)
    Avec un retour de PChar, Delphi alloue la mémoire mais qui la libère ?
    VB impossible => Erreur de Privilège ou Violation d'Accès

    Pour info :
    "natif ou managé" c'est un manière élégante pour désigner "Win32 ou .NET"

    En plus PChar en D2010 = PWideChar = 2 octets par caractère, à ne pas oublier lors de l'utilisation en VB
    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 averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 14
    Par défaut
    Dans mon cas, c'est mon complément en VB(.net) qui appelle la DLL.
    Il faudrait donc que je définisse la zone mémoire dans mon programme VB. Et que mon application delphi renvoi un PWideChar ?!

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 081
    Par défaut
    Citation Envoyé par Skape252 Voir le message
    Dans mon cas, c'est mon complément en VB(.net) qui appelle la DLL.
    Donc managé !

    Citation Envoyé par Skape252 Voir le message
    Il faudrait donc que je définisse la zone mémoire dans mon programme VB.
    Voir Interoperating with Unmanaged Code - Consuming Unmanaged DLL Functions
    Voir GCHandle, GCHandle.Alloc, GCHandle.ToIntPtr

    Citation Envoyé par Skape252 Voir le message
    Et que mon application delphi renvoi un PWideChar ?!
    Ce n'est pas ce que je disais, Delphi 2010 utilise par défaut le PWideChar via l'alias PChar, faut juste en avoir conscience !

    VB.Net utilise le même encodage normalement, StrLCopy fera très bien le boulot

    Tu peux en retour renvoyé le nombre de caractère, un peu comme l'API windows, GetWindowText

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Ajouter_une_piece_jointe_a_un_mail(lpString: PChar; nMaxCount: integer): integer;
    begin
      // s est une chaine interne de la DLL qui contient déjà quelque chose
      CopyLStr(lpString, s, nMaxCount - 1);
      Result := Math.Min(Length(s), nMaxCount - 1);
    end;

    Pour, la version BSTR OLEChar, le type Delphi c'est WideString qui encapsule les API Windows qui gère un compteur de référence ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function Ajouter_une_piece_jointe_a_un_mail(): WideString;
    begin
      // s est une chaine interne de la DLL qui contient déjà quelque chose
      Result := s;
    end;
    J'ignore totalement comment mappé cela en VB.NET !
    Le WideString, je l'utilise avec une TLB qui est utilisé en COM sous Delphi ou considéré presque comme une Assembly par .NET
    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
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Citation Envoyé par Skape252 Voir le message
    Dans mon cas, c'est mon complément en VB(.net) qui appelle la DLL.
    Il faudrait donc que je définisse la zone mémoire dans mon programme VB. Et que mon application delphi renvoi un PWideChar ?!
    Oui, allouer la mémoire sous vb.net puis passer les pointeurs à la procédure de la dll qui les "alimente".

    Concernant les String, vous avez la possibilité de préciser le jeu de caractères, Vous pouvez aussi préciser la convention d'appel.
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    <DllImport("Votre.dll", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.StdCall)>

    Voici un lien (en anglais) plus détaillé : Utiliser une dll Pascal avec .Net

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

Discussions similaires

  1. ms outlook et visual basic
    Par nouvinfo dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/01/2011, 00h21
  2. Ecrire un mail Outlook avec Visual Basic 2008 Express
    Par Pingouin1313 dans le forum VB.NET
    Réponses: 7
    Dernier message: 28/10/2009, 22h38
  3. Réponses: 0
    Dernier message: 13/08/2009, 17h45
  4. Utiliser une DLL en Delphi avec Visual Basic
    Par jix69 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 25/11/2008, 02h32
  5. Réponses: 1
    Dernier message: 07/07/2006, 15h49

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