Appel de fonctions dans une DLL

Résolu
elyan77 - 23 mars 2013 à 15:06
 elyan77 - 25 mars 2013 à 11:22
Bonjour à tous,

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.

4 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
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.
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
24 mars 2013 à 14:42
As-tu ajouté la référence dans ton projet ?
Si c'est du .NET pur, tu ne pourras pas l'interfacer,
il faut que le composant expose des objets COM...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Bonjour ghuysmans,

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.

Merci encore pour votre aide,
0
Bonjour ucfoutu,

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.
0
Rejoignez-nous