<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Utiliser DLLImport]]></title><description><![CDATA[<p dir="auto"><em>Ce tutoriel n'est pas destiné au débutants, mais plutôt a ceux qui ont déjà de l’expérience en C# ou <a href="http://VB.NET" rel="nofollow ugc">VB.NET</a></em></p>
<p dir="auto"><strong>DLL ... what ?</strong></p>
<p dir="auto">Les DLLs (Dynamic-Link Library) sont des fichiers non-exécutables, qui contiennent des fonctions pouvant être utilisée par d'autres applications.</p>
<p dir="auto">Windows fonctionne justement avec des DLLs (%windir%\system32\ pour ceux qui voudrait les voir).</p>
<p dir="auto">Les principales sont :</p>
<p dir="auto">-user32.dll (User inferface (MessageBox, Bouttons, etc ...))</p>
<p dir="auto">-kernel32.dll (Fichiers, Mémoire, Processus/threads etc...)</p>
<p dir="auto">-gdi32.dll (Graphiques)</p>
<p dir="auto">Ces DLL forment ce qu'on appelle l'<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh447209(v=vs.85).aspx" rel="nofollow ugc">API* Windows</a>, ou l'API* Win32.</p>
<p dir="auto">*API : Application Programming Interface</p>
<p dir="auto">NB: Il y a aussi ntdll.dll, qui contient l'API Native de Windows.</p>
<p dir="auto">Dans ce tutoriel je vais donc vous apprendre a importer les fonctions FindWindow et FlashWindow, exportées par user32.dll .</p>
<p dir="auto"><strong>DLLImport</strong></p>
<p dir="auto">Pour importer ces fonctions, on va utiliser DLLImport, il requiert la classe <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx" rel="nofollow ugc">DLLImportAttribute</a>, dans le namespace <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.aspx" rel="nofollow ugc">System.Runtime.InteropServices</a> :</p>
<pre><code>using System.Runtime.InteropServices;
</code></pre>
<p dir="auto">Description des paramètres :</p>
<p dir="auto">-string <strong>dllName</strong> : Le chemin vers la DLL, et son nom. (On va utiliser une DLL de windows donc on n'a pas besoin de spécifier le chemin)</p>
<p dir="auto">-bool <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.bestfitmapping(v=vs.80).aspx" rel="nofollow ugc"><strong>BestFitMappig</strong></a> (par défaut true) : Permet de convertir les caractères UNICODE en ANSI, si il est true alors la conversion utilise le caractère ANSI le plus proche (best fit).</p>
<p dir="auto">-CallingConvention <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.callingconvention(v=vs.80).aspx" rel="nofollow ugc"><strong>CallingConvention</strong></a> (par défaut CallingConvention.StdCall/Winapi) : Un membre de l'enum <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention(v=vs.110).aspx" rel="nofollow ugc">CallingConvention</a>, c'est assez low-level, donc je ne vais pas l'expliquer ici, vous pouvez lire la doc si vous en avez envie.</p>
<p dir="auto">-CharSet <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.80).aspx" rel="nofollow ugc"><strong>CharSet</strong></a> (par défaut CharSet.Ansi) : En fait certaines fonctions ont deux types. Par exemple MessageBoxA, et MessageBoxW. Pour importer MessageBoxA il faut utiliser Charset.Ansi, et pour MessageBoxW, Charset.Unicode. , L'Ansi, sauvegarde chaque caractère dans un byte, ce qui fait qu'il n'y a que 256 caractère disponibles (dictionnaires "basique" : francais/anglais ...), Charset.Unicode utilise deux bytes (DBCS), ce qui permet d’accéder a 65,536 (2562) caractères. (arabe/chinois/coréen etc..)</p>
<p dir="auto">-string <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.entrypoint(v=vs.80).aspx" rel="nofollow ugc"><strong>EntryPoint</strong></a> : Le nom de la fonction que vous voulez importer.</p>
<p dir="auto">-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.exactspelling(v=vs.80).aspx" rel="nofollow ugc"><strong>ExactSpelling</strong></a> (par défaut false en C# mais true en VB) : Si true, vous devez nommer la fonction avec son nom exact (en incluant le A/W, si nécessaire).</p>
<p dir="auto">-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.preservesig(v=vs.80).aspx" rel="nofollow ugc"><strong>PreserveSig</strong></a> (par défaut true) : Quand c'est true, la fonction retourne un integer, et quand c'est false, elle retourne une void. Quand une void autre que S_OK (aussi appelé 0, NULL, ERROR_SUCCESS), une exception est lancée. L'exception correspond au code d'erreur. Si la fonction retourne un int autre que 0, vous pouvez gérer l'erreur comme vous le souhaitez.</p>
<p dir="auto">-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.setlasterror(v=vs.80).aspx" rel="nofollow ugc"><strong>SetLastError</strong></a> (par défaut false) : Si y'a une erreur durant l'utilisation de la fonction, on peut utiliser Marshal.GetLastWin32Error pour obtenir le code de l'erreur (error code)</p>
<p dir="auto">-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.throwonunmappablechar(v=vs.80).aspx" rel="nofollow ugc"><strong>ThrowOnUnmappableChar</strong></a> (par défaut false) : Si c'est a true et qu'une erreur survient durant la conversion des caractères d'UNICODE a ANSI, ça envoie une exception. Sinon ça remplace le caractère par un '?'.</p>
<p dir="auto">Oui y'a beaucoup de paramètres, mais ils sont rarement tous utilisé en même temps.</p>
<p dir="auto"><strong>Plateform Invoke</strong></p>
<p dir="auto">DLLImport fait partie de la plateforme Invoke (PInvoke).</p>
<p dir="auto">Pour trouver les prototypes des fonctions qu'on veut utiliser, il faut se rendre sur le Microsoft Developer Network (MSDN).</p>
<p dir="auto">Par exemple pour <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx" rel="nofollow ugc">FindWindow</a>, le prototype est : (en C)</p>
<pre><code>HWND WINAPI FindWindow(
  _In_opt_  LPCTSTR lpClassName,
  _In_opt_  LPCTSTR lpWindowName
);
</code></pre>
<p dir="auto">Mais on ne peut pas utiliser les types des lib C en C# ... Donc on doit les 'traduire'.</p>
<p dir="auto">Un superbe site pour ça : <a href="http://www.pinvoke.net/index.aspx" rel="nofollow ugc">pinvoke.net</a></p>
<p dir="auto"><strong>Attention ! Ce site ne contient pas les prototypes de TOUTE les fonctions, n’hésitez pas a utiliser Google.</strong></p>
<p dir="auto">Pour FindWindow le prototype serait donc :</p>
<pre><code>static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
</code></pre>
<p dir="auto"><strong>Un peu de pratique ...</strong></p>
<p dir="auto">Ouvrez Visual Studio, on va commencer a coder. (ah bah enfin ... <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f61b.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--stuck_out_tongue" style="height:23px;width:auto;vertical-align:middle" title=":P" alt="😛" />  )</p>
<p dir="auto"><em>Ouvrez aussi une application ayant un titre facile a écrire, j'utiliserait Paint.</em></p>
<p dir="auto">Comme dit précédemment :</p>
<pre><code>using System.Runtime.InteropServices;
// Le 'DLLImport' est habituellement placé au début d'une classe, ou encore dans une classe spécifique. 
 
[DLLImport("user32.dll", SetLastError = true)]
static extern IntPtr  FindWindow(string lpClassName, string lpWindowName); 
//On utilisera lpWindowName, lpClassName restera null.
 
[DllImport("user32.dll", SetLastError = true)]
        static extern bool FlashWindow(IntPtr hwnd, bool bInvert);
//hwnd est l'handle (quelque chose que Windows utilise pour identifier des objets) de la fenêtre, qu'on récupère grâce a FindWindow.
</code></pre>
<p dir="auto">Puis après on fait notre propre code :</p>
<pre><code>string sWindowName =  "Untitled - Paint";
 IntPtr hWindow = FindWindow(null,sWindowName); // Je préfère utiliser le nom de la fenêtre, donc je place le premier argument a null.
 
    int error = Marshal.GetLastWin32Error(); // Un peu d'error-checking, la liste des ErrorCodes peut être trouvée ici : SystemErrorCodes
            if (error == 0)
            {
                FlashWindow(hWindow, true);
 
                error = Marshal.GetLastWin32Error();
                if (error == 0)
                    Console.WriteLine("{0} flashed !", sWindowName);
                else 
                  Console.WriteLine("ErrorCode = {0}", error); 
            }      
            else
               Console.WriteLine("ErrorCode = {0}", error); // Si il y a une erreur, affiche l'erreur.
</code></pre>
<p dir="auto"><strong>End</strong></p>
<p dir="auto">Bon bah voila, je pense que j'ai tout dit sur les bases du DLLImport. Pour plus de lecture : <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute_fields(v=vs.110).aspx" rel="nofollow ugc">DLLImport Attribute</a></p>
<p dir="auto">Je n'ai montré que deux API (fonctions dans les DLL de windows), il y en a DES CENTAINES, liste disponible sur le MSDN : <a href="http://msdn.microsoft.com/library/windows/desktop/hh920508(vs.85)" rel="nofollow ugc">Windows API Index</a></p>
<p dir="auto">Petit projet qui montre quelques trucs possible avec l'api Windows :</p>
<p dir="auto">-<a href="http://davydavek.olympe.in/Tutoriels/DLLImport/WindowsControl.exe" rel="nofollow ugc">WindowsControl.exe</a> (<a href="https://www.virustotal.com/fr/url/4d5d82b9c51dd413829f12744e526e0a091d0ea757f40968f7df94d2126f7922/analysis/1400792009/" rel="nofollow ugc">scan VirusTotal</a>)</p>
<p dir="auto">-<a href="http://davydavek.olympe.in/Tutoriels/DLLImport/WindowsControl.rar" rel="nofollow ugc">Source</a> (sans l’exécutable, vous devez le compiler vous-même)</p>
<p dir="auto">Si vous avez des questions, des commentaires etc. , n’hésitez pas a les poster ici.</p>
<p dir="auto">En espérant que ça vous aie plu,</p>
<p dir="auto">Davy.</p>
]]></description><link>http://new.melinyel.net/topic/749/utiliser-dllimport</link><generator>RSS for Node</generator><lastBuildDate>Thu, 21 May 2026 18:17:17 GMT</lastBuildDate><atom:link href="http://new.melinyel.net/topic/749.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 May 2014 20:58:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Utiliser DLLImport on Fri, 23 May 2014 08:13:48 GMT]]></title><description><![CDATA[<p dir="auto">Très bon tutoriel : complet, pédagogique, documenté et avec des sources concrètes.<br />
Mes félicitations, un très bon début.</p>
<p dir="auto">Surtout que ça peut en intéresser beaucoup, vu les bidouilleurs qu'on a. <img src="http://new.melinyel.net/assets/plugins/nodebb-plugin-emoji/emoji/android/1f609.png?v=aa95655114f" class="not-responsive emoji emoji-android emoji--wink" style="height:23px;width:auto;vertical-align:middle" title=";)" alt="😉" /><br />
+1 rep.</p>
]]></description><link>http://new.melinyel.net/post/7922</link><guid isPermaLink="true">http://new.melinyel.net/post/7922</guid><dc:creator><![CDATA[Azad]]></dc:creator><pubDate>Fri, 23 May 2014 08:13:48 GMT</pubDate></item></channel></rss>