Adresse mémoire de variable en VB6.

mahojul Messages postés 27 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 6 mars 2009 - 19 févr. 2009 à 06:21
mahojul Messages postés 27 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 6 mars 2009 - 20 févr. 2009 à 09:27
Bonjour à tous,

Je développe un petit programme en VB6 basé sur un code en C++ qui va lire une valeur dans un périphérique connecté par USB.

Au niveau de la connexion avec le périphérique pas de soucis tout roule comme on dit ... Mais par contre je rencontre quelques soucis pour lire une valeur.

Ce que je dois faire pour lire une valeur c'est appeler la fonction "TP_PM249_GetCounter" qui se trouve dans une DLL (que je possède). Pour faire cela, en code C++ voici comment faire :

Définition :
TP_PM249_API bool __stdcall TP_PM249_GetCounter(long DeviceNo, long* Count, long* Status);

Code (positionné sur un TIMER du formulaire) :
long lCounter = 0;
long lStatus  = 0;

if (!TP_PM249_GetCounter(m_iAxe + 1, &lCounter, &lStatus))
{
   m_gCounter.m_iStat = DINIT;            
}

m_gCounter.m_dNum = RATIO * lCounter;

Et moi ce que je cherche à faire, c'est la même chose mais ... en VB6 ... et comme vous pouvez le voir dans le code C++ il faut faire appelle à des adresse mémoire de variable (&lCounter, &lStatus). Voici comment j'ai procédé :

1) Déclaration dans un module des fonctions suivantes :
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long

Public Declare Function TP_PM249_GetCounter Lib "TP_PM249.dll" (ByVal dwDevice As Long, ByRef Count As Long, ByRef Status As Long) As Boolean

2) Code (positionné sur un TIMER du formulaire) :
Dim ptr_LCounter As Long        ' pointer value
Dim ptr_LStatus As Long         ' pointer value
Dim lcounter As String
Dim lStatus As String
    
lcounter = 0
lStatus = 0
    
ptr_LCounter = lstrcpy(lcounter, lcounter)
ptr_LStatus = lstrcpy(lStatus, lStatus)

SI_STATUS = TP_PM249_GetCounter(DevNum - 1, ptr_LCounter, ptr_LStatus)

Lors de l'exécution du code en VB6, voici le contenu de :
ptr_LCounter   ---> 1895948
ptr_LStatus    ---> 2079476

(si j'exécute une seconde fois le code, les valeurs changent. Voici les valeurs que j'ai :
ptr_LCounter   ---> 2079476
ptr_LStatus    ---> 1595700)

Or, lorsque j'exécute le code en C++, voici le contenu de :
&lCounter  --->0x0012f150
&lStatus   ---> 0x0012f14C

(si j'exécute le code plusieurs fois, les valeurs ne changent pas).

Le but de tout ça c'est de pouvoir avoir en VB6 ce que je trouve en C++ c'est à dire les valeurs des adresses des variables ... afin que je puisse les passer en paramètre à la fonction : TP_PM249_GetCounter

Est-ce que vous pourriez m'aider un peu pour résoudre ce problème ? Je vous remercie d'avance pour le temps que vous allez consacrer à ce problème ...

25 réponses

mahojul Messages postés 27 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 6 mars 2009
19 févr. 2009 à 15:30
Oui, mais moi j'ai tout confondu ...

Pour moi si cela retournait 0 c'était que c'était VRAI ... donc ... en faite ... je ne comprenais pas pourquoi dans toutes les fonctions :
    Public Declare Function TP_PM249_Initialize Lib "TP_PM249.dll" (ByVal dwDevice As Long) As Boolean
    Public Declare Function TP_PM249_ResetRef Lib "TP_PM249.dll" (ByVal dwDevice As Long) As Boolean
    Public Declare Function TP_PM249_SetMultiplier Lib "TP_PM249.dll" (ByVal dwDevice As Long, ByVal Multiplier As Long) As Boolean
    Public Declare Function TP_PM249_SetMode Lib "TP_PM249.dll" (ByVal dwDevice As Long, ByVal RefMode As Long) As Boolean
    Public Declare Function TP_PM249_Version Lib "TP_PM249.dll" (ByVal dwDevice As Long, ByRef lpVersion As Long) As Boolean
    Public Declare Function TP_PM249_Close Lib "TP_PM249.dll" (ByVal dwDevice As Long) As Boolean

c'était OK

sauf dans celle là :

    Public Declare Function TP_PM249_GetCounter Lib "TP_PM249.dll" (ByVal dwDevice As Long, ByRef lcounter As Any, _

    ByRef lstatus As Any) As Boolean

... ...

Maintenant je me dis que c'est peut être finalement ma DLL qui est générée que pour être utilisée avec du C++ ... et pas du VB6 ... qu'en penses-tu ? ...

Merci vraiment pour ton aide .... .... tu es super ... ....
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 févr. 2009 à 15:43
non, la dll n'a pas de visibilité sur qui l'appelle...

VB joue en StdCall, et ta dll aussi. Ca n'est donc pas le coeur de ton probleme...

je sèche, je sèche...
0
mahojul Messages postés 27 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 6 mars 2009
20 févr. 2009 à 08:12
Bonjour ...

Moi aussi là je commence à vraiment être à court d'idée ... plus je regarde mon code plus je déprime ... ... j'ai beau l'exécuter, puis le re-exécuter puis encore et encore et encore ... mais pas de changement ...

C'est vraiment à ne rien y comprendre ... ... ...

Juste une question ... si cela fonctionne en C++ ... est-ce que nous pouvons intégrer du language C++ dans un code en VB6 ??? ... Je me rappel que (à l'époque) on pouvait faire ça avec des langages de programmations pour les sites internet ...

Autrement j'aurais éventuellement une autre idée ...

Etant donné que j'ai une version compilée de mon projet en C++ (fichier EXE qui fonctionne) ben je me disais que j'aurais peut être pu, à l'aide de cette petite application, récupérer des valeurs pour les intégrer dans mon projet VB6 ...

Serait-il envisageable d'exécuter mon programme compilé en C++ (et qui fonctionne) en tâche de fond de mon programme VB6 ? ... Si oui, je me disais que je pouvais peut être échangé les valeurs d'un programme à un autre ... ... c'est possible ça non ? ...

Si tu as quelques suggestions à me faire, je prends volontiers ... encore merci pour ton aide ...

A bientôt ...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 févr. 2009 à 08:25
faisable, mais dommage.

pour tester ton truc, me faudrait un péripherique USB précis, en plus, non ?
0

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

Posez votre question
mahojul Messages postés 27 Date d'inscription lundi 26 janvier 2009 Statut Membre Dernière intervention 6 mars 2009
20 févr. 2009 à 09:27
Oki alors ...



Reprenons les choses dans l'ordre :



1) Disponibilité à avoir un périphérique USB ...


Malheureusement je ne peux pas t'envoyer ce périphérique USB car c'est
un prototye pour un nouvel instrument que la société pour laquelle je
bosse va vendre ... donc pour le moment c'est un peu un projet "privé"
... ... Je suis désolé ... d'ailleurs cela m'aurait bien arrangé de
t'en donner un pour que tu puisses tester ... mais ma fois ... ... on
ne peut pas faire toujours ce que l'on veut ...



2) Questions sur les possibilités de travailler avec une application en tâche de fond :


Donc, il serait possible de faire qqch comme suit :


a) Après compilation de mon projet VB6


b) Sur ouverture de l'application VB6, ouvrir une autre application en tâche de fond (celle en C++ qui fonctionne)


c) Récupérer une valeur affichée dans l'application qui est en tâche de fond (application en C++)


d) L'afficher dans mon application VB6



Pour faire cela, sur quoi je dois m'appuyer ? ... est-ce que tu pourrais peut être juste m'aiguiller un peu sur les fonctions auxquelles je dois m'intéresser ... le but ce n'est pas que tu me fasses tout mais que j'apprenne par moi même ... ... ... mais un coup de pouce c'est sans refus ...

Merci encore ....
0
Rejoignez-nous