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

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

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.