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

Langage C++ Discussion :

Dll C# en C++


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut Dll C# en C++
    Bonjour,

    Je souhaite utiliser du code que j'ai fait en C# Framework 4 dans un programme développé sous visual studio 2003 en C++ MFC.
    J'ai essayé pas mal de choses mais rien n'a donné de résultats. Quelqu'un sait-il comment faire ? Si oui une explication détaillée serait vraiment la bienvenue, j'ai l'impression que c'est difficile de trouver des infos là dessus sur internet :[

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Peut être en utilisant du C++ managed pour la partie qui manipule ce qui vient de la dll?

    Mais dans ce cas on ne va pas être d'une grande utilité sur ce forum ci...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Peut être en utilisant du C++ managed pour la partie qui manipule ce qui vient de la dll?
    Même recommendation.
    Au passage, Microsoft a abandonné l'appellation C++ managé, et préfère parler de C++/CLI. Tu trouveras plus de tutos sous ce nom-là, à commencer par ceux de DVP :
    http://dotnet.developpez.com/cours/?page=cpp

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Ok merci pour vos réponses.
    Dans quelle partie dois-je poster pour avoir de l'aide plus précise sur le C++/CLI ? J'ai trouvé quelques informations, mais toujours incomplètes ou qui n'ont pas fonctionné quand j'ai tout suivi à la lettre.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Tu postes dans la section .NET, langage C++.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Ok Merci

    J'ai essayé avec cet exemple : http://support.microsoft.com/kb/828736
    Vu que c'est pour du C++ natif je me permet de poser quelques questions ici avant d'aller embêter les autres sur leur forum

    J'ai fait exactement pareil pour tester.

    À la ligne
    ICalculatorPtr pICalc(__uuidof(ManagedClass));
    ça plante, j'ai compilé en pas à pas pour voir, et c'est le CreateInstance (En fait le CoCreateInstance à l'intérieur) qui retourne une erreur.

    C'est une exception System.Runtime.InteropServices.SEHException.

    J'ai ensuite essayé le même codé dans une apli MFC et ça plante au même endroit : "Exception Microsoft C++ : _com_error à l'emplacement ..."

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Par défaut
    J'ai eu exactement le même problème.

    J'ai utilisé la technique et les sources disponibles ici :

    http://www.codeproject.com/KB/mcpp/nativetomanaged.aspx

    En deux mots, il s'agit d'utiliser une sorte de proxy en C++/Cli, qui peut charger et utiliser une assembly .NET, et qui fourni une interface en C++ natif.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Ça m'a l'air pas mal ce code, mais va falloir un peu de temps pour comprendre tout ce qu'il y a à inclure et comment l'utiliser ^^'

    Merci je vous tiens au courant.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    C'est quoi comme valeur de retour à "CoCreateInstance" ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Citation Envoyé par bacelar Voir le message
    C'est quoi comme valeur de retour à "CoCreateInstance" ?

    -2147221164, en gros pas loin du minimum sur 32 bits signés

    Si j'ai bien compris, pour la solution de fumidu, il faut que je compile monj projet C++ avec Boost et les 2 projets NativeAdapter / NativeToManageBridge dans son Download sources ? Ça fait pas un peu compliqué ? x_X

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    Vérifiez, SVP.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Post édité avec la bonne valeur

  13. #13
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    2147221164 => 80040154 => REGDB_E_CLASSNOTREG

    Votre class COM wrappant votre class managé n'est pas enregistré. Vous avez du oubliez une étape.

    Vérifiez que vous êtes bien dans un thread STA.

    Mot Magique : CCW

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Citation Envoyé par bacelar Voir le message
    2147221164 => 80040154 => REGDB_E_CLASSNOTREG

    Votre class COM wrappant votre class managé n'est pas enregistré. Vous avez du oubliez une étape.

    Vérifiez que vous êtes bien dans un thread STA.

    Mot Magique : CCW
    En français normal ? ^^'

    J'ai fait exactement ce qu'il y a dans le lien que j'ai indiqué, ni plus ni moins (le problème est peut être le "ni plus" ? ^^'

    Manquerait-il quelque chose ? J'avoue que je ne suis ni familier avec les DLL, ni avec les composants COM...

    De mon coté je vais tout recommencer histoire d'être sûr de ne rien avoir oublié.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Un problème de multithreading sur le CCW ?
    Je ne pense pas, vu que j'ai exactement recopier l'exemple, c'est un main tout bête, aucun thread.

    (Tappe moi si je suis à coté de la plaque )

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    main tout bête, aucun thread.
    Aucun rapport, le plus important, c'est l'appel à CoInitalize ou le CoInitialize avec les bons paramètres.
    http://msdn.microsoft.com/en-us/libr...(v=VS.85).aspx

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HRESULT CoInitializeEx(
      __in_opt  LPVOID pvReserved,
      __in      DWORD dwCoInit
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HRESULT CoInitialize(
      __in_opt  LPVOID pvReserved
    );

    Etant donné que j'ai fait comme dans l'exemple, j'ai bien mis NULL pour le paramètre réservé.
    Dans l'exemple on utilise de toutes façons CoInitialize et non CoInitializeEx, qui ne prend que le paramètre réservé. DOnc je ne vois pas ce que je peux avoir à changer comme paramètre

    Je dois utiliser CoUnitializeEx avec un paramètre COINIT spécial ?

  19. #19
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 479
    Par défaut
    Vérifiez que "RegAsm.exe" a correctement enregistré les classes de votre assembly.
    Vérifiez avec RegEdit si les GUID des classes sont bien présent dans la registry.

    "RegAsm.exe" doit être exécuté en Admin depuis Vista ou Win7.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 41
    Par défaut
    Avec regedit je trouve des choses enregistrées pour ManagedClass (la classe utilisée dans l'exemple que j'essaie de faire fonctionner)

    sManagedDLL.ManagedClass
    qui contient CLSID
    qui contient une donnée {xxxxxxxxx-xxxxx-xxxx-xxx-xxxxxxxxxxx}

    Wow6432Node
    qui contient CLSID
    qui contient {xxxxxxxxx-xxxxx-xxxx-xxx-xxxxxxxxxxx}
    qui contient sManagedDLL.ManagedClass et InprocServer32
    InprocServer32 contient plusieurs clés :
    Assembly sManagedDLL, Version xxx, Cuture=neutral, PublicKeyTokan=xxxxxx
    Class sManagedDLL.ManagedClass
    RunTimeVersion xxx
    ThreadingModel Both

    Quand j'execute RegAsm il me met un message comme quoi tout a bien fonctionné. Y a t-il autre chose à vérifier ?


    EDIT :

    A l'execution, le CreateInstance prend en paramètre clsid, qui a bien la valeur décimale du clsid stocké en hexa dans HKEY_CLASSES_ROOT / sManagedDLL.ManagedClass / CLSID


    Par contre j'ai aussi dans TypeLib / {xxxxx-xxxx-xxxxxxxxxxxxxx} des chemins qui références le tlb, mais le xxxx-xxxx n'est pas celui du CLSID, c'est normal ?

    le xxx-xxx-xxxxxxxx dans Wow6432Node est lui égal au clsid


    EDIT2 :

    Décidément ... 2 jours pour ça...

    Conclusion : ne pas mettre le tlb et la dll dans le dossier du projet, mais dans le dossier de dortie de l'exe

    Bon, du coup l'addition fonctionne, me reste plus qu'à faire l'application à mon code, qui est un poil plus compliqué qu'une addition, vu qu'en plus je crée des fenêtres graphiques, je sens que je vais m'amuser

    Je repasserais par ici si j'ai encore des soucis...

Discussions similaires

  1. [CR] Infos sur l'utilisation de dll
    Par step dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 09/08/2002, 11h35
  2. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  3. Débug de DLL
    Par Bayard dans le forum C++Builder
    Réponses: 3
    Dernier message: 22/07/2002, 15h08
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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