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 : 11 095

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

Cliquez pour voir la capture en taille normale
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 !

Commentaires et avis

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 dans le forum

dll... help... [ par kmizol95 ] j'ai un chti probleme... avec les dll... je sais pas comment faire pour en créée une en C#... qu'est ce qu'on peut ecrire dedans comment la déclarée d problème avec dll [ par pipicaca ] Bonjour!Voila je dois faire une application en C# utilisant des dll écrites en C. Les fonctions de ces dll ont en paramètres d'entrée/sortie des struc ?Gros problème avec dll [ par pipicaca ] Bonsoir,Voila je dois utiliser une dll écrite en C dans un programme écrit en C#. COmment faire??? Les fonctions contenues dans la dll et que je dois .lib et .net [ par Schad ] J'ai récupéré des dll que je dois incorporer dans un programme que je développe actuellement. Avec ces dll est fourni un exemple Visual C++ 6 qui poss DLL necessaires??? [ par temp456026 ] Bonjour,je viens de compiler et d'excuter un programme sous visual .net, sur ma machine il marche, mais des que j'essai d'executer l'exe sur une machi Acces aux éléments ajoutés [ par Online ] Re-BonjourVoila, cette fois ci, j'ai joins à mon programme 2 éléments ( une application et une DLL mais je ne sais pas comment y faire appel.La questi exe c# sans framework.net ? [ par KaViDee ] Je voulais savoir si il était possible de lancer une application compilée en c#.net sans avoir la framework.net d'installée sur son ordinateur, qu'on DirListBox [ par temp456026 ] Bonjour...voila je suis en train de developper une application sous visual.net en C# (sous XP)....dans mon Form il y a une DirListBox, des que je veut Connexion à une bd, manque une dll ! [ par gouin ] Auriez-vous l'amabilité de me dire ou je peux trouver cette dll : system.data.oledb.dll qui est légèrement indispensable et qui très étonnament n'est DLL et Services Web [ par rafraf ] Salut à tous ! J'ai un petit pb avec les DLL en code non managé, en mode Service Web, J'essaye de faire appel à une DLL dans un service web, j


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,577 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.