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 :

Interop DLL en C utilisée en C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Interop DLL en C utilisée en C#
    Bonjour à tous,

    J'ai un problème dans l'utilisation d'une classe contenu dans une DLL C dans un problème C#. J'ai donc essayé de définir des fonctions mais j'ai les mêmes problèmes

    Pour information je peux modifier la DLL C et bien évidemment le programme C#.

    Voici la partie déclarative en C :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    extern "C" __declspec(dllexport) CglassDetection* CglassDetection_New(wchar_t* _imageName);
    extern "C" __declspec(dllexport) wchar_t* CglassDetection_GetForme(CglassDetection* cp);
    extern "C" __declspec(dllexport) void CglassDetection_Delete(CglassDetection* cp);

    Partie classe en C :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
        wchar_t* TraiterImage();


    Voici la partie déclarative en C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_New", CharSet = CharSet.Unicode)]
            public static extern IntPtr NewCglassDetection(String imageName);
            [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_Delete", CharSet = CharSet.Unicode)]
            public static extern void DeleteCglassDetection(IntPtr cp);
     
            [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_GetForme", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            [return: MarshalAs(UnmanagedType.LPStr)]
            public static extern string GetForme(IntPtr thisptr);
            [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "?TraiterImage@CglassDetection@@QAEPA_WXZ",
                CharSet = CharSet.Auto, CallingConvention = CallingConvention.ThisCall)]
            //[return: MarshalAs(UnmanagedType.LPStr)]
            public static extern IntPtr TraiterImage(IntPtr thisptr);

    Voilà le main en C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                IntPtr cg = NewCglassDetection("S:\\Exemples\\Formes\\Shape_7.jpg");
                //string myForme = TraiterImage(cg);
                string myForme = GetForme(cg);
                DeleteCglassDetection(cg);

    Mon problème :
    Si ma fontion GetForme créé un fichier contenant la string cela fonctionne par contre dès que je veux que ma fonction renvoi la string (Wchar_t en C) alors là j'ai l'erreur suivante :
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

    Je ne comprend vraiment pas dès que ma fonction retourne une valeur alors ça plante.
    Je dois manquer quelquechose, en cherchant j'ai vu qu'il fallait ajouter :
    [return: MarshalAs(UnmanagedType.LPStr)]
    à ma définition mais cela ne fonctionne pas non plus.

    Si quelqu'un à l'expérience pour m'aider merci d'avance car là je commence à devenir fou ...


    CobNemos

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par cobnemos Voir le message
    Bonjour à tous,

    Voilà le main en C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                IntPtr cg = NewCglassDetection("S:\\Exemples\\Formes\\Shape_7.jpg");
                //string myForme = TraiterImage(cg);
                string myForme = GetForme(cg);
                DeleteCglassDetection(cg);

    j'ai l'erreur suivante :
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

    CobNemos
    Bonjour,
    je pense que tu assigne une valeur non managé dans une valeur managé.
    En posant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
            [MarshalAs(UnmanagedType.LPStr)]  string myForme = GetForme(cg);
    Ca devrait passer (suivant l'exemple http://support.microsoft.com/kb/322091)
    sinon tu peux surement passer par une transformation avec l'un des
    Marshal.PtrToString...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Merci
    Merci pour ta réponse.

    J'ai remplacé ça dans les déclarations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("S:\\Développements\\iFaxNet\\ViametrisWin32\\Debug\\ViametrisDLL.dll", EntryPoint = "CglassDetection_GetForme", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
            public static extern IntPtr GetForme(IntPtr thisptr);
    et ça dans l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IntPtr test = GetForme(cg);
                string myForme = Marshal.PtrToStringAuto(test);
    et tout marche.
    Merci beaucoup.
    Problème Résolu ...
    Cobnemos

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

Discussions similaires

  1. DLL, comment l'utiliser ?
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/09/2006, 12h07
  2. Réponses: 1
    Dernier message: 30/06/2006, 15h49
  3. une Dll peut elle utiliser les fonctions d'une autre dll?
    Par kantelise dans le forum Windows
    Réponses: 7
    Dernier message: 18/05/2006, 03h45
  4. [VB.NET] [Coredll.dll] Peut-on utiliser Coredll sur un ppc??
    Par hken dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 03/01/2006, 09h40
  5. Réponses: 7
    Dernier message: 25/11/2005, 17h11

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