Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

lancerapplication

15 réponses
Avatar
lou
bonjour
je voudrais lancer une base access 2000 a partir d une application vb

j ai essayé le fameux shell mais ça ne marche qu avec des .exe(appartament)

mon programme acces 2000 s appelle FRONT.mde
ma question est comment lancer un programme qui n est pas un exe a partir de
vb
merci de votre aide

10 réponses

1 2
Avatar
François Picalausa
On Jan 18, 10:09 pm, "lou" wrote:
mon programme acces 2000 s appelle  FRONT.mde
ma question est comment lancer un programme qui n est pas un exe a partir de
vb




Hello,

Je te conseille de jeter un oeil à la FAQ:
Comment ouvrir un fichier à partir d'une application VB ?
http://faq.vb.free.fr/index.php?question=8

François
Avatar
lou
bonjour françois
j ai essaye le code du lien que tu ma donné et j arrive pas a le faire
marcher

j ai crée un exe vb ave un bouton et j ai cree un fichier txt dans
C:WindowsFile.txt
et quand je clik sur le bouton de l exe le fichier en question ne souvre
pas ou est l erreur ???
merci de ton aide

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

On Jan 18, 10:09 pm, "lou" wrote:
mon programme acces 2000 s appelle FRONT.mde
ma question est comment lancer un programme qui n est pas un exe a partir
de
vb




Hello,

Je te conseille de jeter un oeil à la FAQ:
Comment ouvrir un fichier à partir d'une application VB ?
http://faq.vb.free.fr/index.php?question=8

François
Avatar
Jacques93
Bonjour lou,
lou a écrit :
bonjour françois
j ai essaye le code du lien que tu ma donné et j arrive pas a le faire
marcher

j ai crée un exe vb ave un bouton et j ai cree un fichier txt dans
C:WindowsFile.txt
et quand je clik sur le bouton de l exe le fichier en question ne souvre
pas ou est l erreur ???



Je ne peux te dire où est l'erreur, mais en adaptant le code de la FAQ
de la manière suivante cela devrais t'indiquer l'erreur. L' API
ShellExecute renvoie une valeur > 32 en cas de succès :

<http://msdn2.microsoft.com/en-us/library/bb762153(VS.85).aspx>

' Code modifié pour récupérer l'erreur :
' ------------------------------------
Option Explicit

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA" _
(ByVal dwFlags As Long, lpSource As Any, _
ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, ByVal nSize As Long, Arguments As
Long) As Long

Private Const SW_SHOWNORMAL = 1
Private Declare Function ShellExecute Lib "shell32.dll" Alias
"ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long


Private Sub Command1_Click()
Dim lResult As Long

lResult = ShellExecute(Me.hwnd, "open", _
"C:WindowsFile.txt", _
vbNullString, "C:Windows", SW_SHOWNORMAL)
If lResult <= 32 Then
MsgBox FriendlyError(lResult)
End If
End Sub


Private Function FriendlyError(ErrNo As Long) As String
Dim lResult As Long
Dim Buffer As String * 256

lResult = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, _
ErrNo, 0, Buffer, Len(Buffer), 0)
If lResult > 0 Then
FriendlyError = Left(Buffer, lResult - 2) & _
" (" & Format(ErrNo) & ")"
Else
FriendlyError = "Erreur numéro " & Format(ErrNo)
End If
End Function


' l'extension .txt est elle bien associé à une application, par défaut
'notepad.exe'

--
Cordialement,

Jacques.
Avatar
François Picalausa
On Jan 20, 10:04 am, "lou" wrote:
"François Picalausa" a écrit dans le message d e news:

On Jan 18, 10:09 pm, "lou" wrote:

> mon programme acces 2000 s appelle FRONT.mde
> ma question est comment lancer un programme qui n est pas un exe a part ir
> de
> vb

Je te conseille de jeter un oeil à la FAQ:
Comment ouvrir un fichier à partir d'une application VB ?http://faq.vb. free.fr/index.php?question=8




bonjour françois
j ai essaye le code du lien que tu ma donné et j arrive pas a le faire
marcher

j ai crée un exe vb ave un bouton et j ai cree un fichier txt dans
C:WindowsFile.txt
et quand je clik sur le bouton de l exe le fichier en question ne souvre
pas ou est l erreur ???



Hello,

Le but n'est pas de créer un fichier texte dans C:Windows, mais bien
de remplacer le fichier en paramètre par ton mde. Ce que fait ce code
est en réalité la même chose qu'un double-click sur l'icône du fichi er
en question dans l'explorateur.

Par exemple, si ton fichier est dans "C:UsersUser0DocumentsTest
toto.mde" tu aurais:
ShellExecute Me.hwnd, "open", C:UsersUser0DocumentsTesttoto.mde",
vbNullString, vbNullString, SW_SHOWNORMAL


François
Avatar
Jean-marc
Jacques93 wrote:

Salut Jacques,

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA" _
(ByVal dwFlags As Long, lpSource As Any, _
ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, ByVal nSize As Long, Arguments As
Long) As Long



Private Function FriendlyError(ErrNo As Long) As String


<snip>


Très sympa celle-ci ! J'avais de vagues souvenirs mais je ne me
rappelais plus comment on faisait et surtout que c'était si simple !

Merci du rappel :-)

Bonne journée !


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
lou
re
ben voila j ai embete tout le monde ave ça parceque finalement ça marche
c'est de ma faute erreur de frape encore toutes mes excuses et merci

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

On Jan 20, 10:04 am, "lou" wrote:
"François Picalausa" a écrit dans le message de
news:

On Jan 18, 10:09 pm, "lou" wrote:

> mon programme acces 2000 s appelle FRONT.mde
> ma question est comment lancer un programme qui n est pas un exe a
> partir
> de
> vb

Je te conseille de jeter un oeil à la FAQ:
Comment ouvrir un fichier à partir d'une application VB
?http://faq.vb.free.fr/index.php?question=8




bonjour françois
j ai essaye le code du lien que tu ma donné et j arrive pas a le faire
marcher

j ai crée un exe vb ave un bouton et j ai cree un fichier txt dans
C:WindowsFile.txt
et quand je clik sur le bouton de l exe le fichier en question ne souvre
pas ou est l erreur ???



Hello,

Le but n'est pas de créer un fichier texte dans C:Windows, mais bien
de remplacer le fichier en paramètre par ton mde. Ce que fait ce code
est en réalité la même chose qu'un double-click sur l'icône du fichier
en question dans l'explorateur.

Par exemple, si ton fichier est dans "C:UsersUser0DocumentsTest
toto.mde" tu aurais:
ShellExecute Me.hwnd, "open", C:UsersUser0DocumentsTesttoto.mde",
vbNullString, vbNullString, SW_SHOWNORMAL


François
Avatar
Jacques93
Bonjour Jean-marc,
Jean-marc a écrit :
Jacques93 wrote:

Salut Jacques,

Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA" _
(ByVal dwFlags As Long, lpSource As Any, _
ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, ByVal nSize As Long, Arguments As
Long) As Long



Private Function FriendlyError(ErrNo As Long) As String


<snip>


Très sympa celle-ci ! J'avais de vagues souvenirs mais je ne me
rappelais plus comment on faisait et surtout que c'était si simple !

Merci du rappel :-)



De rien !

Bonne journée !




A toi aussi :-)

Je dirai que c'est utile pour les utilisateurs, et les développeurs
(surtout ceux qui n'ont pas WinError.h), les API provoquant, soit des
crash parfois sévères, soit des codes erreurs souvent non testés et de
toutes façon ne générant pas d'erreur VB, ou alors induite, mais pas
toujours immédiatement.

Il y a toutefois une limitation : certains groupes d'API's ont leurs
propres erreurs, lmerr.h pour certaines API réseau par exemple.

--
Cordialement,

Jacques.
Avatar
François Picalausa
On Jan 20, 11:29 am, Jacques93 wrote:
Bonjour Jean-marc,
Jean-marc a écrit :
> Jacques93 wrote:

>> Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
>> Private Declare Function FormatMessage Lib "kernel32" Alias
<snip>
Il y a toutefois une limitation : certains groupes d'API's ont leurs
propres erreurs, lmerr.h pour certaines API réseau par exemple.



Hello,

Ce n'est pas tout à fait exact :
Option Explicit

Private Const NERR_BASE As Long = 2100
Private Const NERR_ServerNotStarted As Long = NERR_BASE + 14

Private Const ERROR_FTP_DROPPED As Long = 12111 'wininet


Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800
Private Const LOAD_LIBRARY_AS_DATAFILE As Long = &H2

Private Declare Function FormatMessage _
Lib "kernel32" _
Alias "FormatMessageA" _
( _
ByVal dwFlags As Long, _
lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long _
) _
As Long
Private Declare Function LoadLibraryEx _
Lib "kernel32" _
Alias "LoadLibraryExA" _
( _
ByVal lpLibFileName As String, _
ByVal hFile As Long, _
ByVal dwFlags As Long _
) _
As Long
Private Declare Function FreeLibrary _
Lib "kernel32" _
( _
ByVal hLibModule As Long _
) _
As Long

Private Sub Command1_Click()
MsgBox FriendlyError(ERROR_FTP_DROPPED, "wininet.dll")
MsgBox FriendlyError(ERROR_FTP_DROPPED)
End Sub


Private Function FriendlyError(ByVal ErrNo As Long, Optional ByVal Lib
As String = vbNullString) As String
Dim lResult As Long
Dim Buffer As String * 256
Dim hMod As Long
Dim Format As Long

hMod = 0
Format = FORMAT_MESSAGE_FROM_SYSTEM

If (LenB(Lib)) Then
hMod = LoadLibraryEx(Lib, 0, LOAD_LIBRARY_AS_DATAFILE)

If (hMod) Then
Format = Format Or FORMAT_MESSAGE_FROM_HMODULE
End If
End If

lResult = FormatMessage(Format, _
ByVal hMod, _
ErrNo, _
0, _
Buffer, Len(Buffer), _
0)

If (hMod) Then
FreeLibrary hMod
End If

'Post processing : trim the error message
If lResult > 0 Then
FriendlyError = Left(Buffer, lResult - 2) & " (" & ErrNo & ")"
Else
FriendlyError = "Erreur numéro " & ErrNo
End If
End Function

Pour ce qui est des LMErr, sous Vista il semblerait qu'il ne soit pas
nécessaire de spécifier que la table d'erreurs est dans "Netmsg.dll".
Ca resterait le cas sous XP,2000,2003, et NT. Par contre, pour
wininet, le comportement est clairement différent.
Je n'exclu cependant que d'autres composants aient des codes d'erreur
propre mais pas de table correspondante.

Le top du top serait d'appeler FormatMessage avec
FORMAT_MESSAGE_ALLOCATE_BUFFER pour être certain de ne pas avoir un
buffer trop court. Ca doit pouvoir se faire par CopyMemory...

François
Avatar
Jacques93
Bonjour François Picalausa,
François Picalausa a écrit :
On Jan 20, 11:29 am, Jacques93 wrote:
Bonjour Jean-marc,
Jean-marc a écrit :
Jacques93 wrote:
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Declare Function FormatMessage Lib "kernel32" Alias




<snip>
Il y a toutefois une limitation : certains groupes d'API's ont leurs
propres erreurs, lmerr.h pour certaines API réseau par exemple.



Hello,

Ce n'est pas tout à fait exact :


[...]

Le top du top serait d'appeler FormatMessage avec
FORMAT_MESSAGE_ALLOCATE_BUFFER pour être certain de ne pas avoir un
buffer trop court. Ca doit pouvoir se faire par CopyMemory...




Effectivement le code que j'ai posté est risqué de ce côté là, et peut
planter l'application au lieu d'afficher un gentil message, ce qui est
tout de même bêta. Je pense que ce code devrait être plus "propre" :


Option Explicit

Private Const NERR_BASE As Long = 2100
Private Const NERR_ServerNotStarted As Long = NERR_BASE + 14

Private Const ERROR_FTP_DROPPED As Long = 12111 'wininet


Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800
Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF
Private Const LOAD_LIBRARY_AS_DATAFILE As Long = &H2


Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA" _
(ByVal dwFlags As Long, _
lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByRef lpBuffer As Long, _
ByVal nSize As Long, _
Arguments As Long) As Long

Private Declare Function LoadLibraryEx Lib "kernel32" Alias
"LoadLibraryExA" _
(ByVal lpLibFileName As String, _
ByVal hFile As Long, _
ByVal dwFlags As Long) As Long

Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(xDest As Any, _
xSource As Any, _
ByVal nBytes As Long)

Private Sub Command1_Click()
MsgBox FriendlyError(ERROR_FTP_DROPPED, "wininet.dll")
MsgBox FriendlyError(ERROR_FTP_DROPPED)
End Sub


Private Function FriendlyError(ByVal ErrNo As Long, _
Optional ByVal Lib As String =
vbNullString) As String
Dim lResult As Long
Dim lpBuffer As Long
Dim Buffer As String
Dim hMod As Long
Dim Format As Long

hMod = 0
Format = FORMAT_MESSAGE_FROM_SYSTEM Or _
FORMAT_MESSAGE_ALLOCATE_BUFFER Or _
FORMAT_MESSAGE_MAX_WIDTH_MASK

If (LenB(Lib)) Then
hMod = LoadLibraryEx(Lib, 0, LOAD_LIBRARY_AS_DATAFILE)

If (hMod) Then
Format = Format Or FORMAT_MESSAGE_FROM_HMODULE
End If
End If

lResult = FormatMessage(Format, _
ByVal hMod, _
ErrNo, _
0, _
lpBuffer, &HFFFF&, _
0)
If lResult > 0 Then
Buffer = String(lResult, Chr$(0))
CopyMemory ByVal Buffer, ByVal lpBuffer, lResult
End If

If (hMod) Then
FreeLibrary hMod
End If

'Post processing : trim the error message
If lResult > 0 Then
FriendlyError = Left(Buffer, lResult - 2) & " (" & ErrNo & ")"
Else
FriendlyError = "Erreur numéro " & ErrNo
End If
End Function



A noter que sous Vista, le paramètre dwLanguageID semble superflu, la
localisation se fait automatiquement.

--
Cordialement,

Jacques.
Avatar
François Picalausa
Hello,

<inline>

On Jan 20, 2:19 pm, Jacques93 wrote:
Bonjour François Picalausa,
François Picalausa a écrit :

> On Jan 20, 11:29 am, Jacques93 wrote:
<snip>

> Le top du top serait d'appeler FormatMessage avec
> FORMAT_MESSAGE_ALLOCATE_BUFFER pour être certain de ne pas avoir un
> buffer trop court. Ca doit pouvoir se faire par CopyMemory...

Effectivement le code que j'ai posté est risqué de ce côté là, e t peut
planter l'application au lieu d'afficher un gentil message, ce qui est
tout de même bêta. Je pense que ce code devrait être plus "propre" :



<snip le début du code>
Format = FORMAT_MESSAGE_FROM_SYSTEM Or _
FORMAT_MESSAGE_ALLOCATE_BUFFER Or _
FORMAT_MESSAGE_MAX_WIDTH_MASK



Je ne suis pas certain de comprendre pourquoi tu as choisi d'utiliser
un FORMAT_MESSAGE_MAX_WIDTH_MASK ? Si des linebreaks sont présents à
l'origine, on peut supposer qu'ils sont utiles, mais j'ai peut-être
mal compris l'intention?

<snip>

   lResult = FormatMessage(Format, _
                           ByVal hMod, _
                           ErrNo, _
                           0, _
                           lpBuffer, &HFFFF&, _
                           0)



Dans le cas de FORMAT_MESSAGE_ALLOCATE_BUFFER, &HFFFF& serait la
taille du buffer minimum à allouer ; je pense que 0 serait tout à fait
suffisant, mais y a peut-être une raison que j'ai loupée?

<private joke>
Peut-être que Jean-Marc t'as trop converti à la philosophie "on en est
pas à quelques Ko de mémoire près" ? :-P
</private joke>

   If lResult > 0 Then
     Buffer = String(lResult, Chr$(0))
     CopyMemory ByVal Buffer, ByVal lpBuffer, lResult
   End If



Un LocalFree devrait désallouer le lpBuffer après usage...

<snip la fin du code>
A noter que sous Vista, le paramètre dwLanguageID semble superflu, la
localisation se fait automatiquement.



Selon la documentation, les langues sont retrouvées selon:
Language neutral
Thread LANGID, based on the thread's locale value
User default LANGID, based on the user's default locale value
System default LANGID, based on the system default locale value
US English

Ce sera donc exact la plupart du temps, je suppose....

François
1 2