OVH Cloud OVH Cloud

SOS Problème d'execution avec writefile sous vb6!!!!

4 réponses
Avatar
zoheir
Salut =E0 tous,
J'ai un probl=E8me avec l'API writefile au moment de l'execution,
l'api writefile fonction a merveille sous mon code source pendant la
compilation, j'envoi et je lu sous mon port serie rs232.....
mais parcontre, quand je g=E9n=E9rer mon executable,
ce dernier ne fonction pas (erreur d'execution) il ne parvient pas =E0
executer le writefile!!!
merci,

4 réponses

Avatar
Picalausa François
"zoheir" a écrit dans le message de news:

Salut à tous,
J'ai un problème avec l'API writefile au moment de l'execution,
l'api writefile fonction a merveille sous mon code source pendant la
compilation, j'envoi et je lu sous mon port serie rs232.....
mais parcontre, quand je générer mon executable,
ce dernier ne fonction pas (erreur d'execution) il ne parvient pas à
executer le writefile!!!



Hello,

Peux-tu indiquer quelle erreur se produit?
Writefile renvoie-t-il bien 0? dans ce cas que renvoie Err.LastDllError ?
Eventuellement, peux-tu indiquer le plus petit bout de code permettant de
reproduire le comportement?

--
Picalausa François
Avatar
zoheir
Salut Mr Picalausa François,
Merci de votre reponse
je travail sous VB6 avec l'API WriteFile sur le port RS232,cette API
fonctionne correctement dans l'environnement VB6 sous mon code source,
mais dès que je l'execute dans mon programme (Executable), le
programme s'arrete completement!!!
j'ai essayer de comprendre l'erreur on utilisant : Err.LastDllError ou
GetLastError
malheureusement le programme s'intérrompt avant ces instructions juste
à l'api writefile
merci
cordialement
voila mon code source
vous pouvez le tester juste de créer un bouton Command1
'************
'Module
Option Explicit
Dim adrhin As Long
Dim Tableau(0 To 62) As String
Dim d(1) As DCB
Dim cto(1) As COMMTIMEOUTS
Dim r As Boolean
Dim b As Buffer
Dim errors As Long
'**********
Dim byteswritten As Long, bytesread As Long
Private Declare Function GetLastError Lib "kernel32" () As Long

Private Declare Function GetCommTimeouts Lib "kernel32" ( _
ByVal hFile As Long, _
lpCommTimeouts As COMMTIMEOUTS) As Long

Private Declare Function SetCommTimeouts Lib "kernel32" ( _
ByVal hFile As Long, _
lpCommTimeouts As COMMTIMEOUTS) As Long

Private Declare Function BuildCommDCB Lib "kernel32" Alias
"BuildCommDCBA" ( _
ByVal lpDef As String, _
lpDCB As DCB) As Long

Private Type COMMTIMEOUTS
ReadIntervalTimeout As Long
ReadTotalTimeoutMultiplier As Long
ReadTotalTimeoutConstant As Long
WriteTotalTimeoutMultiplier As Long
WriteTotalTimeoutConstant As Long
End Type

Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const OPEN_EXISTING = 3
Const INVALID_HANDLE_VALUE = -1
Const SETRTS = 3 ' Set RTS high
Const CLRRTS = 4 ' Set RTS low
Const SETDTR = 5 ' Set DTR high
Const CLRDTR = 6 ' Set DTR low

Private Type DCB
DCBlength As Long
BaudRate As Long
fBitFields As Long 'See Comments in Win32API.Txt
wReserved As Integer
XonLim As Integer
XoffLim As Integer
ByteSize As Byte
Parity As Byte
StopBits As Byte
XonChar As Byte
XoffChar As Byte
ErrorChar As Byte
EofChar As Byte
EvtChar As Byte
wReserved1 As Integer 'Reserved; Do Not Use
End Type

Private Type Buffer
'******
'b(31) As Byte
b(31) As Byte
End Type
Private Declare Function SetCommState Lib "kernel32" ( _
ByVal hCommDev As Long, _
lpDCB As DCB) As Long
Dim hCom(1) As Long


Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA"
(ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal
dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal
dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long,
ByVal hTemplateFile As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long,
lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long,
lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long

Private Declare Function ReadFile Lib "kernel32" ( _
ByVal hFile As Long, _
lpBuffer As Any, _
ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, _
lpOverlapped As Any) As Long


'Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA"
(ByVal lpFileName As String) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As
Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long,
ByVal dwMoveMethod As Long) As Long
Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As
Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As
Long, lpFileSizeHigh As Long) As Long

'Private Const GENERIC_READ = &H80000000
'Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const CREATE_NEW = 1
Private Const OPEN_ALWAYS = 4
'Private Const OPEN_EXISTING = 3

Private Const FILE_BEGIN = 0
Private Const FILE_CURRENT = 1
Private Const FILE_END As Long = 2

'Valeur de retour si erreur
'Private Const INVALID_HANDLE_VALUE As Long = -1

Public Sub Debug_Log()
Dim PathFile As String: PathFile = ""
Dim hFile As Long: hFile = 0
Dim FileSize As Long: FileSize = 0
Dim Del_File As Long: Del_File = 0
Dim byteswritten As Long: byteswritten = 0
'Receive the low and high-order halves of the file size
Dim loworder As Long, highorder As Long
'********
hFile = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE,
FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
If hFile = INVALID_HANDLE_VALUE Then 'Il n'existe pas
'Crée fichier
hFile = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE,
FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_NEW, 0, 0)
End If
r = BuildCommDCB("baud–00 parity=o data=8 stop=1 xon=off od sr=off
octs=off dtr=on rts=on idsr=off ", d(0))
r = SetCommState(hFile, d(0))
cto(0).ReadIntervalTimeout = &HFFFF
r = SetCommTimeouts(hFile, cto(0))
b.b(0) = 0
r = WriteFile(hFile, ByVal b, 1, byteswritten, ByVal 0&)
''''
CloseHandle hFile
End Sub

Private Sub Command1_Click()
Debug_Log
End Sub

'********
Picalausa François wrote:
"zoheir" a écrit dans le message de news:

> Salut à tous,
> J'ai un problème avec l'API writefile au moment de l'execution,
> l'api writefile fonction a merveille sous mon code source pendant la
> compilation, j'envoi et je lu sous mon port serie rs232.....
> mais parcontre, quand je générer mon executable,
> ce dernier ne fonction pas (erreur d'execution) il ne parvient pas à
> executer le writefile!!!

Hello,

Peux-tu indiquer quelle erreur se produit?
Writefile renvoie-t-il bien 0? dans ce cas que renvoie Err.LastDllError ?
Eventuellement, peux-tu indiquer le plus petit bout de code permettant de
reproduire le comportement?

--
Picalausa François


Avatar
Picalausa François
Hello,

Le but du code est-il bien d'écrire un caractère zéro sur le hfile?
Je ne comprend pas bien la déclaration utilisée pour le buffer (pourquoi une
structure plutôt que le tableau d'octets en direct?), mais ce qui est sur
c'est que passer une structure byval est douteux (c'est étonnant que ça
fonctionne en IDE... il faudrait voir à quoi cet appel correspond
exactement...)

Pour écrire à partir du buffer on peut soit employer
r = WriteFile(hFile, b.b(0), 1, byteswritten, ByVal 0&)
(on passe un pointeur vers la première cellule du tableau)
ou
r = WriteFile(hFile, b, 1, byteswritten, ByVal 0&)
(on passe un pointeur vers le début de la structure, étant ici la
première cellule du tableau)

Voici une autre méthode pour réaliser la même chose:
r = WriteFile(hFile, ByVal vbNullChar, 1, byteswritten, ByVal 0&)
(On passe un pointeur vers un caractère null)

--
Picalausa François

"zoheir" a écrit dans le message de news:

J'ai essayé de comprendre l'erreur on utilisant : Err.LastDllError ou
GetLastError
malheureusement le programme s'intérrompt avant ces instructions juste
à l'api writefile

Dim b As Buffer
...
Private Type Buffer
'******
'b(31) As Byte
b(31) As Byte
End Type
...
Public Sub Debug_Log()
...
r = WriteFile(hFile, ByVal b, 1, byteswritten, ByVal 0&)
...
End Sub
Picalausa François wrote:
"zoheir" a écrit dans le message de news:

> Salut à tous,
> J'ai un problème avec l'API writefile au moment de l'execution,
> l'api writefile fonction a merveille sous mon code source pendant la
> compilation, j'envoi et je lu sous mon port serie rs232.....
> mais parcontre, quand je générer mon executable,
> ce dernier ne fonction pas (erreur d'execution) il ne parvient pas à
> executer le writefile!!!

Hello,

Peux-tu indiquer quelle erreur se produit?
Writefile renvoie-t-il bien 0? dans ce cas que renvoie Err.LastDllError ?
Eventuellement, peux-tu indiquer le plus petit bout de code permettant de
reproduire le comportement?


Avatar
zoheir
Salut,
merci beaucoup François,
c'etait ca le problème, mais je n'arrive pas à comprendre pourquoi ca
a marché sous IDE!!?
cordialement


Picalausa François wrote:
Hello,

Le but du code est-il bien d'écrire un caractère zéro sur le hfile?
Je ne comprend pas bien la déclaration utilisée pour le buffer (pourq uoi une
structure plutôt que le tableau d'octets en direct?), mais ce qui est s ur
c'est que passer une structure byval est douteux (c'est étonnant que ça
fonctionne en IDE... il faudrait voir à quoi cet appel correspond
exactement...)

Pour écrire à partir du buffer on peut soit employer
r = WriteFile(hFile, b.b(0), 1, byteswritten, ByVal 0&)
(on passe un pointeur vers la première cellule du tableau)
ou
r = WriteFile(hFile, b, 1, byteswritten, ByVal 0&)
(on passe un pointeur vers le début de la structure, étant ici la
première cellule du tableau)

Voici une autre méthode pour réaliser la même chose:
r = WriteFile(hFile, ByVal vbNullChar, 1, byteswritten, ByVal 0&)
(On passe un pointeur vers un caractère null)

--
Picalausa François

"zoheir" a écrit dans le message de news:

> J'ai essayé de comprendre l'erreur on utilisant : Err.LastDllError ou
> GetLastError
> malheureusement le programme s'intérrompt avant ces instructions juste
> à l'api writefile
>
> Dim b As Buffer
> ...
> Private Type Buffer
> '******
> 'b(31) As Byte
> b(31) As Byte
> End Type
> ...
> Public Sub Debug_Log()
> ...
> r = WriteFile(hFile, ByVal b, 1, byteswritten, ByVal 0&)
> ...
> End Sub
> Picalausa François wrote:
> "zoheir" a écrit dans le message de news:
>
> > Salut à tous,
> > J'ai un problème avec l'API writefile au moment de l'execution,
> > l'api writefile fonction a merveille sous mon code source pendant la
> > compilation, j'envoi et je lu sous mon port serie rs232.....
> > mais parcontre, quand je générer mon executable,
> > ce dernier ne fonction pas (erreur d'execution) il ne parvient pas à
> > executer le writefile!!!
>
> Hello,
>
> Peux-tu indiquer quelle erreur se produit?
> Writefile renvoie-t-il bien 0? dans ce cas que renvoie Err.LastDllError ?
> Eventuellement, peux-tu indiquer le plus petit bout de code permettant de
> reproduire le comportement?