Je bloque depuis quelques jours sur l'appel de fonctions d'une DLL fournit par un constructeur.
J'ai bien sur contacté ce constructeur qui m’envoie alors une doc très succincte sur les propriétés des fonctions à utiliser et 2 exemples de code VB 2008 pour utiliser ces fonctions.
En regardant le code je m'aperçois qu'en fait il faut que j'écrive le module d'appel des fonctions de la DLL pour tester leurs exemples. Malheureusement, je ne sais vraiment pas
comment faire et même en cherchant mes essais ne fonctionne pas.
Je me permet donc de vous soumettre ce que j'ai écris afin que quelqu'un puisse me guider vers la bonne solution.
le code de l'exemple :
Public Sub Enumerate()
Dim ts As TemperatureServerLib.TempMeterServer = New TemperatureServerLib.TempMeterServer ' get instance of the temperatureserver
Dim devs As TemperatureServerLib.DeviceInfoCollection
Dim devinfo As TemperatureServerLib.DeviceInfo
Dim i As Integer
devs = ts.GetDevices ' get the collection of devices
For i = 1 To devs.Count ' loop thru the collection
devinfo = devs(i) ' get next device info
Debug.Print(devinfo.Name) ' use the information
Next
End Sub
Comme c'est du VB 2008 je le transforme de manière à ce qu'il soit compatible avec VB6 de la manière suivante :
Public Sub Enumerate()
Dim ts As TemperatureServerLib.TempMeterServer
Dim devs As TemperatureServerLib.DeviceInfoCollection
Dim devinfo As TemperatureServerLib.DeviceInfo
Dim i As Integer
Set ts = New TemperatureServerLib.TempMeterServer
devs = ts.GetDevices ' get the collection of devices
For i = 1 To devs.Count ' loop thru the collection
devinfo = devs(i) ' get next device info
Debug.Print (devinfo.Name) ' use the information
Next
End Sub
Je créé alors un module avec l'appel de la première fonction TemperatureServerLib.TempMeterServer :
Declare Function TemperatureServerLib Lib "TemperatureServerPS.dll" Alias "TempMeterServer" (ByVal version As String) As String
Sachant que dans la doc il est écrit :
TemperatureServer
Properties:
Type Property Description
BSTR Version Retrieve the version string of server
Methods:
Method Description
SaveDeviceList Saves current device info
GetDeviceInfoByID Retrieves DeviceInfo of specified id
GetDevices Enumerate devices: Get a collection of deviceinfo
Events:
Event Description
OnMeasurement Fires when a new measurement arrives
OnError Fires when an error occurs
Description:
The TemperatureServer is a singleton type class that is the principal interface between the USB base station and user software. It communicates with the USB station and fires events when new measurements arrive. The measurements are also stored to disk for logging purposes. These loggings can be queried by the GetLog method of DeviceInfo. The TemperatureServer also maintains a list of DeviceInfo objects. These objects keep information about the logging devices. The TemperatureServer is created by the temperatureserver system service.
The CLSID of the TemperatureServer is {A47249E1-1C32-4468-9A17-5E480D63116B}.
Ce qui me semble bien maigre ou alors plutôt pas clair.
Maintenant quand je test, j'ai le message suivant : "Type défini par l'utilisateur non défini" sur TemperatureServerLib.TempMeterServer
J'imagine que je ne déclare pas bien mon appel et que certain verront du premier coup d’œil ce qui ne va pas.
Par avance je vous remercie pour l'aide que vous pourrez m'apporter.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 24 mars 2013 à 17:56
Bonjour,
tout est pourtant dans le texte que tu as montré toi-même !
TempMeterServer est l'une des classes d'un exécutable. Cette classe a ses propriétés, ses méthodes et ses évènements (tous exposés).
Une petite recherche t'apprendra par ailleurs que ce même exécutable contient une autre classe, nommée, elle DeviceInfo.
J'ignore quelle est la nature exacte de l'exécutable TemperatureServerLib.
Ce qui me parait à peu près certain, c'est que
- il doit être présent sur ta machine
- si .dll, il doit en outre y être enregistré (par regsvr32)
- il accepte l'automation et doit donc être :
--- soit référencé
--- soit utilisé en liaison tardive (Late Binding), genre :
dim toto as object
set toto = CreateObject("??????.TempMeterServer")
ou ?????? est à remplacer par ne nom de ton exécutable (probablement : TemperatureServer ou quelque-chose de rapprochant, mais que nous ne pouvons deviner).
Désolé, mais pour plus d'avis et informations sur cet exécutable qui n'est pas de Microsoft, il te faudra nécessairement interroger son créateur. Bien évidemment.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
j'ai essayé de mettre la dll dans mon projet VB6 en référence mais elle n'est pas acceptée.
Je crois savoir que la dll aurait été faite en C. C'est un peu comme s'il fallait appeler une classe ou un objet dans cette Dll, mais c'est vraiment pas clair (pour moi). C'est pour cela que je me permet de poster ici, voir si certains comprendraient ce que je ne vois même pas, surtout que je n'ai pas de connaissances particulières sur les dll. Je pense que je ne comprends pas le "TemperatureServerLib.TempMeterServer", ce n'est pas une fonction et donc je ne sais pas comment faire la déclaration.
Voilà tu as vu ce que je parvenais pas à voir.
effectivement il y a bien un exécutable qui s’appelle TemperatureServer.exe que j'ai donc référencé dans mon projet. (La dll elle je l'avais déjà enregistrée via regsvr32)
j'ai ensuite modifié le code comme suit :
Public Function test()
Dim ts As Object
Dim devs As TemperatureServerLib.DeviceInfoCollection
Dim devinfo As TemperatureServerLib.DeviceInfo
Dim i As Integer
Set ts = CreateObject("TemperatureServer.TempMeterServer")
Set devinfo = New TemperatureServerLib.DeviceInfo
Set devs = ts.GetDevices ' get the collection of devices
For i = 1 To devs.Count ' loop thru the collection
Set devinfo = devs(i) ' get next device info
Debug.Print (devinfo.Name) ' use the information
Next
End Function
Et j'obtiens bien ma liste de sondes connectées.
Je ne connaissais pas ce type de construction pour allez chercher des classes depuis un .exe et sans ton aide je ne pense pas que j'y serai parvenu.
Un grand merci à toi donc, j'espère pouvoir me débrouiller pour le reste.