Soyez le premier à donner votre avis sur cette source.
Vue 13 281 fois - Téléchargée 735 fois
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... ;-)
9 avril 2008 à 13:37
http://www.vbthunder.com/articles/readcpp.php pour l'auteur (ce n'est pas moi, mais en cherchant je suis tombé sr les deux tutos en même temps. Très bien fait d'ailleurs, merci!)
11 juil. 2005 à 15:06
++
13 mai 2003 à 15:29
Mais je n'arrive pas a passer un pointeur de structure à une fonction
alors que le type est bien en Long. IL me dit type incorrect tout le temps ... C'est possible que quelqu'un fasse un petit détaillage sur ce point ? Une structure VB que l'on doit passer par pointeur à une fonction qui remplit cette structure.
Merci infiniment !
21 nov. 2001 à 11:23
Allez bonne prog'!!!!!!!!
Gogogogogogogogoooooooooo
20 nov. 2001 à 15:53
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.