Problème utilisation fichier DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Problème utilisation fichier DLL

Message par Noos88 »

Bonjour à tous,
Je suis coincé avec un fichier une fonction importé d'un fichier DLL que je ne comprend pas comment l'inclure dans mon programme en PureBasic.

Je trouve 2 explications sur la fonction que je voudrais utilisé
1 - En Visual Basic
' allocate library handle 3
Declare Function cnc_allclibhndl3 Lib "FWLIB32.DLL" _
(ByVal ip As String, ByVal port As Short, ByVal timeout As Integer, ByRef FlibHndl As Integer) As Short

2 -En Visual C#
/* allocate library handle 3 */
[DllImport("FWLIB32.dll", EntryPoint="cnc_allclibhndl3")]
public static extern short cnc_allclibhndl3( [In,MarshalAs(UnmanagedType.AsAny)] Object ip,
ushort port,int timeout, out ushort FlibHndl);

Et voici mon essais de code:

Code : Tout sélectionner

Enumeration
  #Bibliotheque
EndEnumeration

Global Ip.s="192.168.105.8"
Global Port.w = 8193
Global handle.i

source.s = GetCurrentDirectory()
Fichierdll.s = source + "Fwlib32.dll"
If OpenLibrary(#Bibliotheque,Fichierdll)
  Ret.w=CallFunction(#Bibliotheque,"cnc_allclibhndl3",@Ip,@Port,2,*handle)
  Debug Ret
EndIf 

Je pense que j'utilise pas bien les arguments car je n'ais pas ce que je recherche en résultat.
Pourriez vous m'aiguiller dans les arguments, comment je doit les interprétés

documentation sur la procédure:
Declaration

#include "fwlib32.h" or "fwlib64.h"
FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr, unsigned short port, long timeout, unsigned short *FlibHndl);
Description

Allocates the library handle and connects to CNC that has the specified IP address or the Host Name.

Before executing this function, set the IP address and the port number of the FOCAS1/Ethernet (TCP) or FOCAS2/Ethernet (TCP) function on the CNC side correctly.

Arguments

ipaddr [ in ]


Specify character string of CNC's IP address or Host Name to connect.
(Ex. "192.168.0.1" or "CNC-1.FACTORY")

port [ in ]


Specify port number of the FOCAS1/Ethernet or FOCAS2/Ethernet (TCP) function.

timeout [ in ]

Specify seconds for timeout. If specify 0, timeout process is ignored and the library functions wait infinity.

The best timeout value is different according as system. For example, in case of the hi-speed network system, 10 seconds is sufficient for timeout. But in case of relaying by low-speed telephone line, more than 60 seconds is well for timeout. So you must specify the timeout value after the measurement of your communication time.

FlibHndl [ out ]


Specify pointer to variable including the library handle.
See "Library handle" for details.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème utilisation fichier DLL

Message par falsam »

Ca sent un souci Unicode.

Si tu compile avec PB 5.50 ou plus, remplace

Code : Tout sélectionner

Ret.w=CallFunction(#Bibliotheque, "cnc_allclibhndl3", @Ip, @Port, 2, *handle)
par

Code : Tout sélectionner

Ret.w=CallFunction(#Bibliotheque, "cnc_allclibhndl3", Ascii(Ip), Ascii(Port), 2, *handle)
la doc de ta DLL au cas ou dans laquelle on retrouve ta fonction cnc_allclibhndl3 https://www.inventcom.net/fanuc-focas-l ... /flist_all

Et aussi ici https://www.inventcom.net/fanuc-focas-l ... lclibhndl3
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Merci pour ta réponse, l'adresse IP peut-être mais le port ne doit pas être une chaine de caractère normalement,si je met directement le port tel que :

Code : Tout sélectionner

Ret.w=CallFunction(#Bibliotheque, "cnc_allclibhndl3", Ascii(Ip),8193 , 2, *handle)
il me met l'erreur suivante :
[19 :05 :10] [ERREUR] Accès mémoire invalide. (erreur d'écriture à l'adresse 0)

Pourquoi? :-( je ne comprend pas
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

J'ai trouver, je suis bête, ce n'est a cause du port le problème.

Merci falsam tu m'as beaucoup aider

Bonne soirée
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Bonjour à tous,
J'ai malheureusement encore un soucis avec cette DLL Focas
Mon problème est que je ne sais pas sortir les valeurs que j'attend dans ma structure.
Qu'ai je mal fais pour que ça ne fonctionne pas dans "cnc_sysinfo"??

lien : https://www.inventcom.net/fanuc-focas-l ... nc_sysinfo

merci de bien vouloir m'aider :?:

Code : Tout sélectionner

#Ok = 0

Procedure Erreur(Ret.w)
  
  If ret = -16
    MessageRequester("Erreur","Erreur de communication de socket"+Chr(10)+
                              "Vérifiez l'alimentation de la CNC, de la carte Ethernet I / F,"+Chr(10)+
                              "du câble de connexion Ethernet.",#PB_MessageRequester_Ok)
  ElseIf ret = -15
    MessageRequester("Erreur","	Il n'y a pas de fichier DLL pour chaque série CNC")
  ElseIf ret = -8
    MessageRequester("Erreur","L'attribution du numéro de la poignée est échouée")
  Else 
    
  EndIf
  If ret <> 0
    End
  EndIf 
EndProcedure

; typedef struct odbsys {
;         short   addinfo ;    /* Additional information */
;         short   max_axis ;   /* Max. controlled axes */
;         char    cnc_type[2] ;/* Kind of CNC (ASCII) */
;         char    mt_type[2] ; /* Kind of M/T/TT (ASCII) */
;         char    series[4] ;  /* Series number (ASCII) */
;         char    version[4] ; /* Version number (ASCII) */
;         char    axes[2] ;   /* Current controlled axes(ASCII)*/
; } ODBSYS ;

Structure ODBSYS Align #PB_Structure_AlignC
  addinfo.w    ;   /* Additional information */
  max_axis.w   ;   /* Max. controlled axes */
  cnc_type.s[2];   /* Kind of CNC (ASCII) */
  mt_type.s[2] ;   /* Kind of M/T/TT (ASCII) */
  series.s[4]  ;   /* Series number (ASCII) */
  version.s[4] ;   /* Version number (ASCII) */
  axes.s[2]    ;   /* Current controlled axes(ASCII)*/
EndStructure




Global Ip.s = "192.168.105.8"
Port.w = 8193
Define.i handle

Import "Fwlib32.lib"
  cnc_allclibhndl3.w(ipaddr.p-ascii,port.w,timeout.l,*FlibHndl) 
  cnc_rdprogdir3.w( FlibHndl.w, type.w, top_prog.w, num_prog.w, *PRGDIR)
  
  ;FWLIBAPI short WINAPI cnc_sysinfo(unsigned short FlibHndl, ODBSYS *sysinfo);
  cnc_sysinfo.w(handle, *sysinfo.ODBSYS)
  
  cnc_getlanguage.w(handle,*language)
  cnc_freelibhndl.w(handle)
EndImport

Ret.w = cnc_allclibhndl3("192.168.105.8",Port , 2, @handle)
If Ret = #Ok
  
  
  
  ret.w= cnc_sysinfo(handle,@*ODBSYS );
  If Ret = #Ok:Debug "commande sysinfo ok"
    ; Ca ne fonctionne pas !!!!!!!!!!!!
    Debug PeekW(addinfo.ODBSYS)
    Debug PeekW(max_axis.ODBSYS)
    Debug PeekS(cnc_type.ODBSYS,#PB_Ascii  )
    Debug PeekS(mt_type.ODBSYS,#PB_Ascii  )
    Debug PeekS(series.ODBSYS,#PB_Ascii  )
    Debug PeekS(version.ODBSYS,#PB_Ascii  )
    Debug PeekS(axe.ODBSYS,#PB_Ascii  ) 
  Else
    Debug "Erreur de communication"+Str(ret)
  EndIf 
  
  
  
  
  If cnc_getlanguage(handle,@language)=0;Language OK = 3
    Select language
      Case 0
        language$= "English"        
      Case 1	
        language$= "Japanease"
      Case 2	
        language$= "German"
      Case 3	
        language$= "French"
      Case 4	
        language$= "Chinese"
      Case 5	
        language$= "Italian"
      Case 6	
        language$= "Korean"
      Case 7	
        language$= "Spanish"
      Case 8	
        language$= "Dutch"
      Case 9	
        language$= "Danish"
      Case 10	
        language$= "Portuguese"
      Case 11	
        language$= "Polish"
      Case 12	
        language$= "Hungarian"
      Case 13	
        language$= "Swedish"
      Case 14	
        language$= "Czech Republic"
      Case 15	
        language$= "Simplified Chinese"
      Case 16	
        language$= "Russian"
    EndSelect 
    Debug "commande getlanguage ok language= "+language$
  Else
    Debug "Erreur de communication"+Str(ret)
  EndIf 
  
  ret.w=cnc_freelibhndl(handle)
  If Ret = #Ok
    Debug "Deconnection réussi"
  Else
    Debug "Erreur de deconnection"+Str(ret)
  EndIf 
  
Else
  Erreur(Ret.w)
EndIf 
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème utilisation fichier DLL

Message par falsam »

je ne peux pas tester ton code mais en lisant je pense que tu vas réviser le principe des structures.

remplace

Code : Tout sélectionner

Structure ODBSYS Align #PB_Structure_AlignC
  addinfo.w    ;   /* Additional information */
  max_axis.w   ;   /* Max. controlled axes */
  cnc_type.s[2];   /* Kind of CNC (ASCII) */
  mt_type.s[2] ;   /* Kind of M/T/TT (ASCII) */
  series.s[4]  ;   /* Series number (ASCII) */
  version.s[4] ;   /* Version number (ASCII) */
  axes.s[2]    ;   /* Current controlled axes(ASCII)*/
EndStructure
par

Code : Tout sélectionner

Structure sODBSYS Align #PB_Structure_AlignC
  addinfo.w    ;   /* Additional information */
  max_axis.w   ;   /* Max. controlled axes */
  cnc_type.s[2];   /* Kind of CNC (ASCII) */
  mt_type.s[2] ;   /* Kind of M/T/TT (ASCII) */
  series.s[4]  ;   /* Series number (ASCII) */
  version.s[4] ;   /* Version number (ASCII) */
  axes.s[2]    ;   /* Current controlled axes(ASCII)*/
EndStructure
Global ODBSYS.sODBSYS
puis

Code : Tout sélectionner

If Ret = #Ok:Debug "commande sysinfo ok"
    ; Ca ne fonctionne pas !!!!!!!!!!!!
    Debug PeekW(addinfo.ODBSYS)
    Debug PeekW(max_axis.ODBSYS)
    Debug PeekS(cnc_type.ODBSYS,#PB_Ascii  )
    Debug PeekS(mt_type.ODBSYS,#PB_Ascii  )
    Debug PeekS(series.ODBSYS,#PB_Ascii  )
    Debug PeekS(version.ODBSYS,#PB_Ascii  )
    Debug PeekS(axe.ODBSYS,#PB_Ascii  ) 
  Else
par

Code : Tout sélectionner

If Ret = #Ok:Debug "commande sysinfo ok"
  ; J'espere que ça fonctionne  !!!!!!!!!!!!
  With ODBSYS
    Debug PeekW(\addinfo )
    Debug PeekW(\max_axis)
    Debug PeekS(\cnc_type,#PB_Ascii  )
    Debug PeekS(\mt_type,#PB_Ascii  )
    Debug PeekS(\series,#PB_Ascii  )
    Debug PeekS(\version,#PB_Ascii  )
    Debug PeekS(\axes,#PB_Ascii  ) 
  Else
Ne connaissant pas ta DLL, il est possible que le flag #PB_Ascii ne soit pas le bon.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Problème utilisation fichier DLL

Message par djes »

J'ai quand même un doute sur les char convertis en string... Par exemple,

Code : Tout sélectionner

char    cnc_type[2] ;/* Kind of CNC (ASCII) */[2]
devrait plutôt se convertir en

Code : Tout sélectionner

cnc_type.a[2]
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Oui merci, j'ai vu mon erreur, je poste l'exemple du code une fois fini si ca peut aider quelqu'un
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Voici le code qui me donne les bon résultat :

Code : Tout sélectionner

#Ok = 0

Procedure Erreur(Ret.w)
  
  If ret = -16
    MessageRequester("Erreur","Erreur de communication de socket"+Chr(10)+
                              "Vérifiez l'alimentation de la CNC, de la carte Ethernet I / F,"+Chr(10)+
                              "du câble de connexion Ethernet.",#PB_MessageRequester_Ok)
  ElseIf ret = -15
    MessageRequester("Erreur","	Il n'y a pas de fichier DLL pour chaque série CNC")
  ElseIf ret = -8
    MessageRequester("Erreur","L'attribution du numéro de la poignée est échouée")
  Else 
    
  EndIf
  If ret <> 0
    End
  EndIf 
EndProcedure

; typedef struct odbsys {
;         short   addinfo ;    /* Additional information */
;         short   max_axis ;   /* Max. controlled axes */
;         char    cnc_type[2] ;/* Kind of CNC (ASCII) */
;         char    mt_type[2] ; /* Kind of M/T/TT (ASCII) */
;         char    series[4] ;  /* Series number (ASCII) */
;         char    version[4] ; /* Version number (ASCII) */
;         char    axes[2] ;   /* Current controlled axes(ASCII)*/
; } ODBSYS ;

Structure ODBSYS Align #PB_Structure_AlignC  
  addinfo.w    ;   /* Additional information */
  max_axis.w   ;   /* Max. controlled axes */
  cnc_type.a[2];   /* Kind of CNC (ASCII) */
  mt_type.a[2] ;   /* Kind of M/T/TT (ASCII) */
  series.a[4]  ;   /* Series number (ASCII) */
  version.a[4] ;   /* Version number (ASCII) */
  axes.a[2]   ;   /* Current controlled axes(ASCII)*/
EndStructure
Global sysinfo.ODBSYS

Global Ip.s = "192.168.105.8"
Port.w = 8193
Define.i handle
Define Result.s

Import "Fwlib32.lib"
  cnc_allclibhndl3.w(ipaddr.p-ascii,port.w,timeout.l,*FlibHndl) 
  cnc_rdprogdir3.w( FlibHndl.w, type.w, top_prog.w, num_prog.w, *PRGDIR)
  
  ;FWLIBAPI short WINAPI cnc_sysinfo(unsigned short FlibHndl, ODBSYS *sysinfo);
  cnc_sysinfo.w(handle, *ODBSYS)
  
  cnc_getlanguage.w(handle,*language)
  cnc_freelibhndl.w(handle)
EndImport

Ret.w = cnc_allclibhndl3("192.168.105.8",Port , 2, @handle)
If Ret = #Ok
  
  
  
  ret.w= cnc_sysinfo(handle,@sysinfo);
  If Ret = #Ok:Debug "commande sysinfo ok"
    ; Ca ne fonctionne pas !!!!!!!!!!!!
    With sysinfo
      Debug \addinfo
      Debug \max_axis
      
      Result = ""
      For x=0 To 1
        Result = Result+ Chr(\cnc_type[x])
      Next x
      Debug Result
      
      Result = ""
      For x=0 To 1
        Result = Result+ Chr(\mt_type[x])
      Next x
      Debug Result
      
      Result = ""
      For x=0 To 3
        Result = Result+ Chr(\series[x])
      Next x
      Debug Result
      
      Result = ""
      For x=0 To 3
        Result = Result+ Chr(\version[x])
      Next x
      Debug Result
      
      Result = ""
      For x=0 To 1
        Result = Result+ Chr(\axes[x])
      Next x
      Debug Result
      
    EndWith
    
  Else
    Debug "Erreur de communication"+Str(ret)
  EndIf 
  

  If cnc_getlanguage(handle,@language)=0;Language OK = 3
    Select language
      Case 0
        language$= "English"        
      Case 1	
        language$= "Japanease"
      Case 2	
        language$= "German"
      Case 3	
        language$= "French"
      Case 4	
        language$= "Chinese"
      Case 5	
        language$= "Italian"
      Case 6	
        language$= "Korean"
      Case 7	
        language$= "Spanish"
      Case 8	
        language$= "Dutch"
      Case 9	
        language$= "Danish"
      Case 10	
        language$= "Portuguese"
      Case 11	
        language$= "Polish"
      Case 12	
        language$= "Hungarian"
      Case 13	
        language$= "Swedish"
      Case 14	
        language$= "Czech Republic"
      Case 15	
        language$= "Simplified Chinese"
      Case 16	
        language$= "Russian"
    EndSelect 
    Debug "commande getlanguage ok language= "+language$
  Else
    Debug "Erreur de communication"+Str(ret)
  EndIf 
  
  ret.w=cnc_freelibhndl(handle)
  If Ret = #Ok
    Debug "Deconnection réussi"
  Else
    Debug "Erreur de deconnection"+Str(ret)
  EndIf 
  
Else
  Erreur(Ret.w)
EndIf 
Mais il n'y as plus simple pour récupéré les valeurs dans la structure?

Résultat du debug :
commande sysinfo ok
2
8
21
M
DDK1
11
4
commande getlanguage ok language= French
Deconnection réussi

C'est bien une commande numérique 21M et il y as 4 axes dessus
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

Re: Problème utilisation fichier DLL

Message par Mesa »

Très intérressant.
J'ai la dll mais peux-tu me dire où tu as trouvé la lib, stp ?




Est-ce que le code ci-dessous fonctionne ?

Code : Tout sélectionner

Enumeration
  #Bibliotheque
EndEnumeration

#Ok = 0 

Procedure Erreur(RET.w) 
  
  If RET = -16 
    MessageRequester("Erreur","Erreur de communication de socket"+Chr(10)+ 
                              "Vérifiez l'alimentation de la CNC, de la carte Ethernet I / F,"+Chr(10)+ 
                              "du câble de connexion Ethernet.",#PB_MessageRequester_Ok) 
  ElseIf RET = -15 
    MessageRequester("Erreur"," Il n'y a pas de fichier DLL pour chaque série CNC") 
  ElseIf RET = -8 
    MessageRequester("Erreur","L'attribution du numéro de la poignée est échouée") 
  Else  
    
  EndIf 
  If RET <> 0 
    End 
  EndIf  
EndProcedure 
Procedure Err(RET.w) 
  
  If RET = -16 
    Debug("Erreur de communication de socket"+Chr(10)+ 
          "Vérifiez l'alimentation de la CNC, de la carte Ethernet I / F,"+Chr(10)+ 
          "du câble de connexion Ethernet.") 
  ElseIf RET = -15 
    Debug(" Il n'y a pas de fichier DLL pour chaque série CNC") 
  ElseIf RET = -8 
    Debug("L'attribution du numéro de la poignée est échouée") 
  Else  
    
  EndIf 
  If RET <> 0 
    End 
  EndIf  
EndProcedure 	

;;Series 150i, 160/180/210, 160i/180i/210i, 0i, 300i/310i/320i, Power Mate i
; typedef struct odbsys { 
; short addinfo ; /* Additional information */ 
; short max_axis ; /* Max. controlled axes */ 
; char cnc_type[2] ;/* Kind of CNC (ASCII) */ 
; char mt_type[2] ; /* Kind of M/T/TT (ASCII) */ 
; char series[4] ; /* Series number (ASCII) */ 
; char version[4] ; /* Version number (ASCII) */ 
; char axes[2] ; /* Current controlled axes(ASCII)*/ 
; } ODBSYS ; 

Structure ODBSYS Align #PB_Structure_AlignC 
  addinfo.w    ; /* Additional information */ 
  max_axis.w   ; /* Max. controlled axes */ 
  cnc_type.s[2]; /* Kind of CNC (ASCII) */ 
  mt_type.s[2] ; /* Kind of M/T/TT (ASCII) */ 
  series.s[4]  ; /* Series number (ASCII) */ 
  version.s[4] ; /* Version number (ASCII) */ 
  axes.s[2]    ; /* Current controlled axes(ASCII)*/ 
EndStructure 

source.s = GetCurrentDirectory()
Fichierdll.s = source + "Fwlib32.dll"
If OpenLibrary(#Bibliotheque,Fichierdll) = 0
  MessageRequester("Attention", "Problème de DLL", #PB_MessageRequester_Error)
  End
EndIf

; 	Debug CountLibraryFunctions(#Bibliotheque)

; short = .w	
; unsigned short = .u	
; long = .l

; 	FWLIBAPI short WINAPI cnc_allclibhndl3(const char *ipaddr, unsigned short port, long timeout, unsigned short *FlibHndl);
PrototypeC.w Proto_cnc_allclibhndl3(ipaddr.p-ascii, port.u, timeout.l, *FlibHndl);
cnc_allclibhndl3.Proto_cnc_allclibhndl3	= GetFunction(#Bibliotheque, "cnc_allclibhndl3")
;Sans pseudotype
PrototypeC.w Proto_cnc_allclibhndl3b(*ipaddr, port.u, timeout.l, *FlibHndl);
cnc_allclibhndl3b.Proto_cnc_allclibhndl3b	= GetFunction(#Bibliotheque, "cnc_allclibhndl3")

; FWLIBAPI short WINAPI cnc_sysinfo(unsigned short FlibHndl, ODBSYS *sysinfo); 
PrototypeC.w Proto_cnc_sysinfo(FlibHndl.u,  *sysinfo.ODBSYS)
cnc_sysinfo.Proto_cnc_sysinfo = GetFunction(#Bibliotheque, "cnc_sysinfo")

;FWLIBAPI short WINAPI cnc_getlanguage(unsigned short FlibHndl, short *language); 
PrototypeC.w Proto_cnc_getlanguage(FlibHndl.u, *language)
cnc_getlanguage.Proto_cnc_getlanguage = GetFunction(#Bibliotheque, "cnc_getlanguage")

;FWLIBAPI short WINAPI cnc_freelibhndl(unsigned short FlibHndl)
PrototypeC.w Proto_cnc_freelibhndl(FlibHndl.u)
cnc_freelibhndl.Proto_cnc_freelibhndl = GetFunction(#Bibliotheque, "cnc_freelibhndl")


Global Ip.s="192.168.105.8"
Global Port.u = 8193
Global handle.u
Global timeout.l = 500
Global language.w

Global RET.w

RET=cnc_allclibhndl3("192.168.105.8", port, 2, @handle)
Err(RET)
;autre façon
; RET=cnc_allclibhndl3b(Ascii(Ip), port, 2, @handle)
; Err(RET)

*sysinfo.ODBSYS = AllocateStructure(ODBSYS)
RET= cnc_sysinfo(handle,*sysinfo );
                                  ; Debug RET
If RET = #Ok:Debug "commande sysinfo ok" 
  
  Debug PeekW(*sysinfo\addinfo) 
  Debug PeekW(*sysinfo\max_axis) 
  Debug PeekS(*sysinfo\cnc_type,#PB_Ascii  ) 
  Debug PeekS(*sysinfo\mt_type,#PB_Ascii  ) 
  Debug PeekS(*sysinfo\series,#PB_Ascii  ) 
  Debug PeekS(*sysinfo\version,#PB_Ascii  ) 
  Debug PeekS(*sysinfo\axe,#PB_Ascii  )  
Else 
  Debug "Erreur de communication"+Str(RET) 
EndIf  


If cnc_getlanguage(handle,@language)=0;Language OK = 3 
  Select language 
    Case 0 
      language$= "English"         
    Case 1    
      language$= "Japanease" 
    Case 2    
      language$= "German" 
    Case 3    
      language$= "French" 
    Case 4    
      language$= "Chinese" 
    Case 5    
      language$= "Italian" 
    Case 6    
      language$= "Korean" 
    Case 7    
      language$= "Spanish" 
    Case 8    
      language$= "Dutch" 
    Case 9    
      language$= "Danish" 
    Case 10    
      language$= "Portuguese" 
    Case 11    
      language$= "Polish" 
    Case 12    
      language$= "Hungarian" 
    Case 13    
      language$= "Swedish" 
    Case 14    
      language$= "Czech Republic" 
    Case 15    
      language$= "Simplified Chinese" 
    Case 16    
      language$= "Russian" 
  EndSelect  
  Debug "commande getlanguage ok language= "+language$ 
Else 
  Debug "Erreur de communication"+Str(RET) 
EndIf  

RET.w=cnc_freelibhndl(handle) 
If RET = #Ok 
  Debug "Deconnection réussi" 
Else 
  Debug "Erreur de deconnection"+Str(RET) 
EndIf  

FreeStructure(*sysinfo)
CloseLibrary(#Bibliotheque)


[Edition]: corretion sur les Debug PeekW...

Mesa.
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Non mesa, ca ne fonctionne pas, à la ligne Debug Peeks(*sysinfo\cnc_type,#PB_Ascii) j'ai le message : Mauvais type de parametre: nombre attendu a la place d'une chaine de caracteres.

Lien de la lib FOCAS:
https://drive.google.com/drive/folders/ ... sp=sharing
Dernière modification par Noos88 le sam. 30/sept./2017 15:30, modifié 1 fois.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème utilisation fichier DLL

Message par Ollivier »

Rajoute "arobase" (@) mignon!

Code : Tout sélectionner

Debug Peeks(@*sysinfo\cnc_type,#PB_Ascii)
Avatar de l’utilisateur
Noos88
Messages : 59
Inscription : lun. 14/juin/2010 19:16
Localisation : Belrupt (Vosges)

Re: Problème utilisation fichier DLL

Message par Noos88 »

Bonjour Olivier,

C'est le même problème, ce qui fonctionne est le code dont j'ai donné à 13h17 sauf que je trouve que ce n'est pas jolie.
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Problème utilisation fichier DLL

Message par JohnJohnsonSHERMAN »

Il me semble qu'il faut bien utiliser l'@, même si c'est moins joli, il n'est pas possible de déréférencer un pointeur en PB (le symbole * fait partie intégrante du nom de varaible contrairement au C par exemple). Edit : Ce n'est pas un probléme de déréférencement, j'ai mal compris... Dsl..
PeekS veut une adresse (nombre) en premier paramétre, et pas une chaine de caractéres... Ca peut paraitre trompeur puisque la gestion des chaines de caractéres en PB est trés différente d'en C où ca se comporte comme un simple tableau de char (ou de char *). En C tu peux passer le nom de ta chaine directement, pusique qu'il s'agit d'un char *.

Code : Tout sélectionner

char hello[5] = {'h', 'e', 'l', 'l', 'o'];
foo(hello); //équivaut à foo(&hello[0])...
Ce qui n'est pas possible en PB, il faut bien écrire l'opérateur de récupération d'adresse (le @).

D'ailleurs ce serait cool de pouvoir gérer ca comme en C je pense :p
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème utilisation fichier DLL

Message par Ollivier »

Ben la version plus jolie, c'est une procédure que tu crées toi-même :

Code : Tout sélectionner

Procedure.S strGet(*Address, Length)
   Define.I Offset, CharValue
   Define.S myString, myChar
   For Offset = 0 To (Length - 1)
      CharValue = PeekA(*Address + Offset)
      If CharValue
         myChar = Chr(CharValue)
      Else
         myChar = "?"
      EndIf
      myString + myChar
   Next
   ProcedureReturn myString
EndProcedure
C'est fait sur SmartPhone donc m'en veux pas si ça fonctionne pas : ça ne doit franchement pas être grave...

J'y connais rien à ton berzingue donc j'imagine qu'il est susceptible de te pondre des caractères nuls de type Chr(0). Comme Fred nous a fait un engin qui ne travaille qu'en NullString, le Chr(0) n'existe pas, donc je le remplace par un point d'interrogation. A toi de choisir le symbole approprié...

On écrit :

Code : Tout sélectionner

Debug strGet(@*Pif\cnc_tartempion, 4)
4, c'est le nombre d'octets à lire. Mais je vois d'autres trucs, genre 2, etc... A toi de bien préciser, ça ne doit pas être très difficile.

Enfin, il y a un truc qui pue un tout petit peu la morue dans ton code :

Code : Tout sélectionner

typedef struc ChezYvonne {
       char ElleEstBonne[5];
} ChezYvonne;
ça donne :

Code : Tout sélectionner

Structure ChezYvonne
      ElleEstBonne.A[5]
EndStructure
C'est le type A (ASCII) et non S (String)

Maintenant la "bonne" nouvelle : si tu es absolument certain que ton berzingue ne pond pas de Chr(0) dans ses chaînes, alors :
1) ma fonction plus haut est inutile

Code : Tout sélectionner

Debug *pif\cnc_tartempion
est suffisant et fiable pour extraire/afficher une chaîne.
2) et là:

Code : Tout sélectionner

typedef struc ChezYvonne {
       char ElleEstBonne[5];
} ChezYvonne;
ça donne :

Code : Tout sélectionner

Structure ChezYvonne
      ElleEstBonne.S{5}
EndStructure
On a le "S" de string qui peut pointer son nez et les accolades.

Important les accolades. Et important aussi que ton programme fonctionne en ASCII sinon tu restes avec la version "moins bonne nouvelle" plus haut et tu es obligé d'utiliser ma fonction pour extraire/lire une chaîne.

Pour extrapoler sur les accolades, ça (qui n'a rien à voir avec ton système) :

Code : Tout sélectionner

Structure ChezYolande
       JeScande.S{8}[4]
EndStructure
ça signifie exactement que :

La structure "ChezYolande" supporte quatre chaînes indexées de zéro à trois, chacune de ses chaînes contenant forcément huit caractères.

Ça marche?
Répondre