Dans une dll, j'utilise le clipbord en API, pour copier une image depuis un
doc Word, et l'enregister sur le disque dur.
Cela fonction bien sur plusieures machines sauf sur 1 machine.
C'est sur la fonction "IsClipboardFormatAvailable" que produit le problème.
==>Cette fonction me renvoi FALSE
==>Cela veut dire que le clipboard n'est pas disponible sur la machine....
Config des machines Win2000 serveur, sp+3
Voic le code en question:
----------------------------------------------------------------------------
----------------------------------------------------
Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal
hInst As Long, ByVal lpsz As String, ByVal dwImageType As Long, ByVal
dwDesiredWidth As Long, ByVal dwDesiredHeight As Long, ByVal dwFlags As
Long) As Long
Public Declare Function CloseClipboard Lib "user32" () As Long
Public Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) As
Long
Public Declare Function EmptyClipboard Lib "user32" () As Long
Public Declare Function SetClipboardData Lib "user32" (ByVal wFormat As
Long, ByVal hMem As Long) As Long
Public Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal
wFormat As Long) As Long
Public Declare Function GetClipboardData Lib "user32" (ByVal wFormat As
Long) As Long
Public Function ExtractImage(Image As Word.InlineShape) As Long
Dim lgDCsrc As Long
Dim hEmf As Long
Dim emh As ENHMETAHEADER
Dim sTmpEmf As String
Dim sTmpBmp As String
Dim lgDummy As Long
Const CF_ENHMETAFILE = 14
......
'--Image est une image dans un document Word
Image.Select '--Sélection de l'image
Image.Range.Copy '--Copy de l'image dans le presse papier.
'--On va recuperer l'image dans le presse papier:
If OpenClipboard( m_FormPicture.Hwnd) Then
If IsClipboardFormatAvailable(CF_ENHMETAFILE) Then
'--Copie dans le presse papier au format EMF
hEmf = GetClipboardData(CF_ENHMETAFILE)
Call GetEnhMetaFileHeader(hEmf, Len(emh), emh)
lgDummy = PlayEnhMetaFile(lgDCsrc, hEmf, emh.rclBounds)
'--On copie le presse papier sur le HD au formt EMF
sTmpEmf = "c:\MonImage.emf"
lgDummy = CopyEnhMetaFile(hEmf, sTmpEmf)
'--Fermeture du presse papier
Call EmptyClipboard
Call CloseClipboard
Else
Call EmptyClipboard
Call CloseClipboard
Err.Raise 31004, "Presse Papier", LoadResString2(31004)
End If
Else
Call EmptyClipboard
Call CloseClipboard
Err.Raise 31003, "Presse Papier", LoadResString2(31003)
End If
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Zoury
Salut Emmanuel! :O)
C'est sur la fonction "IsClipboardFormatAvailable" que produit le
problème.
==>Cette fonction me renvoi FALSE ==>Cela veut dire que le clipboard n'est pas disponible sur la machine....
Tu peux obtenir le numéro du message d'erreur obtenu à l'aide de Err.GetLastDllError. Pour obtenir la description de cette erreur tu peux aller consulter le fichier Error.h se trouvant dans l répertoire ...Microsoft Visual StudioVC98Include.
Tu peux également l'obtenir par code grâce à la fonction suivante : '*** Option Explicit
Private Declare Function FormatMessage _ Lib "kernel32" _ Alias "FormatMessageA" _ ( _ ByVal dwFlags As Long, _ ByRef lpSource As Any, _ ByVal dwMessageId As Long, _ ByVal dwLanguageId As Long, _ ByVal lpBuffer As String, _ ByVal nSize As Long, _ ByRef Arguments As Long _ ) As Long
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200 Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000 Private Const LANG_NEUTRAL As Long = &H0
Private Sub Main() Debug.Print GetSystemErrorMessage(4) Debug.Print GetSystemErrorMessage(5) Debug.Print GetSystemErrorMessage(6) Debug.Print GetSystemErrorMessage(7) End Sub
Private Function GetSystemErrorMessage(ByRef lErrorNumber As Long) As String GetSystemErrorMessage = String$(255, Chr$(0)) Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lErrorNumber, LANG_NEUTRAL, GetSystemErrorMessage, 255, ByVal 0&) GetSystemErrorMessage = Left$(GetSystemErrorMessage, InStr(GetSystemErrorMessage, vbNewLine) - 1) End Function '***
L'erreur retournée devrait t'indiquer où se situe le problème.
Merci de poster les réponses au groupe afin d'en faire profiter à tous
Salut Emmanuel! :O)
C'est sur la fonction "IsClipboardFormatAvailable" que produit le
problème.
==>Cette fonction me renvoi FALSE
==>Cela veut dire que le clipboard n'est pas disponible sur la machine....
Tu peux obtenir le numéro du message d'erreur obtenu à l'aide de
Err.GetLastDllError. Pour obtenir la description de cette erreur tu peux
aller consulter le fichier Error.h se trouvant dans l répertoire
...Microsoft Visual StudioVC98Include.
Tu peux également l'obtenir par code grâce à la fonction suivante :
'***
Option Explicit
Private Declare Function FormatMessage _
Lib "kernel32" _
Alias "FormatMessageA" _
( _
ByVal dwFlags As Long, _
ByRef lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
ByRef Arguments As Long _
) As Long
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const LANG_NEUTRAL As Long = &H0
Private Sub Main()
Debug.Print GetSystemErrorMessage(4)
Debug.Print GetSystemErrorMessage(5)
Debug.Print GetSystemErrorMessage(6)
Debug.Print GetSystemErrorMessage(7)
End Sub
Private Function GetSystemErrorMessage(ByRef lErrorNumber As Long) As String
GetSystemErrorMessage = String$(255, Chr$(0))
Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lErrorNumber,
LANG_NEUTRAL, GetSystemErrorMessage, 255, ByVal 0&)
GetSystemErrorMessage = Left$(GetSystemErrorMessage,
InStr(GetSystemErrorMessage, vbNewLine) - 1)
End Function
'***
L'erreur retournée devrait t'indiquer où se situe le problème.
C'est sur la fonction "IsClipboardFormatAvailable" que produit le
problème.
==>Cette fonction me renvoi FALSE ==>Cela veut dire que le clipboard n'est pas disponible sur la machine....
Tu peux obtenir le numéro du message d'erreur obtenu à l'aide de Err.GetLastDllError. Pour obtenir la description de cette erreur tu peux aller consulter le fichier Error.h se trouvant dans l répertoire ...Microsoft Visual StudioVC98Include.
Tu peux également l'obtenir par code grâce à la fonction suivante : '*** Option Explicit
Private Declare Function FormatMessage _ Lib "kernel32" _ Alias "FormatMessageA" _ ( _ ByVal dwFlags As Long, _ ByRef lpSource As Any, _ ByVal dwMessageId As Long, _ ByVal dwLanguageId As Long, _ ByVal lpBuffer As String, _ ByVal nSize As Long, _ ByRef Arguments As Long _ ) As Long
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200 Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000 Private Const LANG_NEUTRAL As Long = &H0
Private Sub Main() Debug.Print GetSystemErrorMessage(4) Debug.Print GetSystemErrorMessage(5) Debug.Print GetSystemErrorMessage(6) Debug.Print GetSystemErrorMessage(7) End Sub
Private Function GetSystemErrorMessage(ByRef lErrorNumber As Long) As String GetSystemErrorMessage = String$(255, Chr$(0)) Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, lErrorNumber, LANG_NEUTRAL, GetSystemErrorMessage, 255, ByVal 0&) GetSystemErrorMessage = Left$(GetSystemErrorMessage, InStr(GetSystemErrorMessage, vbNewLine) - 1) End Function '***
L'erreur retournée devrait t'indiquer où se situe le problème.