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

Dotnet Discussion :

Appel API conversion C++ vers C#


Sujet :

Dotnet

  1. #1
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut Appel API conversion C++ vers C#
    Bonjour,

    Je souhaite convertir ceci (c++) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class SearchWindow
    {
    public:
            HWND    FoundWnd;
            TCHAR   SearchText[256];
            int     Type;
    };
     
    CStr &window
     
    wcscpy( sw.SearchText, (LPCTSTR)window );
            sw.SearchText[255] = '\0';
            sw.FoundWnd   = NULL;
            sw.Type       = Type;
    BOOL rc = ::EnumWindows( SearchWindowText, (LPARAM)&sw );
     
    BOOL CALLBACK SearchWindowText( HWND hwnd, LPARAM lParam )
    {
    ...
    }
    En C#.

    J'arrive bien faire l'appel à EnumWindows mais je bloque sur le passage d'une classe via les API, ceci plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        [StructLayout(LayoutKind.Sequential)]
        class SearchWindow
        {
            public IntPtr handle;
            public string searchText;
            public int type;
        }
     
    [DllImport("coredll.dll")]
            static extern int EnumWindows(WNDENUMPROC lpEnumWindow, ref SearchWindow lParam);
     
    static int Callback(IntPtr hwnd, ref SearchWindow lParam)
            {
    ...
    }
     
    SearchWindow sw = new SearchWindow();
     
                EnumWindows(Callback, ref sw);
    Merci pour votre aide
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  2. #2
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Bonjour,

    Déjà, selon pinvoke.net, ta signature de EnumWindows n'est pas correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [DllImport("user32.dll")]
     [return: MarshalAs(UnmanagedType.Bool)]
     static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
    Au passage, évites de lier des méthodes core.dll. Utilises toujours user32.dll, à moins que tu travailles sur de l'embarqué.

    Pour revenir sur ton problème, je te conseillerai plutôt, si tu as accès au code C++, de créer un wrapper en utilisant C++/CLR. Ca sera toujours plus simple et propre que les P/Invoke. Tu pourras ainsi instancier et travailler sur tes objets de façon transparente.

    Si tu souhaites malgré tout utiliser les P/Invoke pour ça, voici un didacticiel plutôt complet (mais en anglais) : http://www.codeproject.com/Articles/...shal-a-C-Class

  3. #3
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Justement je suis sur de l'embarqué (Windows mobile)

    Je ne suis pas très à l'aise avec le C++

    Aurais tu un exemple de wrapper C++ je n'ai jamais fais cela
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  4. #4
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Ok, dans ce cas, le choix de core.dll est correct

    j'ai trouvé ce didacticiel (en anglais) qui explique comment créer une DLL wrapper en C++/CLR pour utiliser du code C++ dans une application en C#. Ca devrait répondre à tes attentes : http://drthitirat.wordpress.com/2013...d-clr-wrapper/

  5. #5
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    Ok merci
    Je vais regarde ça
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  6. #6
    Membre expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Points : 3 338
    Points
    3 338
    Par défaut
    J'ai réussi la 1ère partie sans soucis.

    Par contre j'ai un problème avec la création d'une bibliothèque managée CLR.
    Que faut il choisir comme projet SmartDevice pour faire ça ?
    Est-ce MFC ?

    Merci

    Edit : d'après ce que je peux lire, il n'existe pas de C++/CLI pour le compact framework .net
    Du coup, comment je peut faire pour passer un objet grâce au P/INVOKE
    Par pitié !!!! :Si vous ne savez pas faire cliquez ici !
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…

  7. #7
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Il me semble qu'il est possible de passer des structure par P/Invoke (cf Marshaling), il me semble que l'on ne peut pas passer d'objet. Cela fait cependant longtemps que je n'y ai pas touché, donc je peux me tromper.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/08/2010, 12h49
  2. Conversion Unix vers DOS...
    Par nicosfly dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2008, 17h53
  3. conversion Access vers SQL
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/03/2004, 13h57
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  5. Conversion Timestamp vers varchar
    Par stejutt dans le forum SQL
    Réponses: 4
    Dernier message: 08/01/2004, 08h46

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