Page 1 sur 2

Problème utilisation fichier DLL

Publié : mar. 05/sept./2017 17:09
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.

Re: Problème utilisation fichier DLL

Publié : mar. 05/sept./2017 17:47
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

Re: Problème utilisation fichier DLL

Publié : mar. 05/sept./2017 18:06
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

Re: Problème utilisation fichier DLL

Publié : mar. 05/sept./2017 19:56
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

Re: Problème utilisation fichier DLL

Publié : lun. 18/sept./2017 21:19
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 

Re: Problème utilisation fichier DLL

Publié : lun. 18/sept./2017 22:21
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.

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 8:16
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]

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 11:41
par Noos88
Oui merci, j'ai vu mon erreur, je poste l'exemple du code une fois fini si ca peut aider quelqu'un

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 12:17
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

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 15:00
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.

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 16:36
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

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 17:00
par Ollivier
Rajoute "arobase" (@) mignon!

Code : Tout sélectionner

Debug Peeks(@*sysinfo\cnc_type,#PB_Ascii)

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 20:10
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.

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 22:01
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

Re: Problème utilisation fichier DLL

Publié : mar. 19/sept./2017 23:33
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?