« PInvoke » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
Aucun résumé des modifications
 
Aucun résumé des modifications
 
Ligne 1 : Ligne 1 :
[http://morpheus.developpez.com/dlldotnet Doc]
[[Category:CSharp]]
= Liens =
* [http://morpheus.developpez.com/dlldotnet Doc]


=Obtenir les fonctions d'un DLL C/C++=
= Obtenir les fonctions d'un DLL C/C++ =
Utilisez [http://www.nirsoft.net/utils/dll_export_viewer.html DLL Export Viewer] ou [http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html PEBrowse] pour afficher les méthodes exportées par cette DLL.
Utilisez [http://www.nirsoft.net/utils/dll_export_viewer.html DLL Export Viewer] ou [http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html PEBrowse] pour afficher les méthodes exportées par cette DLL.


=Obtenir les signatures des fonctions C/C++=
= Obtenir les signatures des fonctions C/C++ =
*Consultez le fichier .h
* Consultez le fichier .h
*DLL Windows : [http://msdn.microsoft.com/en-us/library/windows/desktop/ff657751%28v=VS.85%29.aspx Windows Application UI Development]
* DLL Windows : [http://msdn.microsoft.com/en-us/library/windows/desktop/ff657751%28v=VS.85%29.aspx Windows Application UI Development]


=Convertir les signatures C/C++ en signatures C#=
= Convertir les signatures C/C++ en signatures C# =
[http://clrinterop.codeplex.com/releases/view/14120 PInvoke Interop Assistant]
[http://clrinterop.codeplex.com/releases/view/14120 PInvoke Interop Assistant]
Onglet "SigImp Translate Snippet" → collez la signature et les structures C/C++ dans "Native Code Snippet".
Onglet "SigImp Translate Snippet" → collez la signature et les structures C/C++ dans "Native Code Snippet".


=Obtenir les signatures .NET=
= Obtenir les signatures .NET =
[http://www.pinvoke.net/index.aspx PINVOKE .NET]
[http://www.pinvoke.net/index.aspx PINVOKE .NET]


=Exemple=
= Exemple =
Prenons la DLL &laquo; C:\Windows\System32\user32.dll &raquo; :<br/>
Prenons la DLL &laquo; C:\Windows\System32\user32.dll &raquo; :<br/>
Voici les exports donnés par PE Browse :<br/>
Voici les exports donnés par PE Browse :<br/>
Ligne 23 : Ligne 25 :


Ne possédant pas le fichier .h, une recherche sur internet : InvalidateRect + MSDN nous donne cette signature :
Ne possédant pas le fichier .h, une recherche sur internet : InvalidateRect + MSDN nous donne cette signature :
{|
 
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
<kode lang="cpp">
|
<syntaxhighlight lang="cpp">
BOOL InvalidateRect(  
BOOL InvalidateRect(  
   HWND hWnd,  
   HWND hWnd,  
Ligne 32 : Ligne 32 :
   BOOL bErase
   BOOL bErase
);
);
</syntaxhighlight>
</kode>
|}


L'outil "PInvoke Interop Assistant" génère le code suivant :
L'outil "PInvoke Interop Assistant" génère le code suivant :
{|
 
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
<kode lang="csharp">
|
<syntaxhighlight lang="csharp">
[StructLayout(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public struct RECT {
Ligne 51 : Ligne 48 :
[return: MarshalAs(UnmanagedType.Bool)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InvalidateRect(IntPtr hWnd, ref RECT lpRect, [MarshalAs(UnmanagedType.Bool)] bool bErase);
public static extern bool InvalidateRect(IntPtr hWnd, ref RECT lpRect, [MarshalAs(UnmanagedType.Bool)] bool bErase);
</syntaxhighlight>
</kode>
|}


Signatures récupérés sur internet :
Signatures récupérés sur internet :
{|
<kode lang="csharp">
!style="padding: 0 10px 0 0"| [[File:csharp.png|40px]]
|
<syntaxhighlight lang="csharp">
// PINVOKE.NET
// PINVOKE.NET
static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);
static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);
Ligne 65 : Ligne 58 :
[return: MarshalAs(UnmanagedType.Bool)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, [MarshalAs(UnmanagedType.Bool)] bool erase);
public static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, [MarshalAs(UnmanagedType.Bool)] bool erase);
</syntaxhighlight>
</kode>
|}
 
[[Category:CSharp]]

Dernière version du 12 avril 2020 à 21:39

Liens

Obtenir les fonctions d'un DLL C/C++

Utilisez DLL Export Viewer ou PEBrowse pour afficher les méthodes exportées par cette DLL.

Obtenir les signatures des fonctions C/C++

Convertir les signatures C/C++ en signatures C#

PInvoke Interop Assistant Onglet "SigImp Translate Snippet" → collez la signature et les structures C/C++ dans "Native Code Snippet".

Obtenir les signatures .NET

PINVOKE .NET

Exemple

Prenons la DLL « C:\Windows\System32\user32.dll » :
Voici les exports donnés par PE Browse :

  • ...
  • InvalidateRect (1957) (0x00021381)
  • ...

Ne possédant pas le fichier .h, une recherche sur internet : InvalidateRect + MSDN nous donne cette signature :

Cpp.svg
BOOL InvalidateRect( 
  HWND hWnd, 
  const RECT* lpRect, 
  BOOL bErase
);

L'outil "PInvoke Interop Assistant" génère le code suivant :

Csharp.svg
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
    public int left;
    public int top;
    public int right;
    public int bottom;
}

[DllImport("user32.dll", EntryPoint="InvalidateRect")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InvalidateRect(IntPtr hWnd, ref RECT lpRect, [MarshalAs(UnmanagedType.Bool)] bool bErase);

Signatures récupérés sur internet :

Csharp.svg
// PINVOKE.NET
static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InvalidateRect(IntPtr hWnd, IntPtr rect, [MarshalAs(UnmanagedType.Bool)] bool erase);