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

Visual C++ Discussion :

Passage de paramètres dans un ATL C++ depuis C#


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 61
    Par défaut Passage de paramètres dans un ATL C++ depuis C#
    Bonjour,

    Voilà je développe actuellement une librairie en C++, sous la forme d'un ATL.
    Certaines de mes méthodes retournent ([out]) des pointeurs sur listes chaînées.

    Lors de l'appel de ma librairie par une application C#, aucun souci n'a été rencontré, j'obtiens bien l'accès à mes données.

    Par contre j'aurai souhaité savoir si quelqu'un savait comment fonctionnait le ramasse miette du .Net vis-à-vis des DLL externes au projet (et encore plus, développées dans un autre langage). Est-ce que le ramasse miette nettoie également cette zone mémoire, ou est-ce que dans ma librairie je dois également gérer ma libération mémoire ?

    Merci

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    c'est ta dll externe qui doit gérer sa propre désallocation de ses zones mémoires

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    bonjour,
    Après beaucoup de temps passé a chercher dans les tutos et dans les différents topics relatant de l'ATL je n'arrive toujours pas à trouver une solution pour transmettre/recevoir une image par buffer d'une classe c# vers/depuis une classe ATL en C++ se trouvant dans une dll ATL.

    me trompe-je de voie?
    merci d'avance pour vos conseils.

    Chafouin

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    S'il s'agit de données linéaires, tu devrais pouvoir passer ça en tableau de bytes (SAFEARRAY de bytes) ou peut-être même en BSTR... (mais je conseillerais plutôt le tableau de bytes)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    Merci Médinoc.
    Je vais essayer la solution que tu proposes.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    Bon j'ai essayé de créer une methode GetImage avec comme paramètre de retour une SAFEARRAY<byte> * mais visual 2008 crée la méthode puis la supprime directement. Soit je me trompe en déclarant les paramètres, soit la SAFEARRAY n'est pas utilisable.

    Je vais essayer le BSTR du coup.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    En IDL, pour un tableau en entrée c'est juste SAFEARRAY(byte) (ou peut-être SAFEARRAY(unsigned char)), avec les parenthèses et sans étoile.
    Ce code sera traduit en C++ par SAFEARRAY* (SAFEARRAY n'est pas un template)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    Bon j'ai essayé la syntaxe que tu m'as indiqué et le compilateur me fait une erreur MIDL 2121 . Apparemment on ne peux pas utiliser de SAFEARRAY en paramètre de retour.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Un paramètre de retour sera typiquement ainsi:
    Code IDL : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT UneMethode([out, retval] SAFERARRAY(byte) *retValue);
    Ce qui donnera:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    HRESULT UneMethode(/*[out, retval]*/ SAFERARRAY **retValue);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    je m'en sors pas.
    J'ai créer deux fonctions ATL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    STDMETHODIMP CMainVirtualSensor::SetImage(SAFEARRAY * inBuffer)
    {
    	SafeArrayCopy(inBuffer,imgBuffer);
    	return S_OK;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TDMETHODIMP CMainVirtualSensor::GetImage(SAFEARRAY **  outBuffer)
    {
     
    	outBuffer = imgBuffer;
    	return S_OK;
    }
    qui me semble trop simples pour que ca fonctionne

    et je fais des appels en C# là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CVSProjectLib.MainVirtualSensorClass vs = new MainVirtualSensorClass();
                unsafe
                {
                    bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
                    bmpData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                    byte[] buf = new byte[739*563];
                    Marshal.Copy(bmpData.Scan0, buf, 0, bmp.Height * bmp.Width); 
                    vs.SetImage(buf);
                Marshal.Copy((byte[])vs.GetImage(), 0, bmpData.Scan0, 10000);
                bmp.UnlockBits(bmpData);
                bmp2.UnlockBits(bmpData2);
                }
    par contre pour ce code C# je suis sur de rien. D'ailleurs il me sort une exception "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
    Aurais-tu un lien la-dessus que je n'aurais pas vu/trouvé ou un petit exemple simple pour me montrer comment ca marche ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Déjà, ton GetValue() doit faire un SafeArrayCopy() aussi.
    Pour le reste, je vais voir mais il me faudra un peu de temps.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Par défaut
    Oui effectivement ...

    je viens de faire marcher les 2 fonctions j'ai juste transformer ma variable imgBuffer qui etait de type SAFEARRAY** en SAFEARRAY*
    et transformé mon setter et mon getter en consequence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    STDMETHODIMP CMainVirtualSensor::SetImage(SAFEARRAY * inBuffer)
    {
    	SafeArrayCopy(inBuffer,&imgBuffer);
    	return S_OK;
    }
     
    STDMETHODIMP CMainVirtualSensor::GetImage(SAFEARRAY **  outBuffer)
    {
     
    	SafeArrayCopy(imgBuffer,outBuffer);
    	return S_OK;
    }
    edit: Bon y a tout qui marche maintenant mais je pense que mon code C# pourrait être plus propre de plus il est pas très dynamique à cause des allocations statique de ma 2ème image et mon buffer de byte.

    Merci beaucoup Médinoc ton aide m'es précieuse et rapide

Discussions similaires

  1. passage de paramètre dans un LIKE
    Par dor_boucle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/01/2006, 16h04
  2. passage de paramètres dans l'invite de commande
    Par mr_neness dans le forum Langage
    Réponses: 10
    Dernier message: 18/11/2005, 15h01
  3. Passage de paramètres dans champ hidden
    Par benassis dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/05/2005, 01h22
  4. Réponses: 9
    Dernier message: 13/05/2005, 03h13
  5. Passage de paramètres dans une requête imbriquée
    Par DrakkoFR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 12h46

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