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 !

LES API DE WINDOWS VB6 ET VB.NET


Information sur le tutorial

Catégorie :API Tutorial .NET ( DotNet ) Date de création : 13/06/2006 19:21:49 Vu : 20 147 fois

Note :
4,86 / 10 - par 7 personnes
4,86 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Voici un tuto conçu pour VB.Net et VB6 sur les API

Tutorial

Les API de Windows
Visual Basic 6 et Visual Basic .Net

But du Tutorial : Apprendre et comparer l’utilisation des API avec Visual Basic 6,7 et 8
Niveau requis : Débutant

1. Que sont les API ?

Définition : Une API (Application Programming Interface – Interface de programmation d’applications) a pour objet de faciliter le travail d'un programmeur en lui fournissant les outils de base nécessaire à tout travail à l'aide d'un langage donné. Elle constitue une interface servant de fondement à un travail de programmation plus poussé. Elle contient plusieurs méthodes, fonctions et routines permettant le simplifier le travail.

Résumé : Une API est donc une bibliothèque de classes (dll)

2. Visual Basic et les API

Dans Visual Basic, qui possède déjà des fonctions prédéfinies, nous utiliserons une API en tant que remplaçant d’une lacune du langage, telle que l’extraction d’une icône, qui n’est pas prédéfinie dans Visual Basic (excepté version 8.0)

3. Les API de Windows

Les API de Windows se trouvent généralement dans le répertoire système, il en existe plusieurs, et les plus fréquentes sont surtout : user32.dll, shell32.dll, wininet.dll, gdi32.dll, kernel32.dll…

4. Se documenter, rassembler les informations nécessaires

Pour avoir des informations sur le fonctionnement des API de Windows, le site MSDN de Microsoft est l’endroit de référence. Attention, la documentation sur les API n’est disponible qu’en anglais.
Pour ceux voulant faire tout cela hors ligne, Microsoft met à disposition un fichier Win32.hlp regroupant toutes les informations nécessaires sur les API. Pour obtenir de l’aide en français, plusieurs sites et logiciels regroupent des informations sur les API.

Sur MSDN, la page présentant une fonction nous indique des renseignements très utiles, tels que les paramètres à entrer dans la fonction et ce à quoi ils correspondent. Nous savons maintenant comment marche la fonction, mais comment faire… en Visual Basic…

5. Déclarer l’API

En Visual Basic et aussi en VB.Net, pour utiliser une API, il faut déclarer la fonction ainsi que l’API de laquelle elle vient. Mais comment faire ? Cela est assez simple.

Syntaxe VB6:

[Private | Public] Declare Function | Sub <name>” Lib <library>” _
[Alias “<alias>”] [([arglist])] [As Type]

- Private et Public indique la visibilité de la fonction.
- Declare, obligatoire, annonce un appel à une procédure externe
- Function ou Sub doit être indiqué, Sub si rien n’est renvoyé, Function dans le cas contraire.
- <name> est le nom de la procédure appelée, il est sensible à la casse. (ex : ExtractIcon)
- Lib est obligatoire pour signaler la procédure externe
- <library> est le nom de l’API appelée (ex : shell32.dll)
- Alias <alias> indique le vrai nom de la procédure permettant de personnaliser <name>
- Des paramètres peuvent être passés si nécessaire
- As Type, en cas de fonction, indique le type retourné par la fonction

Exemple : Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long

Syntaxe VB.Net (via Declare) :

[Private|Public|Friend] Declare [Ansi|Unicode|Auto] Function | Sub _
“<name>” Lib “<library>” [Alias “<alias>”] [([arglist])] [As Type]

- Private, Public et Friend indique la visibilité de la méthode
- Declare, obligatoire, annonce un appel à une procédure externe
- Ansi, Unicode et Auto indique le type d’encodage à utiliser
- Function ou Sub doit être précisé, Sub si rien n’est renvoyé, Function dans le cas inverse
- <name> est le nom de la procédure appelée, il est sensible à la casse
- Lib doit être présent pour signaler la procédure externe
- <library> est le nom de l’API appelée
- Alias <alias> indique le vrai nom de la procédure permettant de personnaliser <name>
- Des paramètres peuvent êtres passés si nécessaire
- As Type, en cas de fonction, indique le type retourné par la fonction

Exemple : Declare Auto Function IsWindow Lib “user32” (ByVal hwnd As IntPtr) As Long

Syntaxe VB.Net (via DllImport) :

<DllImport(<library>”, <params>)> _
[Private|Public|Friend] Shared Function|Sub <alias>” [([arglist])] [As Type]
End Function|Sub

- DllImport sert à importer une procedure externe
- <library> correspond au nom de l’API (ex : «user32»)
- <params> sont une liste de paramètres pour l’appel externe dont nous retiendrons 3 importants :
- EntryPoint :=<name> où <name> désigne le nom de la procédure à appeler
- Charset :=<charset> où <charset> désigne un encodage de caractère
- CallingConvention :=<cv> où <cv> désigne un type d’appel
- Private, Public et Friend indique la visibilité de la méthode
- Shared indique que la procédure est partagée avec le module
- Function ou Sub, Sub si rien n’est retourné, Function le cas inverse
- <alias> définit le nom que vous utiliserez dans votre code pour la fonction
- Des paramètres peuvent êtres passés
- As Type, en cas fe donction, indique le type retourné

Exemple :
<DllImport(“kernel32.dll”, EntryPoint:=”MoveFile”, Charset:=Charset.Auto, _
CallingConvention:=CallingConvention.Winapi)> _
Private Shared Function DeplaceFichier(ByVal src As String, _
ByVal dst As String) As Boolean
End Function

Lors de l’entrée des paramètres à faire passer (pour tout les langages), il faut faire le choix entre ByVal (par valeur, qui fait une copie de la variable) et ByRef(par référence, qui envoi directement l’adresse pour permettre à la fonction de la modifier). Dans une fonction normale, cela n’a presque pas voir pas du tout de conséquence vu qu’on reste dans le module, mais lors de l’appel à une API (module externe), des erreurs peuvent avoir lieu. Notez qu’un handle n’est qu’une adresse, il peut être passé par valeur.

6. L’encodage

Il est généralement possible qu’une fonction nécessite un encodage, elle existe alors en 2 version et ces deux versions se distinguent facilement, une fonction acceptant l’encodage Ansi se termine par la lettre A en majuscule et une fonction acceptant l’encodage Unicode se termine par la lettre W en majuscule.

Exemple : ExtractIconA et ExtractIconW

Sur le site MSDN, référencez-vous au tableau de la fonction, qui indique les types d’encodage à utiliser.

Visual Basic 6 converti directement les paramètres en Ansi, nous n’utiliserons donc que la version Ansi de la fonction. Pour se faire, il faut ajouter le paramètre Alias.

Exemple : Private Declare Function ExtractIcon Lib “shell32.dll” _
Alias “ExtractIconA (ByVal hInst As Long, ByVal Filename As String, _
ByVal Index As Integer) As Long

Visual Basic .Net (via Declare) agit un peu différemment, on peut choisir son encodage, mais il faut le préciser au moment de la déclaration. Notez que l’encodage choisi doit correspondre à l’encodage pris par la fonction.

Exemple (Ansi) : Private Declare Ansi Function ExtractIconA Lib “shell32.dll” _
(ByVal hInst As IntPtr, ByVal FileName As String, ByVal index As Integer) As IntPtr

Exemple (Unicode) : Private Declare Unicode Function ExtractIconW Lib “shell32.dll” _
(ByVal hInst As IntPtr, ByVal FileName As String, ByVal index As Integer) As IntPtr

Exemple (Auto) : Private Declare Auto Function ExtractIcon Lib “shell32.dll” _
(ByVal hInst As IntPtr, ByVal FileName As String, ByVal index As Integer) As IntPtr

Visual Basic .Net (via DllImport) , quant à lui, comme via Declare excepté que vous n’êtes pas obligé de définir le CharSet quand vous travailler en Auto

Exemple (Auto): <DllImport("shell32.dll", EntryPoint:="ExtractIcon", _
CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function OuvrirIcone(ByVal hInst As IntPtr, _
ByVal Filename As String, ByVal Index As Integer) As IntPtr
End Function

Exemple (Ansi) : <DllImport("shell32.dll", CharSet:=CharSet.Ansi, _
EntryPoint:="ExtractIconA", CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function OuvrirIcone(ByVal hInst As IntPtr, _
ByVal Filename As String, ByVal Index As Integer) As IntPtr
End Function

Exemple (Unicode) : <DllImport("shell32.dll", CharSet:=CharSet.Unicode, _
EntryPoint:="ExtractIconW", CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function OuvrirIcone(ByVal hInst As IntPtr, _
ByVal Filename As String, ByVal Index As Integer) As IntPtr
End Function

7. Conversion de types

L’aide sur les API est fournie avec la syntaxe C++, vu qu’elles ont été écrites pour. Il va donc falloir convertir les types C++ en Visual Basic. Pour cela, voici un tableau avec les types courant, la traduction Visual Basic 6 et Visual Basic .Net.

Type C/C++

Type Visual Basic 6

Type Visual Basic .Net

    BOOL, BOOLEAN    

Long ou Boolean

Boolean ou Integer

BSTR

String

String

BYTE

Byte

Byte

CHAR

Byte

Char

DOUBLE

Double

Double

DWORD / LPDWORD

Long

Integer ou UInt32

FLOAT

Double

Single

HANDLE (et autres pointeurs)

Long

IntPtr, UintPtr ou HandleRef

HRESULT

Long

Integer ou UInt32

INT

Long

Integer

LANGID

Integer

Short ou UInt16

LCID

Long

Integer ou UInt32

LONG

Long

Integer

LPARAM

Long

IntPtr, UintPtr ou Object

LPCSTR

String

String

LPCTSTR

String

String

LPCWSTR

String

String

LPSTR

String

String ou StringBuilder

LPTSTR

String

String ou StringBuilder

LPWSTR

String

String ou StringBuilder

LPVOID

Any

IntPtr, UintPtr ou Object

LRESULT

Long

IntPtr

SAFEARRAY

Tableau

Tableau

SHORT

Integer

Short

TCHAR

Byte

Char

UCHAR

Byte

SByte

UINT

Long

Integer ou UInt32

ULONG

Long

Integer ou UInt32

VARIANT

Any

Object

VARIANT_BOOL

Boolean ou Long

Boolean

WCHAR

Byte

Char

WORD

Long

Short ou UInt16

WPARAM

Long

IntPtr, UintPtr ou Object

En VB6, la visionneuse d’API vous évite de passer votre temps à convertir les types, mais il est toujours bon de savoir ce tableau, en .Net, la visionneuse d’API n’est plus livrée, vous devez donc procéder à la conversion.

8. Appel de l’API

L’API est désormais déclarée, vous pouvez l’appeler comme n’importe quelle autre fonction dans toutes les versions de Visual Basic.

9. L’attribut MarshalAs et l’objet Marshal (VB.Net)

L’attribut MarshalAs, pour les types non-managés

Si vous avez souhaité traduire une déclaration VB6 en VB.Net ou même en voulant écrire une nouvelle déclaration, il est possible que l’API retourne une erreur demandant un type non managé. L’attribut MarshalAs est fait pour ça. Nous allons voir comment l’utiliser.

Il faut d’abord savoir qu’il se place avant le paramètre dans la déclaration de la fonction, voici sa syntaxe :

Function|Sub <name> (<MarshalAs(params)> ByVal|ByRef <param> As Type) [As Type]

- Function ou Sub qui désigne le type de méthode
- <name> désigne le nom de la fonction
- <MarshalAs(…)> avec ses nombreux attributs dont nous retiendront 2 éléments importants :
- UnanagedType.<Type> où <Type> désigne un tyoe non managé
- SizeCount =<taille> où <taille> définit la taille d’un tableau ou d’une chaine structurée
- ByVal et ByRef pour signaler le type de passage (Voir Point 5. Déclarer l’API)
- <param> qui est le nom du paramètre
- As Type qui définit le type du paramètre.

Exemple : <MarshalAs(UnmanagedType.LptStr)> ByVal Name As String

L’objet Marshal, pour le travail avec les pointeurs

Il peut aussi arriver par exemple qu’une API vous demande le pointeur du buffer dans lequel écrire (Voir par ex : GetPrivateProfileString), en VB6, un String structuré aurait suffit, en .Net, nous allons travailler avec l’Objet Marshal qui contient des fonctions pour travailler avec les pointeurs.
Un petit exemple :

Déclarons la fonction (Voir http://msdn2.microsoft.com/en-us/library/ms724353.aspx ):

Private Declare Ansi Function GetPrivateProfileStringA Lib “kernel32.dll”(ByVal _
AppName As String, ByVal KeyName As String,ByVal Default As String, ByVal _
RetBuffer As IntPtr, ByVal Size As Integer, ByVal lpFileName As String) As Integer

Remarquez que j’ai donc remplacé le type du paramètre RetBuffer par un IntPtr vu que l’objet Marshal travaille avec les pointeurs. Nous allons donc écrire notre propre fonction qui va lire dans le fichier INI et retourner la réponse en utilisant cet API.

Public Function GetValue(ByVal Section As String, ByVal Key As String, _
ByVal DftValue As String, FileName As String) As String
Dim PtrCh As IntPtr ‘On crée le IntPtr qui contiendra l’adresse du buffer
Dim Lng As Integer ‘ Nombre de caractère retourné par l’API
Dim Chaine As String ‘Chaine qui sera retournée
PtrCh = Marshal.StringToHGlobalAnsi(New String(vbNullChar, 1024))
Lng = GetPrivateProfileString(Section, Key, "", PtrCh, 255, FileName)
Chaine = Marshal.PtrToStringAnsi(PtrCh, Lng)
Marshal.FreeHGlobal(PtrCh)
Return Chaine
End Function

Pour une description complète des fonctions Marshal, consultez l’aide MSDN.

10. Un exemple en VB6

Nous allons… extraire l’icône du Bloc Note pour l’afficher dans un PictureBox.

Nous avons besoin : d’un formulaire avec un PictureBox.

Après quelques recherches sur MSDN, voici ce que nous pouvons trouver :
http://msdn2.microsoft.com/en-us/library/ms648068.aspx
http://msdn2.microsoft.com/en-us/library/ms648064.aspx

Nous allons donc d’abord déclarer les fonctions comme indiqué sur la page MSDN dans le code, voici ce que nous obtenons :

Private Declare Function ExtractIcon Lib “shell32.dll” Alias “ExtractIconA” ( _
ByVal hInst As Long, ByVal ExeFileName As String, ByVal nIconIndex As Long) As Long

Private Declare Function DrawIcon Lib “user32.dll” (ByVal hDC As Long, _
ByVal X As Integer, ByVal Y As Integer, ByVal hIcon As Long) As Boolean

Il ne nous reste plus qu’à utiliser les fonctions, ici j’appelle les fonctions depuis l’évnèement Paint de la PictureBox, donc l’icône s’affichera dès que le contrôle aura été peint au chargement de l’application.

Private Sub Picture1_Paint()
Dim Icon As Long
Icon = ExtractIcon(Me.hdc, “C:\WINNT\NOTEPAD.EXE, 0)
Call DrawIcon(Picture1.hdc, 0, 0, Icon)
End Sub

Voici ce que nous obtenons au lancement du programme :

11. Un exemple en VB.Net

Nous allonsafficher une boîte de dialogue « A propos de… » Windows.

Nous avons besoin : d’un formulaire et d’un bouton

Après quelques recherches, voici ce que nous pouvons trouver :
http://msdn2.microsoft.com/en-us/library/ms647731.aspx

Nous allons d’abord nous référencer à la grille de conversion et/ou aux descriptions de l’API pour pouvoir déclarer notre fonction. Nous allons utiliser le type de déclaration via DllImport. Voici ce que nous obtenons après la déclaration :

<DllImport(“shell32.dll”, EntryPoint:= “ShellAbout”, _
CallingConvention:=CallingConvention.Winapi)> _
Private Shared Function ShellAbout(ByVal hInst As IntPtr, ByVal szApp As String, _
ByVal szOther As String, ByVal hIcon As IntPtr) As Boolean
End Function

Notez ici que j’ai traduit la valeur retournée de type Int en Boolean car MSDN nous indiquait qu’elle retournait True ou False. Je vais donc appeler cette fonction dès que l’év ènement Click du bouton se sera produit :

Private Sub AbtBtn_Click(ByVal sender As System.Object, ByVal e As EventArgs) _
Handles AbtBtn.Click

ShellAbout(Me.Handle, "Mon Application", _
"Ici se trouve le texte de description de l'application.", Me.Icon.Handle)
End Sub

Voici ce que nous obtenons à l’affichage de cette boîte de dialogue (sur Vista Home Premium) :

15 juin 2006 15:15:16 :
Mise en forme
11 août 2007 14:53:03 :
Mise à niveau complète du tutorial
13 août 2007 19:39:53 :
...
02 septembre 2007 14:11:32 :
Erreur mise à jour
05 septembre 2007 14:58:05 :
...
signaler à un administrateur
Commentaire de Aurazed le 04/07/2006 22:11:45

Merci pour ce tutorial, je ne connaissait pas du tout le moyen d'utiliser une api!
Ca va beaucoup me servir!

signaler à un administrateur
Commentaire de sofienems le 06/07/2006 12:09:36

Je  vous remerci pour cette breve description des API et leur usage , mais je peut pas y passé sans te signaler qu'il est indispensable de parler de grand probleme des API , qui est l'interface elle meme, ce probleme majeur des API concisste a la difuculté que trouve le prgrammeur a connaitre l'API necessaire a son travail , ce probleme est du a la diversitée et au tres grand nombre des API existant , pour chercher un API le programeur n'a pas beaucoup de chois 1) MSDN
      2) site de microsoft
      3) 1 ou deux autre site  
j'espere que j'ai pu completé la description des API et leur usage , je parlerai plus tard des limites des API

signaler à un administrateur
Commentaire de Drikce06 le 12/07/2006 15:36:41

Salut
j'ai récupérer sur internet ce petit programme qui donne toute la liste des api avec des exemples, c'est bien fait et il me sert énormément et cela évite effectivement de passer 30 ans à chercher l'API que tu veux. Donc si cela vous interesse ça s'appel "API-GUIDE 3.7". Je sais plus où je l'ai eu mais une recherche google et hop.
Sinon le probleme que je rencontre moi, c'est que tous les exemples sont en vb6, et lorsqu'on les veut en .Net il faut faire des bidouilles principalement au niveau des déclarations et le fait que les any n'existe plus pose également probleme.

signaler à un administrateur
Commentaire de tof008 le 21/07/2006 12:25:36

Bravo pour ce tutorial clair et concis! Voila qui m'a appris ce que sont et comment me servir des API!
Encore Bravo et merci!

signaler à un administrateur
Commentaire de kharrat le 27/10/2006 00:24:40

bon tutoriel!

Un petit regret cependant: avoir un exemple précis en vb6 et le même en vb.NET, du style CreateProcessA ou autre.

+

signaler à un administrateur
Commentaire de d_wadi3 le 05/03/2007 17:46:58

salut j'ai bien lit ton tutoriel mais il me parait qu 'il n résoud pas mon problème
en effet j'ai une application ou je vais faire appel a une api et l'une des fonctions que je vais utiliser renvoie en pointeur sur une structure
mon probleme est que je n'ai pas pu récupérer ce pointeur j'ai essayé partout mais il'y'a toujours un probleme concernat le marshaling d'un type non managé a un type non manage
si vous avez une solution a mon probleme veuillez bien me prevenir le plutot possible
merci

signaler à un administrateur
Commentaire de anthonygego le 08/08/2007 17:48:05

d_wadi3 : A mon avis, cela vient de l'utilisation de l'API

Je prépare une mise à jour(qui devrait être faite dans la soirée), je refais entièrement le tuto, mais avec un peu d'interactivité ^^ Car de plus, je dois l'admettre, il y a des fautes...

signaler à un administrateur
Commentaire de anthonygego le 09/08/2007 20:00:38

Si cela t'intéresse toujours, as-tu mis un ByRef dans la déclaration ? Je pense que ça pourrait être la solution.

Je n'ai pas encore terminé le nouveau tuto mais il sera agrémenté d'exemples, et sera plus complet, plus précis et plus clair. Je parlerai aussi des problèmes rencontrés, tels que la conversion de types C en VB.

signaler à un administrateur
Commentaire de anthonygego le 24/09/2007 17:02:59

Voila, le tuto est mis à jour... après un long moment d'attente et d'essais, mais surement dû à la mise à jour du site. J'espère avoir une meilleure cote que celle actuelle.

signaler à un administrateur
Commentaire de korpica le 08/08/2008 23:54:59

jolie tuto, tu peux toujours le mettre  jour, il y a tellement de chose a dire sur ca

signaler à un administrateur
Commentaire de shadowmosses le 20/09/2008 11:09:41

anthonygego Ton tutorial est très intéressent, Merci a toi de l'avoir mis en ligne.
Et je remercie Aussi Drikce06 pour le soft "API-GUIDE 3.7"
Messieurs, je vous souhaite des excellentes Programmations.

signaler à un administrateur
Commentaire de rgiplus le 22/09/2008 09:44:56

Merci pour ton tuto. Comme il y a beaucoup de sources mais très dispersées sur le sujet API, aurais-tu des directions de recherche, des exemples, ... sur :
les API et le C# ?

signaler à un administrateur
Commentaire de rgiplus le 22/09/2008 09:56:31

sinon, pour qui trouve plus de travailler EN FRANÇAIS voici http://docvb.free.fr/code.php#z89

signaler à un administrateur
Commentaire de gillardg le 12/10/2008 02:22:55

pour utiliser les api en vb.net , le plus simple est d'utiliser P /Invoke Interrop Assistant
http://msdn.microsoft.com/en-us/magazine/cc164193.aspx

signaler à un administrateur
Commentaire de gillardg le 12/10/2008 02:25:10

http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120

signaler à un administrateur
Commentaire de Galactus13 le 18/11/2008 03:17:12

Magnifique tuto ! cela fait des mois que je cherche à comprendre comment utiliser les API.
Enfin quelqu'un qui pense aux débutants !
me reste plus qu'a faire des tests pour savoir si j'ai tout compris ! ma note ? 10/10 !
Seule regret ? un peu plus d'exemples peut-être ...
Oui, je suis gourmand !

signaler à un administrateur
Commentaire de Setsuna07 le 31/12/2008 15:19:30

Excellent tuto! Je vais enfin pouvoir utiliser les API, j'avais vraiment beaucoup de mal à cerner la notion jusqu'à présent. 10/10

signaler à un administrateur
Commentaire de Ouggada le 18/02/2009 14:33:48

Supaa tuto!!
rien à redire!!
Sur ce bonne continuation!!

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

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,016 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é.