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

C# Discussion :

[C#] Composant COM


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut [C#] Composant COM
    Bonjour,

    J'ai dans un 1er temps développé une bibliothèque de classe en C++ managé qui utilise elle-même une bibliothèque de classe en C++ natif.
    Dans un 2ième temps, j'ai développé une bibliothèque de classe en C# qui possède une référence vers la dll en C++ managé.
    A ce niveau, pas de souci.

    Par la suite, j'ai voulu exposé la dll en C# en tant que composant COM. J'ai donc modifié les paramètres ('ComVisible' à true, 'Inscrire pour COM Interop' coché).
    En régénérant la dll C#, une pop-up apparait :
    "invalid virtual base addr., GetLastError: 487" et le link échoue.

    Est ce que quelqu'un aurait une idée concernant ce type de problème ?
    Merci d'avance pour vos remarques et conseils.

    AL

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Au cas où tu ne le sache pas dèjà:
    En C# le terme "composant COM" est ambigu.
    En .net, on peut utiliser :
    • soit des COM .net pour de l'interprocess entre appli .net
    • soit des COM Windows pour de l'interprocess avec des appli n'utilisant pas le framework (créés en C++, Delphi, ...)

    COM .net et COM Windows ne dialoguent pas entre elles.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Graffito Voir le message
    COM .net et COM Windows ne dialoguent pas entre elles.
    Euh, ce que tu dis là m'inquiète

    Désolé, al2000 de détourner ton sujet, mais, les propros de Graffito, sont les premiers qui pour expliquer mon problème ...

    J'ai fais une bibliothèques de types, avec des Interfaces, implémenter en Delphi 7

    J'ai envoyé ma DLL à un partenaire qui doit l'intégrer, alors il l'a voit (RegSvr32, Ajout dans le Référentiel), il arrive même à l'instancier, il appele une fonction, et la boom, à l'intérieur ça plante sur la conversion d'une WideString en String ... car le WideString contient euh, n'importe quoi qui n'a rien à voir avec ce que je voulais ...

    En VB.NET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim ObjShai As ShaiTruc_COM.IShaiTruc
    Dim ObjResult As ShaiTruc_COM.ISearchResult
     
    OjbShai = New ShaiTruc_COM.ShaiTrucImpl
    ObjResult = ObjShai.SearchMachin("1")// Boom Ici
    Une Erreur non spécifiée, ... violation d'accès à ce que j'ai pu testé

    En C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ShaiTruc_COM.IShaiTruc ObjShai;
    ShaiTruc_COM.ISearchResult ObjRes;
     
    ObjShai = new ShaiTruc_COM.ShaiTrucImpl();
    ObjRes = ObjShai.SearchMachin("1"); // Boom Ici
    Une Erreur non spécifiée, ... ... violation d'accès à ce que j'ai pu testé

    Comme je n'ai pas d'IDE .Net

    J'ai même essayé en VBScript, eh bien, ça passe, bon ça plante plus loin lorsque mon implementation fait un GetProcAddress car en fait l'objet COM n'est qu'une encapsulation d'une DLL écrite pour Win32 avec les normes API Windows (PChar, PStruct ...)

    En VBScript, pas de violation d'Accès, mais la chaine que je reçois c'est un truc de plus de 255 caractères vides ... en gros du n'importe quoi !

    Donc, pour tester, j'ai mis en dur "1", et ça passe et j'ai ceci comme erreur lors du "Result := "

    Pour protéger votre ordinateur, windows a fermé ce programme
    Erreur COM car : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
    si on ne peut pas envoyer un Result ... encore une histoire de mémoire non accessible ... trop con ! en gros, on peut faire des objets qui s'appele mais les paramètres ça marche pas ? lol, je disais en déconnant à ma chef que j'aurais pu faire un objet qui aspire un fichier XML et en renvoie un autre à la place avec qu'on se lance dans le COM, finalement, mon idée du programmeur qui code avec ses pieds n'était pas si idiote !

    Alors dans le TLB, j'ai mis comme type BSTR qui correspond à une WideString, je me suis laissé guidé par l'Aide Delphi 7 et l'outil pour faire de TLB ... je suis en "Ole Automation + Dual" donc limité dans les types ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    type
      IShaiTruc = interface(IUnknown)
        function SearchMachin(const ChaineID: WideString): ISearchResult; 
    stdcall;
    end;

    Ah, oui, si j'importe le COM en Delphi (un autre que mon ordi), que je fasse un code de test ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ObjShai: IShaiTruc ;
    ObjRes: ISearchResult ;
     
    ObjShai := CoShaiTrucImpl.Create();
    ObjRes = ObjShai.SearchMachin('1'); 
     
    ...
    eh bien, ça marche SANS SOUCIS !!! evidemment ...


    sinon l'implémentation, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function TShaiTrucImpl.SearchMachin(const ChaineID: WideString): ISearchResult;
    var
      ObjRes: TSearchResultImpl;
      S: string;
    begin
      ObjRes := TSearchResultImpl.Create();
     
      S := ChaineID; // Boom ICI, la chaine ChaineID ne contient pas du tout ce qu'il faut, même pas le moindre "1" (Code 31 00)
      ObjRes.FData := ShaiTruc_API_Header.SearchMachin(PAnsiChar(S)); // Ici, j'appelle la DLL Win32, si je ne met pas la conversion de ChaineID, ça continue son chemin ...
     
      Result := ObjRes; 
    end;
    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

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Je me rappelle avoir développé il y a 2 ans anviron pour test d'interop du DCOM ou du COM+ en Delphi6 et avoir communiqué entre appli Delphi et C#.
    Mais, depuis on a réécrit la totalité de l'appli en C# et on n'a plus eu besoin d'objet COM Win32 ou d'objet COM dotnet (.net remoting).

    Peut-être aussi voir :
    http://www.c-sharpcorner.com/UploadF...UsingCSIA.aspx
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Interessant, cela montre comment utiliser un objet COM avec ou sans TLB importée ...

    Dans mon cas, c'est vraiement le passage de paramètre qui foire, l'appel se produit, cela execute mon code (j'ai mis des showmessage à tout va) et ça plante quand je veux accéder à la variable passée en paramètre, d'ailleurs si je strape ce passage, cela plante à l'écriture du résultat, le truc bien chiant ...
    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

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Bon histoire de StdCall et SafeCall, j'ai résolu mon problème, voir ICI

    En fait, c'est l'éditeur de TLB qui manque un peu de précision, il réclame un pointeur pour activer le flag RETVAL, alors que l'on mets comme type un ISearchResult * alors qu'il faut mettre ISearchResult ** ...
    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 éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Citation Envoyé par Graffito Voir le message
    COM .net et COM Windows ne dialoguent pas entre elles.
    Je reviens dès que j'ai une réponse de mon interlocuteur qui doit intégrer mon objet COM, mais je crois que je vais pouvoir démentir cette affirmation, c'est à dire qu'un COM Win32 (Delphi) peut dialoguer avec un COM .NET

    J'espère ne pas vendre la peau de l'ours avant de l'avoir ...
    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

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

Discussions similaires

  1. Développement d'un composant COM
    Par inertia dans le forum C++
    Réponses: 18
    Dernier message: 01/06/2006, 15h21
  2. [ATL] Debuguer un composant COM+ 1.0
    Par glKabuto dans le forum MFC
    Réponses: 8
    Dernier message: 16/05/2006, 19h22
  3. [VB] Problème composants COM Word
    Par Vince dans le forum VBA Word
    Réponses: 5
    Dernier message: 08/12/2005, 10h18
  4. [C#] C# et composant COM
    Par beway dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2004, 08h56
  5. Composant COM et style XP
    Par Reisubar dans le forum Composants VCL
    Réponses: 7
    Dernier message: 10/11/2003, 19h23

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