Convertir les apis écrits en c++ vers vb

Description

Vous voulez tout savoir sur les APIs écrits en C++, mais vous chérissez votre VB au lieu du C++?... Hé bien, voilà 1 zoli tuto' que j'ai fouiné & trouvé sur le net!... Mais malheureusement, c'est qui l'auteur? J'ai oublié de le noter dans ma précipitation!... Dommage, donc, si jamais l'1 parmi vous le reconnaît, faites-le moi savoir afin que je l'insère dans l'en-tête de ce tutoriel, car croyez-moi, sans déconner, il est très bien fait!...

Source / Exemple :


N'ayez crainte, vous n'aurez pas à apprendre le langage C++ pour être capable de convertir les fichier "header" (fichier où l'on trouve tout ce qui concerne les api en C++) en Visual Basic. Ce didacticiel va vous donner les rudiments nécessaires pour commencer à convertir les documentations du C++ vers VB
Note : toutes les exemples ci-dessous sont tirés du fichier CommCtrl.h, le fichier header des Windows Common Controls Api 

 

Nous débutons cet apprentissage par les constantes, car c'est certainement le moyen le plus facile pour commencer
Premier exemple : 
#define ICC_COOL_CLASSES 0x00000400 // rebar (coolbar) control
La 1ère chose à noter est // rebar (coolbar) control. En C++, 2 slashs (//) sont utilisés comme simple ligne de commentaire, sachant que ce commentaire se terminera forcément en fin de ligne.
#define est utilisé pour créer des macros. Mais VB ne peut pas créer de macros, mais lorsque l'on convertit de C++ vers VB, on transcris ces lignes en constantes.
Dans ce cas #define deviendra Public Const si vous déclarez ces constantes dans un module VB.
Manifestement ICC_COOL_CLASSES est le nom de la constante.
Donc pour le moment, nous avons :
Public Const ICC_COOL_CLASSES 0x00000400 ' rebar (coolbar) control 
mais tout cela ne fonctionnera pas dans un projet VB. Nous avons convertis les commentaires ainsi que la déclaration #define. Une constante possède une valeur. Mais quel est cet étrange nombre ??
Tout simplement, il s'agit d'une valeur hexadécimale. En C++, toutes les valeurs hexa commencent avec le caractère "0x". Il suffit de d'adapter cette valeur à VB : &H00000200, ou depuis que les 0 d'en-têtes ne sont plus affichés en VB : &H200. Maintenant la seule chose restant à faire est d'insérer le caractère "=" entre le nom et la valeur : 
Public Const ICC_COOL_CLASSES = &H200 ' rebar (coolbar) control 
Comme exercice, transcrivez les valeurs suivantes en VB : 
#define ICC_UPDOWN_CLASS 0x00000010 // updown
#define ICC_PROGRESS_CLASS 0x00000020 // progress
#define ICC_HOTKEY_CLASS 0x00000040 // hotkey
#define ICC_ANIMATE_CLASS 0x00000080 // animate
#define ICC_WIN95_CLASSES 0x000000FF
#define ICC_DATE_CLASSES 0x00000100 // month picker, date picker, time picker, updown
#define ICC_USEREX_CLASSES 0x00000200 // comboex
Regardez les constantes suivantes : 
#define ODT_TAB 101
#define ODT_LISTVIEW 102
Tout simplement, ces valeurs ne sont pas hexa, de cette manière on peut directement les convertir en : 
Public Const ODT_TAB = 101 
Public Const ODT_LISTVIEW = 102 
Voici encore une autre variation de déclarations de constantes en C++ : 
#define TTN_FIRST (0U-520U) // tooltips
#define TTN_LAST (0U-549U) 
Ici les valeurs se terminent par "U", ce qui veut dire que la constante est du type "unsigned long", un type de donnée non supporté par VB. Cela veut-il dire qu'on ne peut pas utiliser ces constantes ? Pas du tout! Une donnée du type unsigned long ou signed long (en VB Long) sont stockées internement de la même façon, et la seule différence est la façon dont ils sont affichées. Dans ce cas, tout ce qu'on doit faire, est d'enlever le "U" de la déclaration et d'insérer le caractère "=" : 
Public Const TTN_FIRST = (0 - 520) ' tooltips
Public Const TTN_LAST = (0 - 549)
De temps en temps, vous rencontrerez aussi des valeurs se terminant par "L". Cela veut dire que la constante est du type Long, et vous pouvez aussi enlever ce caractère, comme le U ci-dessus.
Et comment fait-on avec ces constantes ? 
#define CDDS_ITEMPREERASE (CDDS_ITEM | CDDS_PREERASE) 
#define CDDS_ITEMPOSTERASE (CDDS_ITEM | CDDS_POSTERASE)
De même, cela est aussi une convertion facile. Le caractère "|" est un opérateur ou bitwise en C++, comme l'opérateur Or en Visual Basic. Remplacez | par Or : 
Public Const CDDS_ITEMPREERASE = (CDDS_ITEM Or CDDS_PREERASE) 
Public Const CDDS_ITEMPOSTERASE = (CDDS_ITEM Or CDDS_POSTERASE)

 

Connus sous "Types" ou "Types défini par l'utilisateur" en VB, déclaré en utilisant le mot clé Type. Maintenant il va falloir faire plus que d'insérer le signe "=" ou d'enlever certains caractères bizarres - il faudra convertir des types de données, et dans certains cas ce sera très vicieux. Commençons avec un exemple simple : 
typedef struct tagTBSAVEPARAMSA { 
HKEY hkr; 
LPCSTR pszSubKey; 
LPCSTR pszValueName; 
} TBSEVEPARAMSA, FAR* LPTBSAVEPARAMSA;
typedef struct tagTBSAVEPARAMSW {
HKEY hkr; 
LPCSTR pszSubKey;
LPCSTR pszValueName;
} TBSEVEPARAMSW, FAR* LPTBSAVEPARAMSW; 
Et cela est supposé être simple ? Le 1ère note a prendre est que nous avons 2 structures qui sont pratiquement idem, à part sur un point : la 1ère structure TBSAVEPARAMSA est utilisée pour compiler du code ANSI, tandis que la seconde est utilisée pour des programmes UNICODE. En fait toutes les structures utilisées pour ANSI se terminent par la lettre A dans leur nom, et les structures UNICODE se terminent par W. A part les noms, la seule différence est le type de chaîne utilisée - ANSI ou UNICODE. Visual Basic ne vous autorise pas à appeler la partie UNICODE de l'Api (bien que cela est possible si vous aimez vous compliquer la vie), donc vous n'avez pas besoin de la version UNICODE. Commençons par la 1ère ligne :
typedef struct tagTBSAVEPARAMSW {
1ère chose, convertissons la partie typedef struct en Public Type. Maintenant, le nom de la structure est quelque part sur le reste de la ligne. Beaucoup de C++ structures commencent avec le mot "tag", mais VB n'a pas besoin de ce mot, on peut donc l'enlever. Vous pouvez aussi faire sauter le A en fin du nom, car vous n'avez pas à différencier les versions ANSI et UNICODE de la structure, de même que le caractère "{" que vous pouvez aussi enlever. Qu'avons nous pour le moment :
Public Type TBSAVEPARAM
Les 3 lignes suivantes sont les membres de la structure :
HKEY hkr;
LPCSTR pszSubKey;
LPCSTR pszValueName; 
Au contraire de Visual Basic, en C++ le type de données est en 1er et le nom de la variable en second. Quel est l'équivalent en VB du type HKEY en C++ ? Une chose a toujours retenir lorsque vous convertissez est que la plupart des types de données en C++ commençant par H sont des handles vers quelque chose. Si vous avez utilisé les Api Win32, vous savez certainement ce qu'est un handle ; chaque objet Form (et beaucoup de contrôles) en VB possède une propriété hWnd, que l'on peut traduire par "handle to a Window". La propriété hWnd est du type Long en VB, et toutes les variables qui stockent des handles le sont. Donc la conversion correct pour cette variable est :
hkr As Long 
Similairement, les types de données LPSTR et LPCSTR en C++ sont converties en chaînes (String). Ces types sont des pointeurs vers des chaînes, mais vous n'avez pas besoin de vous en préoccupez en VB, car lorsque vous envoyez une structure vers Api, VB convertira toutes les chaînes dans la structure en pointeur vers des chaînes ANSI. Donc, les 2 autres membres de la structure peuvent être converti en :
pszSubKey As String
pszValueName As String 
Attaquons maintenant la dernière ligne :
} TBSEVEPARAMSA, FAR* LPTBSAVEPARAMSA; 
Tout ce qui se trouve après "}" n'intéresse plus les développeurs VB et on peut l'enlever. Il suffit simplement de rajouter le familier End Type. Voila à quoi ressemble tout cela en VB :
Public Type TBSAVEPARAMS 
hkr As Long 
pszSubKey As String 
pszValueName As String 
End Type
Voici un autre exemple, mais un peu plus grand cette fois :
typedef struct {
UINT cbSize;
DWORD dwMask;
int idCommand;
int iImage;
BYTE fsState;
BYTE fsStyle;
WORD cx;
DWORD_PTR lParam;
LPSTR pszText;
int cchText;
} TBBUTTONINFOA, *LPTBBUTTONINFOA;
Oops !! Le nom de la structure ne se trouve pas après typedef.
Vous devez vous rappelez que, en règle générale, lorsque le nom de la structure ne se trouve pas sur la 1ère ligne, il se trouve alors sur la dernière ligne. Vous voyez aussi que le nom se termine par A (ANSI).
Donc la dernière ligne spécifie le nom de la structure (ci-dessous en rouge) :
} TBBUTTONINFOA, *LPTBBUTTONINFOA; 
Donc la 1ère ligne ressemblera en VB a ceci :
Public Type TBBUTTONINFO
Maintenant il faut convertir toutes les variables du type C++ en Visual Basic.
Pour cela, veuillez consulter la page sur la conversion du type de donnée.
En utilisant ces renseignements, vous pouvez convertir presque n'importe quelle structure C++ vers son équivalent en VB.
Donc voici la conversion de la structure étudiée :
Public Type TBBUTTONINFO
cbSize As Long
dwMask As Long
idCommand As Long
iImage As Long
fsState As Byte
fsStyle As Byte
cx As Long
lParam As Long
psztext As String
cchText As Long
End Type

 

Connaître de quelle manière convertir les déclarations de fonction en C++ est extrênement précieux, car il y a une très grande partie de fonction Api qui ne se trouve pas dans la visionneuse d'Api livrée avec VB.
Prenons notre 1er exemple (exporté de CommCtl32.dll) :
WINCOMMCTRLAPI HWND WINAPI CreateStatusWindowA(LONG style,
LPCSTR lpszText,
HWND hwndParent,
UINT wID); 
WINCOMMCTRLAPI HWND WINAPI CreateStatusWindowW(LONG style,
LPCWSTR lpszText,
HWND hwndParent,
UINT wID);
Cet appel crée un contrôle StatusBar - vous ne trouverez cette déclaration nul part dans la doc de VB ! Les types de données (déjà abordé dans la partie Structures et plus précisément sur cette page) que vous savez maintenant convertir, sont ici exactement pareil. Encore une fois il y a 2 versions de la déclaration : une avec ANSI et l'autre en UNICODE. Vous vous souvenez qu'en VB nous utilisons la déclaration ANSI, donc enlevons l'UNICODE : 
WINCOMMCTRLAPI HWND WINAPI CreateStatusWindowA(LONG style,
LPCSTR lpszText,
HWND hwndParent,
UINT wID); 
En 1er que veut dire WINCOMMCTRLAPI ? Il dit tout simplement au C++ compilateur que cette fonction peut-être exportée de ComCtl32.dll. Avec des fonctions d'autres DLL, le préfix sera différent, et tous n'ont pas toujours de sens. Parfois, vous n'avez qu'a jeter un oeil sur une fonction dans MSDN Online Library pour savoir de quelle DLL elle provient.
Ensuite vient le type de retour de la fonction : HWND. Vous savez maintenant que HWND est convertit en Long en VB, et comme le type de retour de la fonction est HWND vous pouvez être certain que cette fonction retournera le hWnd de la Statusbar crée, si la fonction a réussi biensûr.
Qu'avons nous pour le moment :
Public Declare Function CreateStatusWindowA Lib "comctl32.dll" (.......) As Long
Vous vous demandez sûrement comment les arguments de cette fonction peuvent être déclarés sur plusieurs lignes sans un caractère de continuation de ligne - la ligne est automatiquement continué jusqu'à ce que le compilateur arrive au caractère point-virgule ";". En VB si vous voulez déclarer une fonction sur plusieurs lignes, vous devez utiliser le caractère de continuation de ligne, "_" 
Public Declare function CreateStatusWindowA Lib "Comctl32.dll" (ByVal style As Long, ByVal lpszText As String, ByVal hwndParent As Long, ByVal wID As Long) As Long
Voici encore une autre fonction à étudier :
WINCOMMCTRLAPI void WINAPI MenuHelp(UINT uMsg,
WPARAM wParam, LPARAM lParam, HMENU hMainMenu,
HINSTANCE hInst, HWND hwndStatus, UINT lpwIDs);
et 
WINCOMMCTRLAPI void WINAPI MenuHelp(UINT uMsg,
WPARAM wParam, LPARAM lParam, HMENU hMainMenu,
HINSTANCE hInst, HWND hwndStatus, UINT FAR *lpwIDs);
Les 2 déclarations sont identique uniquement pour le dernier paramètre. Le paramètre dans la seconde déclaration est :
UINT FAR *lpwIDs
Cette seconde déclaration est celle qui est correct, mais savez vous ce qui doit être changé dans la conversion VB lorsqu'un type de donnée est déclaré comme pointeur ("*" ou "FAR") ? Si vous ne l'avez jamais fait auparavant, surement que non. En VB, vous savez que les pointeurs sont une référence à une variable. Ok ?
La plupart des paramètres sont déclarés avec ByVal, mais lorsqu'un paramètre est un pointeur il faut déclarer le paramètre sans ByVal (en d'autre mot, c'est ByRef). Mais, comme toujours il y a toujours une exception dans la règle. Cette exception intervient lorsque le pointeur (paramètre) est une chaîne (String). Un pointeur String doit toujours être déclaré ByVal, à moins qu'il soit défini comme un "pointeur vers un pointeur", ou lorsqu'on utilise 2 astérisques ** au lieu d'un seul *. dans le cas de 2 astérisques, la conversion doit être un paramètre ByRef.... As Long, et la valeur Long passée doit être égal à StrPtr(MyStringVar). StrPtr est une fonction VB non documentée qui retourne le pointeur au début d'un String.
Un autre point, est que menuhelp's retourne un type de donnée déclaré comme void. Ce qui veut dire que l'appel n'a pas de valeur de retour, en d'autre mot, ce n'est pas une fonction mais une Sub.
MenuHelp Sub doit être converti ainsi :
Public Declare Sub MenuHelp Lib "Comctl32.dll" (ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal hMainMenu As Long, ByVal hInst As Long, ByVal hwndStatus As Long, lpwIDs As Long)

 

Type de donnée C++ 	Equivalent VB 
short	Integer
int	Long
long	Long
UINT	Long
ULONG	Long
WORD, DWORD	Long
WPARAM, LPARAM	Long
WMSG, UMSG	Long
HRESULT	Long
BOOL	Long
COLORREF	Long
HWND, HDC, HBRUSH, HKEY, etc... (windows handles)	Long
LPSTR, LPCSTR	String
LPWSTR, OLECHAR, BSTR	String
LPTSTR	String
VARIANT_BOOL	Boolean
unsigned char	Long
BYTE	Byte
VARIANT	Byte
tout type de donnée avec * ou ** à la fin	Long
ATOM	Integer
LPDWORD	Long
LPINT, LPUINT	Long
LPRECT	Type défini par l'utilisateur (As type)
LPVOID	Any
LPWORD	Integer
LRESULT	Long
NULL	Any ou ByVal ... As Long

Bon le tableau a encore foiré ici, normal... ;-)

Conclusion :


Bien sûr, si c'est pô très clair le texte ci-dessus, bien vous avez qd même le zip pour ça!!! ;-P

Hé bien voilà, à vous de juger ce que vs en pensez!... Comme je voyais qu'il n'y avait pô 1 seul tuto' là-dessus, autant vous en faire profiter!...

Je le mets dans section tutoriel mais y a aussi section API, alors?...

Codes Sources

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.