Pinvoke ou comment invoquer une dll 'c' à partir de c# .net

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 256 fois - Téléchargée 30 fois

Contenu du snippet

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 / Exemple :


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 !

A voir également

Ajouter un commentaire

Commentaires

Messages postés
26
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
23 juin 2006

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... :)
Messages postés
455
Date d'inscription
samedi 26 octobre 2002
Statut
Membre
Dernière intervention
6 avril 2004
8
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
Messages postés
22
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
5 mars 2008

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.