begin process at 2012 02 17 06:16:02
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

API

 > LES APPELS D’APIS EN VB.NET ET CONVERSION DE CODE VB6 VERS VB.NET

LES APPELS D’APIS EN VB.NET ET CONVERSION DE CODE VB6 VERS VB.NET


 Information sur le tutoriel

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10


 Description

Décrit la traduction des paramètres et des structures pour les appels d'api depuis des prototypes C et du code VB6.

Tutorial

Les appels d’APIs

Quand on commence àfaire de la programmation proche du système, donc avancée,on a souvent besoin d’API : fonctions proposées par lesystème d’exploitation. Ces fonctions sont stockéesdans de bibliothèque de liens : les DLLs.


Il en existe troiscatégories principales :

  • User32.dll : toutes le fonctions en rapport avec les fenêtres

  • Gdi32.dll : tout ce qui est en rapport avec les images

  • Kernel32.dll : tout ce qui a rapport avec les mécanismes internes : informations système, système de fichier, mutes, sémaphores.


I.Déclaration


Les déclarationsd’APIs se font comme suit :

{Private|Public}Declare [{Ansi|Unicode}] {Function|Sub} nom_fonction [Alias“vrai_nom_fonction“] Lib “nom_dll.dll“ (Param1 As Type1,Param2 As Type2,… ParamN As TypeN) [As TypeRetour]


{Private|Public} :portée de la déclaration (privée oupublique)


{Ansi|Unicode} :indique si les chaines sont traitées comme ANSI (1 octet) ouUNICODE (2 octets)


{Function|Sub} :fonction ou procédure, une API Windows est rarement uneprocédure (sauf CopyMemory)


[Alias“vrai_nom_fonction“] : permet de renommer la fonction sisont vrai nom est, par exemple, trop long ou trop compliqué (_fct@8) ou pour importer des fonctions exportées par Index (dans cecas l’alias sera #index).


Penser à regarder si uneclasse faisant la même chose que l’API n’existerait pas…


1.Les paramètres


Il existe deux typesde paramètres : les paramètres par valeur et lesparamètres par référence (pointeur).


Un paramètrepar référence indique que l’on passe l’adresse dela variable à la fonction pour pouvoir modifier la variable àl’intérieur. Le nom d’un tel paramètre est précédéde ByRef.


Un paramètrepar valeur indique que l’on passe le contenu de la variable àla fonction. On ne peut donc pas modifier la variable àl’intérieur de la fonction. Le nom d’un tel paramètreest précédé de ByVal ou rien (ByVal par défaut).


2.Le type de retour


Si c’est une Sub,alors il n’y a pas de type de retour.

Sinon, c’est presquetoujours un Integer. Tout type de retour de plus de 4 octetsdevrait être passé par référence enparamètre.


3.Et si ma fonction n’est pas dansune liste


Alors la c’est unpeut plus compliqué. Mais si vous êtes là, c’estque vous avez le prototype C de votre fonction.


Pour que VB puisse utiliser unefonction C comme une API, il faut :

  • Que la convention d’appel soit STDCALL (par défaut cdecl en C)

  • Qu’elle soit exportée avec un extern « C » ou un def file


II. Traduction des types

L‘attribut MarshalAs


Cette attribut seplace avant le paramètre : <MarshalAs(…)>{ByRef|ByVal} nom As Type.

Par exemple :

PublicSub M1 (<MarshalAs(UnmanagedType.LPWStr)> msg As String)


On peut aussil’appliquer à un member de structure :

Par exemple :

<MarshalAs(UnmanagedType.LPWStr)> Public msg As String


Pour utilisercorrectement l’attribut MarshalAs, il faut ajouter la clause, endébut de classe :

ImportSystem.Runtime.InteropServices


Les types standards


Voici un tableau detypes courants et de leurs traductions VB6 :


Type en C

Type en VB

Char

ByVal Byte (mais considéré non signé)

Short

ByVal Short

Int

ByVal Integer

Long

ByVal Integer

unsigned char

ByVal Byte

unsigned short

ByVal Short (mais considéré signé)

unsigned int

ByVal Integer (mais considéré signé)

unsigned long

ByVal Integer (mais considéré signé)

BOOL

ByVal <MarshalAs(UnmanagedType.Bool)> param As Boolean


bool

(<MarshalAs(UnmanagedType.I1)> param As Boolean

Float

ByVal Single

Double

ByVal Double

ULONGLONG, LONGLONG

ByVal Long

char*

ByVal <MarshalAs(UnmanagedType.LPStr) param As String

Short*

ByRef Short

int*

ByRef Integer

long*

ByRef Integer

unsigned char*

ByRef Byte

unsigned short*

ByRef Integer (mais considéré signé)

unsigned int*

ByRef Long (mais considéré signé)

unsigned long*

ByRef Long (mais considéré signé)

BOOL*

ByRef <MarshalAs(UnmanagedType.Bool)> param As Boolean

float*

ByRef Single

double*

ByRef Double

ULONGLONG*, LONGLONG*

ByRef Long

BSTR

ByVal <MarshalAs(UnmanagedType.BStr)>param As String

BSTR*

ByRef <MarshalAs(UnmanagedType.BStr)>param As String

TCHAR*

ByVal <MarshalAs(UnmanagedType.LPTStr)>param As String

IUnknown*

ByVal <MarshalAs(UnmanagedType.IUnknown)> param As Object

IUnknown**

ByRef <MarshalAs(UnmanagedType.IUnknown)> param As Object

Interface*

ByVal {Object|Interface}

Interface**

ByRef {Object|Interface}

Structure

ByVal Structure

Structure*

ByRef Structure (avec Attributs éventuellement pour les tableaux)

Tableau C

Voir plus bas

SAFEARRAY(type)*

ByRef <MarshalAs(UnmanagedType.SafeArray,SafeArraySubType:=Type) param As Type

Currency de COM

<MarshalAs(UnmanagedType.Currency)> param As Decimal

Type param[taille]

<MarshalAs(UnmanagedType.LPArray, SizeConst=taille)> param() As Type

char param[taille]

<MarshalAs(UnmanagedType.LPArray, SizeConst=taille)> param() As String

Hxxx

Integer (représente un handle)


Pour les autres types, il estnécessaire de rajouter des attributs aux paramètres

Le type Any de VB6

<MarshalAs(UnmanagedType.AsAny)>param As Object

Mais il estpréférable de déclarer plusieurs fonctionsDeclare avec les différents types possibles pour le paramètre.


Les types pointeurs


Il existe un typepointeur en VB.Net : System.IntPtr.

Note : Lesfonctions VarPtr, ObjPtr et StrPtr n’existent plus et jedéconseille d'essayer de les réécrire car lesversions possibles ne marchent pas aussi bien.

Voir Travailleravec les pointeurs


Les types Structures

Attribut StructLayout

On peut changer letype de chaînes de caractères, l’alignement et lataille de la structure. :

<StructLayout(LayoutKind.Sequential,CharSet :=charset,Pack :=alignement,Size:=taille)>

Private Structure nom

….

End Structure

charset (facultatif): CharSet.Unicode ou CharSet.Ansi

alignement (facultatif): aligner tous les 1, 2, 4, 8, 16, 32, 64 ou 128 octets

taille (trèsfacultatif): taille absolue de la structure en octet


Note sur le contenudes structures :

  • Les chaînes de taille fixe dans les structures (CHAR/WCHAR/TCHAR nom[taille]) se traduisent en <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=taille)>param() As String

Letype de charset (char/ANSI ou wchar/UNICODE) est défini dansl’attribut StructLayout de la structure.

  • Les chaines char*, WCHAR*, TCHAR* sont remplacées par <MarshalAs(UnmanagedType.LPStr)>membre As String, <MarshalAs(UnmanagedType.LPWStr)>membre As String et <MarshalAs(UnmanagedType.LPTStr)>membre As String.

  • Les types pointeurs sont System.IntPtr. Voir classe Marshal plus bas

  • Les tableaux de taille fixe type nom[taille] se traduisent par <MarshalAs(UnmanagedType.ByValArray, SizeConst:=taille)>param() As Type

  • Pour les autres types :

Type C

Type VB

char/BYTE

Byte (interprété non signé)

short/USHORT/WORD

Short

int, long/DWORD/ULONG

Integer

ULONGLONG

    Long

Float

Single

double

Double

BOOL/BOOLEAN

Integer

bool

Byte



Passer un tableau type C : de typesimples ou de structures

Pour passer un tableaude type C, on a UNE SEULE solution :

  • <MarshalAs(UnmanagedType.LPArray)>ByRef Type_des_cases_du_tableau : dans ce cas, on passe la première case du tableau (alloué), en général, il y a un paramètre pour donner la taille du tableau que l’on passe

Parexemple :

Dimt(10) As Long

Res= Fct(t(0),10)


Passer un tampon chaîne type C

Pour passer un bufferchaîne C : char/wchar* buffer (int taille, suit engénéral), on utilise un ByVal String. Il fautimpérativement remplir la chaîne avec des caractèresavant de la passer à la fonction.

Parexemple :

Dim sas New String(20)

res =Fct(s,20)

On peut aussi utiliserla classe StringBuilder de la même façon.


Les pointeurs de fonctions de rappel(callback)

On peut utiliser letype « Delegate ». Pour cela :

  • On écrit le prototype Delegate de la fonction callback : {Private|Public|Protected} Delegate Function nomDelegate(params) As retour

  • Ecrire la déclaration de la fonction qui prend en paramètre le pointeur de fonction avec comme type pour ce paramètre pointeur de fonction nomDelegate.

  • Créer une fonctions ayant le même prototype que le delegate sans Delegate :

{Private|Public|Protected}Function nom(params) As retour

...

EndFunction

  • Lors de l'appel de la fonction déclarée, passer au paramètre pointeur de fonction : AddressOf nom


Note: nomDelegate n'a rien d'obligatoire : vous pouvez donner unautre nom au type delegate. Vous pouvez aussi avoir plusieursfonctions du même prototype que le delegate.


Travail avec les pointeurs :l’objet Marshal

Le type IntPtr


Un IntPtr se construitavec un Integer ou avec un Long. On peut le convertir en Integer etLong. Pour initialiser le pointeur à NULL, on écrit :ptr = IntPtr.Zero.


Lecture et écriture direct dans lesdonnées d’un pointeur


Type peutprendre différentes valeurs : Byte, Int16, Int32, Int64et IntPtr.


Pour lire directementen mémoire, on utilise les fonctions Marshal.ReadType.Il en existe deux (en réalité trois) versions :

Marshal.ReadType(ByValpointeur As IntPtr) As Type

Marshal.ReadType(ByValpointeur As IntPtr, ByVal offsetAs Integer) As Type


Lapremière version renvoie la donnée pointée parpointeur. On l’utilise pour les données seules.

Laseconde version renvoie la donnée pointée parpointeur[offset]. On l’utilise pour lesdonnées type tableau C.


Exemple :

Dim ptr As IntPtr =‘adresse trouvée quelque part…

Dimb As Byte = Marshal.ReadByte(ptr)


Pour écriredirectement en mémoire, on utilise les fonctionsMarshal.WriteType. Il en existe deux (en réalitétrois) versions :

Marshal.WriteType(ByValpointeur As IntPtr, ByVal valeur AsType) As Type

Marshal.WriteType(ByValpointeur As IntPtr, ByVal offsetAs Integer, ByVal valeur As Type)As Type


Lapremière version écrit valeur dans la zonepointée par pointeur. On l’utilise pour les donnéesseules.

Laseconde version écrit valeur dans la zone pointéepar pointeur[offset]. On l’utilise pour lesdonnées type tableau C.


Exemple :

Dim ptr As IntPtr =‘adresse trouvée quelque part…

Dimb As Byte = Marshal.WriteByte(ptr,19)


Copier les donnéesd'un pointeur vers un objet VB

Pour les types simples et les tableaux detypes simples


La fonction Copypermet de copier des tableaux

  • d’un pointeur vers un tableau VB

OverloadsPublic Shared Sub Copy(ByVal zone_source As IntPtr,ByVal tableau_destination() As Type,ByVal index_début_copie As Integer, ByValnb_case_copie As Integer)

  • d’un tableau VB vers un pointeur

OverloadsPublic Shared Sub Copy(ByVal tableau_source() As Type,ByVal index_début_copie As Integer, ByValdestination As IntPtr, ByVal nb_case_copieAs Integer)

Pourla fonction Copy, Typepeut prendre les valeurs suivantes : Byte, Char, Double,Short, Integer, Long, Single.


Les chaînes de caractères


Les fonctionsPtrToStringAnsi, PtrToStringBSTR, PtrToStringUni permettent de copierune chaîne de caractères respectivement : ANSI (1octet), BSTR (2 octets), UNICODE (2 octets).

Il existe deuxversions de ces fonctions :

  • prenant en paramètre un pointeur de type IntPtr et renvoyant un objet String contenant la chaîne entière

  • prenant en paramètre un pointeur de type IntPtr et le nombre de caractère à copier (Integer) et renvoyant un objet String contenant la chaîne copiée


Les structures


La fonctionPtrToStructure permet de copier une structure unique. Il en existedeux versions :

  • Sub PtrToStructure(ByVal ptr As IntPtr, ByVal structure As Object)

Cetteversion permet de copier une structure pointée par ptrdans un objet structure existant

Exemple :

Dim ptrAs IntPtr = ‘une adresse quelconque

Dims As New MaStructure

Marshal.PtrToStructure(ptr,s)



FunctionPtrToStructure(ByVal ptr As IntPtr, ByValstructureType As Type) As Object

Cetteversion alloue un nouvel objet structure de type structureTypeà partir des données ptr.

Exemple :

Dim ptrAs IntPtr = ‘une adresse quelconque

Dims As MaStructure = CType(Marshal.PtrToStructure(ptr,GetType(MaStructure)), MaStructure)


Les tableaux de structures


On peut faire uneboucle en incrémentant le pointeur de la taille d'unestructure : ptr = New IntPtr(ptr.ToInt32 + taille).


Transformer un objet VB enpointeur

VarPtr,StrPtr et ObjPtr : GCHandle


Note : ces fonctions sont àutiliser en dernier recourt : penser aux fonctions de l'objet Marshalavant de faire un CopyMemory VarPtr. L'objet Marshal donne du codeplus sûr.


VarPtr : déconseillée


La classeGCHandle permet de réécrire ces fonctions trèsutiles de VB6.


PublicFunction VarPtr(ByVal obj As Object) As IntPtr

Dim g AsGCHandle = GCHandle.Alloc(obj,GCHandleType.Pinned)

Dim ptrAs IntPtr = g.AddrOfPinnedObject()

g.Free()

Returnptr

EndFunction


Unefois que l’on a le pointeur vers la variable destination etle pointeur source (ou inversement), on peut faire une copiede mémoire avec CopyMemory comme avec VB6.


ATTENTION : tous les types (etsurtout les structures avec ByvalArray) ne sont pas Pinnable. Il sepeut donc que cette fonction échoue.


Pouravoir les mêmes fonctionnalités :


Dim ptrAs IntPtr = Marshal.AllocHGlobal(taille)

'onappelle la fonction avec un paramètre Byval IntPtr

Dimattr As type =CType(Marshal.PtrToStructure(ptr, GetType(type)),type)

Marshal.FreeHGlobal(ptr)


On peutaussi convertir un GCHandle (créé avec GCHandle.Alloc)en IntPtr et inversement avec GCHandle.op_Explicit.


StrPtr


Note :il est préférable d'utiliser les attributs deparamètres, Ansi ou Unicode avec le Declare et Byval String.


Il existe les fonctions StringToHGlobalAnsi etStringToHGlobalUni. Elles permettent respectivement de renvoyerun pointeur vers une chaîne ANSI et UNICODE en mémoire.Elle prennent en paramètre un objet de type String :

Function StringToHGlobalType(ByVal chaine As String) As IntPtr


Il est nécessaire de libérer la zone pointée(précédente) par le pointeur renvoyé afin de nepas faire de fuite mémoire :

Sub FreeHGlobal(ByVal pointeur_vers_chaine As IntPtr)


ObjPtr


En avez vous vraiment besoin....


Les« autres » méthodes de l’objet Marshal


Marshaling avancé

GetManagedThunkForUnmanagedMethodPtr, GetUnmanagedThunkForManagedMethodPtr, NumParamBytes

Fonction de bibliothèque COM

BindToMoniker, GetActiveObject

Utilitaires COM

ChangeWrapperHandleStrength, CreateWrapperOfType, GetComObjectData, GetComSlotForMethodInfo, GetEndComSlot, GetMethodInfoForComSlot, GetStartComSlot, ReleaseComObject, SetComObjectData

Transformation des données

Managées en non managées : Copy, GetComInterfaceForObject, GetIDispatchForObject, GetIUnknownForObject, StringToBSTR, StringToCoTaskMemAnsi, StringToCoTaskMemAuto, StringToCoTaskMemUni, StringToHGlobalAnsi, StringToHGlobalAuto, StringToHGlobalUni, StructureToPtr, UnsafeAddrOfPinnedArrayElement

Non managées en managées : Copy, GetObjectForIUnknown, GetObjectForNativeVariant, GetObjectsForNativeVariants, GetTypedObjectForIUnknown, GetTypeForITypeInfo, PtrToStringAnsi, PtrToStringAuto, PtrToStringBSTR, PtrToStringUni

Propriétés : SystemDefaultCharSize, SystemMaxDBCSCharSize

Lecture et écriture directes

ReadByte, ReadInt16, ReadInt32, ReadInt64, ReadIntPtr, WriteByte, WriteInt16, WriteInt32, WriteInt64, WriteIntPtr

Gestion des erreurs

COM : GetHRForException, ThrowExceptionForHR

Win32 : GetLastWin32Error, GetExceptionCode, GetExceptionPointers

Les deux : GetHRForLastWin32Error

Utilitaires d'hébergement

GetThreadFromFiberCookie

Iunknown

AddRef, QueryInterface, Release

Gestion de la mémoire

COM : AllocCoTaskMem, ReAllocCoTaskMem, FreeCoTaskMem, FreeBSTR

Win32 : AllocHGlobal, ReAllocHGlobal, FreeHGlobal

Les deux : DestroyStructure

Utilitaires d'appel de plate-forme

Prelink, PrelinkAll, GetHINSTANCE

Examen de la structure

OffsetOf, SizeOf

Informations de type

GenerateGuidForType, GenerateProgIdForType, GetTypeInfoName, GetTypeLibGuid, GetTypeLibGuidForAssembly, GetTypeLibLcid, GetTypeLibName, IsComObject, IsTypeVisibleFromCom


 Historique

26 février 2006 18:05:41 :
Correction des informations concernant VarPtr

Commentaires

Commentaire de gerbito le 15/06/2006 19:24:43

Bonjour,

  Votre code m'intéresse particulièrement car je dois utiliser en VB.Net une DLL écrite en C (et visiblement concue pour être utilisée en priorité dans des applis codées dans ce langage).

  Le problème c'est qu'une de ces fonctions exige en paramètre une structure comportant parmi ses éléments un tableau d'octets devant ête remplie par cette DLL qui écoute une connexion Socket. Or le passage en paramètre des tableaux d'octets se passe très mal. J'ai essayé toutes les solutions que vous proposez, Marshal, passage par référence, transtypage, mais aucune ne marche.

  Pourriez vous s'il vous plaît me renseigner sur la meilleure marche à suivre ?

  Sinon je vais devoir réécrire en C une auter DLL pour utiliser cette DLL, mais dont les fonction (que j'écrirais) ne prendront en paramètres que des types facilements transposables comme des entiers non signés, et cette solution, si elle me para ît plus sûre, est toutefois la plus fastidieuse. Connaîtriez vous une meilleure solution ?

Merci de votre aide

Commentaire de GRAZNOK le 19/07/2006 12:28:41

Bonjour,

Quant à moi, je n'arrive pas à utiliser l'API StrFormatByteSize de shlwapi.dll, sous VS2005.
À chaque appel de la fonction, j'ai un "déséquilibrage de la pile". Je ne sais pas si c'est dû au typage des variables données en paramètre ou au typage de la valeur renvoyée.

Si qqun sait comment marshaler ou transtyper les données, je suis preneur.

Merci

Commentaire de ShareVB le 20/07/2006 10:26:00

salut,

gerbito : désolé de ne pas avoir répondu mais j'ai du manquer le message de notification...sinon, si ce n'est pas trop tard, il faudrait le prototype C...mais la solution de la dll wrapper ne simplifie pas forcément le problème...

graznok : à toutes fins utiles DWORD et UINT sont des Integer en VB.Net (pas des Longs)...ensuite, je donnerais le protype suivant à StrFormatByteSize :
Private Declare Ansi Function StrFormatByteSize Lib "shlwapi.dll" Alias "StrFormatByteSizeA" (ByVal ByteSize As Integer, ByVal szBuf As String, ByVal uiBufSize As Integer) As IntPtr
et si cela ne marche pas, préfixer Byval szBuf par <MarshalAs(UnamanagedType.LPStr)>
ensuite, la chaine szBuff doit être allouée (szBuff = Space(256)) avant le passage à l'api...

ShareVB

Commentaire de supergoozy2 le 04/08/2006 11:23:06

salut,
je sais que ce n'est pas en raport directement avec ce tutorial mais j'ai le meme probleme que GRAZNOK sur une autre API qui me dit:
'GetPixel!GetPixel.frmGetPixel::SetCursorPos' a déséquilibré la pile.

voici la petite API

Private Declare Function SetCursorPos Lib "user32" ( _
                         ByVal x As Long, ByVal y As Long) As Long

' Vous placez sur votre feuille deux textbox nommés
' "txtPosCurHor", "txtPosCurVer" et un bouton "Command1"

' Dans l'évènement Click du bouton, vous tapez le code suivant :
Private Sub Command1_Click()
Dim x As Long, y As Long
' ATTENTION : Entrez des valeurs valides (numeriques)
x = CLng(txtPosCurHor.Text)
y = CLng(txtPosCurVer.Text)
' Cet appel de fonction placera le pointeur de la souris au
' coordonnées indiquées dans les zones de texte
Call SetCursorPos(x, y)
End Sub


Je suis sous VB 2005 Express.
merci d'avance de ton aide.

Commentaire de ShareVB le 04/08/2006 20:59:58

salut,

Attention : Long = 64bits en VB.net pas 32bits comme en VB6...donc déséquilibre de la pile...Les Long de VB6 sont des Integer en .Net...Et les Integer de VB6 des Short...

ShareVB

Commentaire de ShareVB le 11/08/2006 22:30:42

salut à tous,

retrouvez ce tuto sur mon site perso à www.sharevb.net...rubrique Programmation\VB\

ShareVB

Commentaire de cookies2 le 29/08/2007 22:32:10

Bonjour,
C'est très intéressant. J'ai par contre une question en lien avec les Structures.

J'ai un Public Structure de défini du type:
Public Structure Route
Dim order() As Integer
Dim shipQty(,) As Integer
Dim duration As Single
Dim open As Boolean
Dim cost As Single
End Structure

et j'ai les variables suivantes:
Dim MyRoad1(,) as Route
Dim MyRoad2(,) as Route

J'ai besoin de copier les données de MyRoad1 dans MyRoad2. J'ai essayé un Array.Copy mais ce dernier ne fait que pointer les données de MyRoad1 vers MyRoad2 alors que MyRoad1 et MyRoad2 deviennent 2 ensembles de données distincts.
La seule façon que j'ai trouvé de copier les données de MyRoad1 vers MyRoad2, c'est de copier les données une à une. Mon problème est que je dois copier ces données des milliers de fois. Est-ce que quelqu'un a une solution plus efficace?

Commentaire de ShareVB le 29/08/2007 23:00:11

salut,

en fait, ton prb vient des tableaux qui sont des types références est qui ne sont donc pas clonés...le seul moyen reste donc de faire la copie un par un et pour les tableaux dans la structure avec array.clone...

sinon, une manière plus .net serait d'implémenter l'interface ICloneable dans la structure et d'appeler la méthode Clone de la structure pour chaque case de MyRoad1...dans la méthode Clone de la structure tu mets ton code de copie : tu construit une nouvelle "instance" de ta structure en lui passant les mêmes données...

ShareVB

Commentaire de cookies2 le 30/08/2007 16:45:35

Allo,
Il y a un tutoriel sur les ICloneable?

Merci
cookies

Commentaire de ShareVB le 30/08/2007 19:11:36

salut,

euh, je ne sais pas s'il y a un tutoriel mais le principe est le suivant :
-> tu implémentes l'interface ICloneable dans ta structure (Implements ICloneable)
-> ca te crée une méthode Clone() As Object
-> dedans tu mets un truc du genre :
Dim ret As New Route
ret.order = me.order.clone
ret.duration = me.duration
...

return ret

ensuite pour l'utiser pour copier MyRoad1 dans MyRoad2, dans ta boucle de copie tu fais MyRoad2(i,j) = MyRoad1(i,j).Clone()

ShareVB

Commentaire de cookies2 le 17/09/2007 21:26:19

Allo,
Ça ne fonctionne pas. Au lieu d'utiliser une structure, y aurait-il une autre façon de stocker mes données qui ferait en sorte que mon problème pourrait être réglé? J'aimerais arriver à faire mes copies les plus rapidement et simplement possibles, ceci tout en ayant aisément accès à mes données. Des suggestions?!?
Merci
cookies

Commentaire de ShareVB le 17/09/2007 22:46:57

salut,

normalement, ca devrait fonctionner, j'avais testé...mais bon, le meilleur moyen en programmation c'est encore celui qui marche simplement : copier toutes tes structures d'un tableau à un autre, membre par membre et de faire pareil pour les tableaux contenus dans la structure...

de toute façon, en mémoire, tout est éparpillé...donc, il n'y a pas trop d'autres moyens...

voici le test que j'avais fait :

Public Class Form1
    Private Structure test
        Implements ICloneable

        Public a As Integer
        Public b As Integer

        Public Sub New(ByVal a As Integer, ByVal b As Integer)
            Me.a = a
            Me.b = b
        End Sub

        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return New test(Me.a, Me.b)
        End Function
    End Structure

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim a() As Integer = New Integer() {3, 3, 3, 4}
        Dim b() As Integer = a.Clone

        Dim c(1) As test
        c(0) = New test
        c(0).a = 1
        c(0).b = 2
        Dim d() As test = c.Clone
        d(0).b = 3

        b(1) = 5
    End Sub
End Class

ShareVB

Commentaire de cookies2 le 17/09/2007 23:22:29

Allo,
Copier élément par élément, je l'ai déjà fait. Mon problème c'est que c'est trop carnivore sur le temps. Je dois copier environ 300M de fois et c'est pour ça que je cherchais une façon de pouvoir réutiliser Array.Copy pcq c'est bcp plus rapide qu'une copie manuelle. D'autres suggestions?
Merci pour ton aide.
cookies

Commentaire de renocmoa le 01/12/2007 21:18:58

pour StrFormatByteSize aller sur

http://www.vbfrance.com/codes/OPTENIR-DANS-STRING-TAILLE-FICHIER-KO-MO-GO_44889.aspx

Commentaire de gillardg le 12/10/2008 02:26:39

pour les api en vb.net utiliser P / Invoke interrop Assistant
http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales