Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
25 sept. 2007 à 17:40
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
27 sept. 2007 à 12:09
Bonjour
Historique (sans réel intérêt mais si ça vous intéresse voila) :
Je fais actuellement une classe (enfin 2, 1 VB6 et 1 VB.NET) qui dois me permettre
d'intégrer dans un application VB6 des forms VB.NET (Hé dit comme ça elle à la
classe ma classe, lol). Pour cela j'ai mit en place une classe intégrant des
WinSock (trouvé dans le fichier "mswsock.dll" dans "Windows\System32").
Mon appli VB6 démarre par shell l'appli VB.NET en lui indiquant en paramètre le
port à utilisé pour le WinSock. Grasse à ce dernier le handle de la form VB.NET
est retourné à VB6 qui intègre dans un shape la forme VB.NET correspondante (avec
les API). Sauf que, plusieurs mégas octets vont passé de VB6 à VB.NET et
inversement. Mes tests semble monté que le WinSock est un peut lent pour ce
genre de transfert. Je veut donc transmettre une adresse mémoire (par winsock)
à lire (par VB6 ou VB.NET suivant le cas). Vue que VB6 ne connais pas les
pointeur je veut une DLL qui retourne un long contenant l'adresse de la
variable que je lui passe (jusque là tout semble relativement simple). Je précise
que je n'ais jamais fait de DLL (j'en utilise tout le temps mais je ne les faits
pas). Comme ça vous savez pour cois je veut faire un 'truc' aussi con.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
Objectif :
Je veut une DLL qui me retourne l’adresse mémoire d’une
variable que je lui passe, ce quel que soit sa taille ou son type.
Mon code :
VB
<hr align="center" size="2" width="100%" />
Private
Declare Function GetAdresse Lib "C:\Documents and
Settings\Vincent\Bureau\test.dll" (ByRef Variable As Any) As Long
Private Sub Form_Load()
Dim TESTE As String
TESTE = "Je fait des tests"
MsgBox TESTE & " " & GetAdresse(TESTE)
End Sub
<hr align="center" size="2" width="100%" />
C
(dans le .cpp)
<hr align="center" size="2" width="100%" />
#include
<windows.h>
long GetAdresse(void* Variable)
{
return (long)Variable;
}
<hr align="center" size="2" width="100%" />
C (dans le .def)
<hr align="center" size="2" width="100%" />
LIBRARY
test
EXPORTS
GetAdresse @1
<hr align="center" size="2" width="100%" />
Voila et dans VB à la ligne "MsgBox TESTE & " " &
GetAdresse(TESTE)" le compilo me retourne l'erreur : "Run-time error
'49': Bad DLL calling convention". Depuis midi je cherche à faire marche
cette $£¤µ* de DLL et ce que je trouve sois ne veut rien dire, sois je ne
comprend rien, sois ... bà je suis co_
Au faite à cois sers "@1" dans le .def?
Si non pourriez vous m'indiquer un tuto claire sur les DLL car je m'énerve
de plus en plus avec ce $£¤%µ de truc (qui me parais d’un niveau moins que
débutant)!!!
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 26 sept. 2007 à 15:47
Le but de SetVal est décrire dans une variable d'ont on passe l'adresse (ici nomé "VariableARemplir") la valeur se trouvant à l'adresse passé par long (ici nomé "AdrsALire") sur le nombre d'oct passé (ici nomé "LngEnOct").
Ce n'est pas très claire mais je ne sais pas comment le dire autrement.
La finalité :
VB6 passe à VB2005 un message contenant une action à effectué (exemple "trie_tableau_de_long") suivie d'une adresse mêmoire et d'une taille en oct. Ainsi je n'envoie que très peut de données par WinSock (qui semble, d'apré mes testes, un peut lent).
Bien sur je ne fait pas ça pour trié des tableaux (en faite si, je fait tout ça juste pour faire des testes d'egalité dans VB2005 et les utiliser dans VB6, lol)
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 26 sept. 2007 à 16:53
MERCI !!!!!!
En + ça m'aide à comprendre pour cois mon code ne fonctionnais pas (il me
semble que cela viens de mes déclaration, pourtant je les avez modifier mais en
LPVOID par exemple et non en BYTE *).
J'ai fait une petite modif par rapport à ce que tu m'a transmit (je joint à ce
post).
Mille fois merci de tout ce temps que tu à pue m'accordé (il me semble que ça
se conte en heure, je trouve ça énorme, plus que ça même).
Après modif :
Juste pour la lisibilité du code j'ai renommé les variables.
<hr align="center" size="2" width="100%" />
J'ai modifier le déclaration car j'ai l'adresse de la source et j'écrit dans la variable.
Private Declare Sub bnCopyMem Lib "C:\Documents and
Settings\Vincent\Bureau\test.dll" (Destination As Long, ByVal nbytes As
Long, ByVal Source As Long)
Sans toi je pense que demain 17H j'y été encor.
Si un jours je peut te dépanner (même si vue ton niveau, et le mien, ce n'est pas
évidant que je pusse quelque chose pour toi) surtout n'hésite pas.
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 27 sept. 2007 à 11:32
Bon, dernier post à ce sujet (promis après j'arrête),
la vitesse de ce truc m'impressionne énormément et je voulais vous en faire
profiter.
Mon code (VB) :
<hr size="2" width="100%" />Private Declare Function GetAdresse Lib "C:\Documents and Settings\Vincent\Bureau\test.dll" (ByRef Variable As Any) As Long
Private Declare Sub SetVar Lib "C:\Documents and Settings\Vincent\Bureau\test.dll" (ByVal Source As Long, ByVal nbytes As Long, ByRef Destination As Any)
Private Type StructTest
Moi(0 To 4999) As Long
End Type
Private bidule As StructTest
Private Sub Form_Load()
Dim biduledes As StructTest
Dim Compteur As Long
Dim DateDeb As Date
Dim Durée52420Exec As Long
For Compteur = 0 To UBound(bidule.Moi)
bidule.Moi(Compteur) = Compteur
Next
DateDeb = Now()
For Compteur = 0 To 52420
SetVar GetAdresse(bidule), Len(bidule), biduledes
Next
Durée52420Exec = DateDiff("s", DateDeb, Now())
MsgBox "La fonction à copié " & Len(bidule) & " Oct en " & Durée52420Exec / 52420 & " s." & vbCrLf & "Sois " & Durée52420Exec & " seconde pour " & Round(CLng(Len(bidule)) * 52420 / (CLng(1024) * CLng(1024)), 4) & "Mo."
'Label4.Caption = bidule
End Sub
<hr size="2" width="100%" />Le code C n'a pas changé.
Le résultat sur mon PC :
<hr size="2" width="100%" />La fonction à copié 20000 Oct en 1,33536818008394E-04 s.
Sois 7 seconde pour 999,8322Mo.
<hr size="2" width="100%" />
Soit présque 1Go en 7s!!!
Je n'ai jamais vu ça (et ça marche pour du vrai du coup j'ai
vérifié) !!!
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 27 sept. 2007 à 11:59
Je sais que j'ai dit que je n'écrirais plus rien
sur ce topic mais j'ai mentie.
Je n'ais hélasse pas le choix du langage.
Je savais que le C (ou C++) été plus rapide que le VB (de mémoire, j'avais lut
14 fois plus rapide pour rangé des tableaux).
J'ai tanné toute les sociétés que j'ai fréquentés pour faire les développements
en C/C++ mais on m'à quasiment toujours répondue "Non c'est trop
compliquer"... A bon??? Un langage de prog c'est un langage de prog. Oui
c'est vrais que les pointeur c'est pas simple
et que la syntaxe est un peut rigide,
mais une fois bien compris ça
permet de faire des 'truc' génial (j'ai souvenir d'une liste chaîné à 4 dimensions
qui fonctionnais du feux de dieux, impossible à faire en VB)
<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:11.25pt;
height:11.25pt'>
<v:imagedata src="file:///C:/DOCUME~1/Vincent/LOCALS~1/Temp/msoclip1/01/clip_image001.gif"
o:href="http://www.vbfrance.com/imgs2/smile_sad.gif"/>
</v:shape><![endif]--><!--[if !vml]-->
Tout ça pour dire : Ouinnnn , je ne peut pas tout passé en C/C++/C#.