Pb. de communication avec DLL externe

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Pb. de communication avec DLL externe

Message par delta69 »

Bonjour,

J'aimerais "discuter" avec la DLL d'une appli externe, mais pour le moment c'est plutôt un monologue... Elle n'est pas très causante !

Voici ce que dit la doc pour la fonction souhaitée :

INT WINAPI LIB_VER
Function: Get DLL Version
Prototype: int WINAPI lib_ver (unsigned int *pVer)
Parameter: pVer: [OUT] DLL version
Return: return 0 if successful

Voilà mon bout de code foireux :

Code : Tout sélectionner

  If OpenLibrary(0, "Master.dll")
    res = CallFunction(0, "LIB_VER", pVer)
    MessageRequester("Info","Version : "+Str(pVer))
  EndIf
Si j'ai bien compris, ma variable res renvoie 0, ce qui veut dire qu'il n'y a pas d'erreur. Hum. Moi ce qui m'intéresse, c'est la version de ma DLL. Comment puis-je la récupérer ? La variable pVer renvoie 0 en l'état, ce qui n'est pas juste...

Merci pour votre aide, et bon week end !

Bien cordialement,
Nico.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Peut être que la fonction attend l'adresse de ta variable pVer

essaye ceci

Code : Tout sélectionner

If OpenLibrary(0, "Master.dll")
    res = CallFunction(0, "LIB_VER", @pVer.l)
    MessageRequester("Info","Version : "+Str(pVer))
  EndIf
@pVer.l est l'adresse de la variable pVer passé en paramètre

res doit valoir 0 et pVer aura la valeur de la version de la dll

A+
Denis
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message par delta69 »

Bonsoir Denis,

Merci pour ta réponse rapide.

Malheureusement, la variable résultat (pVer) est toujours nulle... Windows (clic droit -> propriétés) me dit que la version de cette DLL est la 1.0.0.1. J'ai du mal à croire que zéro soit la bonne réponse !

Encore merci pour ton aide,

Nicolas
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

essais:

Code : Tout sélectionner

res = CallCFunction(0, "LIB_VER", @pVer.l) 
Force et sagesse...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

il semble que pVer soit un nombre entier non signé, alors il est impossible qu'il retourne une valeur comme 1.0.0.1 qui ne peut être qu'une chaîne de caractères voire un tableau de caractères.

Ce n'est sûrement pas un résultat comme 1.0.0.1 que tu dois retrouver, ou alors essayes de passer une chaîne.
As-tu regardé aussi du côté de

Code : Tout sélectionner

CallCFunction
A+
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Et ce code porrait t'il faire l'affaire:

Code : Tout sélectionner

Procedure.s GetFileVersionInfo(File.s)
   ; procedure de Xombie ici http://www.purebasic.fr/english/viewtopic.php?t=18853
   ; modifiée pour mon besoin (Denis)
   
   Protected iLibrary.l, iFunctionInfo.l, iFunctionSize.l, iFunctionQry.l
   Protected HoldString.s, HoldReturn.s, *HoldVersion, HoldResult.l
   Protected HoldBuffer.l, HoldEmpty.l, *HoldInfo.VS_FIXEDFILEINFO
   
   iLibrary = OpenLibrary(#PB_Any, "version.dll")
   
   If iLibrary
     
      CompilerIf #PB_Compiler_Unicode
         iFunctionInfo = GetFunction(iLibrary, "GetFileVersionInfoW")
         iFunctionSize = GetFunction(iLibrary, "GetFileVersionInfoSizeW")
         iFunctionQry = GetFunction(iLibrary, "VerQueryValueW")
      CompilerElse
         iFunctionInfo = GetFunction(iLibrary, "GetFileVersionInfoA")
         iFunctionSize = GetFunction(iLibrary, "GetFileVersionInfoSizeA")
         iFunctionQry = GetFunction(iLibrary, "VerQueryValueA")
      CompilerEndIf
     
      If iFunctionInfo And iFunctionSize And iFunctionQry
         
         HoldBuffer = CallFunctionFast(iFunctionSize, @File, @HoldEmpty)
         If HoldBuffer
            HoldReturn = Space(HoldBuffer)
            HoldResult = CallFunctionFast(iFunctionInfo, File, 0, HoldBuffer, @HoldReturn)
            If HoldResult
               HoldResult = CallFunctionFast(iFunctionQry, @HoldReturn, "\", @HoldEmpty, @HoldBuffer)
               If HoldResult
                  *HoldInfo = AllocateMemory(SizeOf(VS_FIXEDFILEINFO))
                 
                  CopyMemory(HoldEmpty, *HoldInfo, SizeOf(VS_FIXEDFILEINFO))
                 
                  HoldString = Str(*HoldInfo\dwFileVersionMS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionMS & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS >> 16 & $FFFF) + "." + Str(*HoldInfo\dwFileVersionLS & $FFFF)
                 
                  CloseLibrary(iLibrary)
                 
                  FreeMemory(*HoldInfo)
                 
                  If HoldResult
                     Debug HoldString
                     ProcedureReturn HoldString
                  Else
                     ProcedureReturn ""
                  EndIf
               EndIf
            EndIf
         EndIf
      EndIf
      CloseLibrary(iLibrary)
   EndIf
   ProcedureReturn ""
EndProcedure 
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message par delta69 »

Re-Bonsoir,

Effectivement, le résultat attendu est un entier (dixit la doc), donc je ne m'attendais pas à avoir un truc du genre 1.0.0.1 en réponse, mais j'espérais quand même avoir autre chose que zéro !

Par ailleurs, même résultat avec CallCFunction... Snif' !

Encore merci à vous...

Nico.
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message par delta69 »

Merci Nico pour ton aide.

En fait, la fonction version est une des fonctions parmi d'autres intégrées dans la DLL, toutes construites sur le même genre.

L'idée était que si j'arrivais à surmonter les problèmes pour la version, ce serait bien engagé pour la suite des événements.

Mais ton idée était néanmoins excellente !

Bon week end,
Nicolas
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message par tmyke »

N'as tu pas un petit lien pour récuperer ta DLL, si j'ai 5 mn je verais si je peux
tester cela...
Force et sagesse...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Les fonctions des dll sont sensibles à la casse, LIB_VER est différent de lib_ver

tu devrais examiner la lib avec les fonctions PB et lister en débug l'ensemble des commandes pour être sur de les écrire sans erreur.
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message par delta69 »

Bonsoir,

C'est vraiment très sympa de m'aider... Voici le lien pour récupérer la fameuse DLL :

ftp://ftp.deltaonline.net

Un accès "anonymous" doit faire l'affaire !

Bien cordialement,
Nicolas
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voila, c'est la version 5

c'est lib_ver en minuscule

adapte le code, la dll est sur mon disque K

Code : Tout sélectionner

If OpenLibrary(0, "K:\Dllmaster\Master.dll")
    res = CallFunction(0, "lib_ver", @pVer.l)
    MessageRequester("Info","Version : "+Str(pVer))
EndIf
il y a 149 fonctions que voici

Code : Tout sélectionner

149 fonctions

AT1608_Auth
AT1608_Authenticate
AT1608_CloseCard
AT1608_OpenCard
AT1608_Read
AT1608_ReadAAC
AT1608_ReadAR
AT1608_ReadATR
AT1608_ReadCMC
AT1608_ReadChar
AT1608_ReadCi
AT1608_ReadFC
AT1608_ReadFuse
AT1608_ReadFuse1
AT1608_ReadGc
AT1608_ReadLHC
AT1608_ReadMTZ
AT1608_ReadNc
AT1608_ReadPAC
AT1608_ReadPWD
AT1608_ReadValue
AT1608_Rst
AT1608_VerifyPWD
AT1608_VerifyPassword
AT1608_Write
AT1608_WriteAAC
AT1608_WriteAR
AT1608_WriteCMC
AT1608_WriteChar
AT1608_WriteCi
AT1608_WriteFuse
AT1608_WriteFuse1
AT1608_WriteGc
AT1608_WriteMTZ
AT1608_WriteNc
AT1608_WritePAC
AT1608_WritePWD
AT1608_WriteValue
AT24C_CloseCard
AT24C_OpenCard
AT24C_ReadChar
AT24C_ReadValue
AT24C_WriteChar
AT24C_WriteValue
AT24_read
AT24_write
AutoTestCard
CloseCard
DisPlayString
DisPlayTime
ISO15693_Get_Block_Security
ISO15693_Get_System_Information
ISO15693_Inventory
ISO15693_Inventorys
ISO15693_Lock_AFI
ISO15693_Lock_Block
ISO15693_Lock_DSFID
ISO15693_Read
ISO15693_Reset_To_Ready
ISO15693_Select
ISO15693_Stay_Quiet
ISO15693_Write
ISO15693_Write_AFI
ISO15693_Write_DSFID
MCS_ExitComm
MCS_GetStringMode
MCS_InitComm
MCS_LED
MCS_SetStringMode
MCS_TestDevice
MCS_TestDoor
OpenCard
ReadTime
SCHelp_BytesToHexString
SCHelp_HexStringToBytes
Srf55vp_Read
Srf55vp_Write
Srf55vp_WriteByte
Srf55vp_Write_Reread
WriteTime
des_decrypt
des_encrypt
lib_ver
rf_ClosePort
rf_DESFire_rst
rf_GetErrorMessage
rf_M1_authentication1
rf_M1_authentication2
rf_M1_decrement
rf_M1_increment
rf_M1_initval
rf_M1_read
rf_M1_readval
rf_M1_restore
rf_M1_transfer
rf_M1_write
rf_Shc1102_Auth
rf_Shc1102_Read
rf_Shc1102_Write
rf_antenna_sta
rf_anticoll
rf_at020_check
rf_at020_count
rf_at020_deselect
rf_at020_lock
rf_at020_read
rf_at020_write
rf_atqb
rf_attrib
rf_beep
rf_cl_deselect
rf_cos_command
rf_download_key
rf_free
rf_get_device_number
rf_get_model
rf_get_snr
rf_halt
rf_hltb
rf_init_com
rf_init_device_number
rf_init_sam
rf_init_type
rf_light
rf_receive
rf_request
rf_sam_cos
rf_sam_rst
rf_select
rf_sr176_protectblock
rf_sr176_readblock
rf_sr176_writeblock
rf_srix4k_authenticate
rf_srix4k_getuid
rf_srix4k_readblock
rf_srix4k_writeblock
rf_srix4k_writelockreg
rf_st_completion
rf_st_select
rf_thr1064_check
rf_thr1064_read
rf_thr1064_write
rf_transceive
rf_typea_rst
rf_typeb_cos
rf_ul_select
rf_ul_write
smartcard_cos
smartcard_rst
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message par delta69 »

Oh purée ! Et bien je n'aurais qu'un mot : Bravo !

Non, en fait, j'en ai bien un second : Merci...

Bon, pour les 148 fonctions restantes... Je vais essayer d'être plus autonome !

Bon week end !
Nicolas

PS : Un bon d'achat chez Rue du Commerce, ça t'intéresse ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

delta69 a écrit :PS : Un bon d'achat chez Rue du Commerce, ça t'intéresse ?
Faut voir :D
Répondre