begin process at 2008 08 22 04:50:04
1 229 775 membres
46 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PINVOKE OU COMMENT INVOQUER UNE DLL 'C' À PARTIR DE C# .NET


Information sur la source

Catégorie :.NET Source .NET ( DotNet ) Classé sous : pinvoke, dll Niveau : Initié Date de création : 08/04/2003 Date de mise à jour : 08/04/2003 18:28:07 Vu : 9 815

Note :
7 / 10 - par 2 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Plusieurs questions sur le forum concernent ce problème.
Voici la solution à base de la technologie PInvoke.
Il s'agit simplement de fournir une fonction 'stub' dont le prototype seul sera dans C#, l'implémentation sera dans une DLL 'C' .

Le but est de BIEN faire la correspondance entre chacun des deux types de paramètres (C d'une part et C# d'autre part) ... sous peine de plantage

Source

  • L'exemple suivant permet de déplacer (et retailler une fenêtre de votre application favorite ... qui n'a peut-être rien de .NET) à partir d'une fenêtre WinForm
  • Le projet à été développé avec la Version 1.1 et n'est pas compatible avec la Version 1, je ne l'ai donc pas livré
  • Ceci dit, rien de plus simple.
  • Faire un simple projet WinForm dont le look figure dans le .JPG
  • Ajouter les directives suivantes
  • using System.Runtime.InteropServices;//pour PInvoke (DllImport)
  • using System.Threading;//pour le Sleep
  • Ajouter les méthodes utilisées
  • [DllImport("user32.dll", CharSet=CharSet.Auto)]
  • public static extern int FindWindow (string lpClassName, string lpWindowName);
  • [DllImport("user32.dll", CharSet=CharSet.Auto)]
  • public static extern int FlashWindow (int hwnd, int bInvert);
  • [DllImport("user32.dll", CharSet=CharSet.Auto)]
  • public static extern int MoveWindow (int hwnd, int x, int y, int width, int height, int repaint);
  • Ajouter dans la classe , le Handler sur bouton
  • private void cmdFlash_Click(object sender, System.EventArgs e)
  • {
  • int hwnd = FindWindow(null, txtFenetre.Text);
  • lblHwnd.Text = "hwnd='"+ hwnd.ToString() + "'";
  • if (hwnd==0) return;
  • MoveWindow(hwnd, 0,0,300,300,1);
  • Thread.Sleep(1000);
  • FlashWindow(hwnd, 0);
  • }
  • C'est Tout !
  • Si votre DLL est autre qu'une DLL Système, soyez sûr qu'elle soit bien placée pour être retrouvée par Windows...mais ça ce n'est plus de l'Interop mais du classique !
L'exemple suivant permet de déplacer (et retailler une fenêtre de votre application favorite ... qui n'a peut-être rien de .NET) à partir d'une fenêtre WinForm
Le projet à été développé avec la Version 1.1 et n'est pas compatible avec la Version 1, je ne l'ai donc pas livré
Ceci dit, rien de plus simple.

Faire un simple projet WinForm dont le look figure dans le .JPG
Ajouter les directives suivantes
using System.Runtime.InteropServices;//pour PInvoke (DllImport) 
using System.Threading;//pour le Sleep

Ajouter les méthodes utilisées
[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern int FindWindow (string lpClassName, string lpWindowName); 

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern int FlashWindow (int hwnd, int bInvert); 

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern int MoveWindow (int hwnd, int x, int y, int width, int height, int repaint); 

Ajouter dans la classe , le Handler sur bouton
private void cmdFlash_Click(object sender, System.EventArgs e)
{
	int hwnd = FindWindow(null, txtFenetre.Text); 
	lblHwnd.Text = "hwnd='"+ hwnd.ToString() + "'";
	if (hwnd==0) return;
	MoveWindow(hwnd, 0,0,300,300,1);
	Thread.Sleep(1000);			
	FlashWindow(hwnd, 0);
}

C'est Tout !
Si votre DLL est autre qu'une DLL Système, soyez sûr qu'elle soit bien placée pour être retrouvée par Windows...mais ça ce n'est plus de l'Interop mais du classique !
  • signaler à un administrateur
    Commentaire de typhoonx le 03/03/2004 13:43:27

    Bonjour, j'ai essyé d'adapter votre code mais je n'ai pas réussi...
    Je débute en c# et j'ai crée une dll en c ayant une fonction de multiplication et une autre d'addition (pour faire un exemple simple...).
    Je voudrais à présent ouvrir la dll sous c# et utiliser mes deux fonctions... A l'aide !!!


    Merci d'avance

  • signaler à un administrateur
    Commentaire de vieuxLion le 04/03/2004 10:17:27

    bonjour,
    le problème vient peut-être du code C ...
    en voici un exemple : fichier Oper.C
    #include <windows.h>
    __declspec(dllexport) int Addition(int x, int y)
    {return x+y;}
    __declspec(dllexport) int Multiplication(int x, int y)
    {return x*y;}

    ... ou du programme C# qui utilise la DLL produite :
    en tête de fichier :
    using System.Runtime.InteropServices;//pour PInvoke (DllImport)

    dans la classe utilisatrice :
    [DllImport("testPInvoke.dll", CharSet=CharSet.Auto)]
      public static extern int Addition (int x, int y);
    [DllImport("testPInvoke.dll", CharSet=CharSet.Auto)]
      public static extern int Multiplication (int x, int y);

    Une fonction utilisatrice bouton : un label RES et des TextBox X et Y
    private void btnAddition_Click(object sender, System.EventArgs e)
    {RES.Text = Addition(Convert.ToInt32(X.Text),Convert.ToInt32(Y.Text)).ToString();
    }

    Reste à bien copier la DLL à côté de l'exe client.
    bon courage

  • signaler à un administrateur
    Commentaire de audklie le 10/05/2007 15:26:27

    et ou copies tu la DLL coté client? dans \Windows ?
    pour moi il ne trouve pas la dll .
    et mes fonctions sont déclarées dans un bloc extern "C" {}
    et non avec __declspec(dllexport)
    3 ans après , une solution peut être? lol je tente tjrs... :)

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS