DLL C "maison" qui marche pas.

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 25 sept. 2007 à 17:40
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 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)!!!


Merci


Amicalement



Pensez "Réponse acceptée"

29 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 sept. 2007 à 15:35
Donne plutot le but de SetVat() en français, je verrai le code à mettre.

ciao...
BruNews, MVP VC++
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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)

Amicalement
Pensez "Réponse acceptée"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 sept. 2007 à 15:53
donc l'équivalent d'un CopyMemory, ok ?
Je te rappelle que GetAdresse est invalide pour String, voir ce que j'ai fourni.

ciao...
BruNews, MVP VC++
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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%" />
void __stdcall bnCopyMem(BYTE *Destination, DWORD NbOct,
BYTE *Source)

{

  if(NbOct) {

    do {

      *Destination++ = *Source++;

    } while(--NbOct);

  }

}

<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.


Communauté CodeS-SourceS MERCI!Amicalement
Pensez "Réponse acceptée"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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é) !!!

Amicalement
Pensez "Réponse acceptée"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 sept. 2007 à 11:42
Tu restes malgré ça en interprété ?
goto cppfrance illico !!!

ciao...
BruNews, MVP VC++
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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#.






Amicalement



Pensez "Réponse acceptée"
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 sept. 2007 à 12:02
C# est de l'interprété.

ciao...
BruNews, MVP VC++
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
27 sept. 2007 à 12:09
Exact (puisque ce language est equivalement au VB.NET, j'ai tapé trop vite), merci de m'avoir corrigé .

Amicalement
Pensez "Réponse acceptée"
0
Rejoignez-nous