OVH Cloud OVH Cloud

problème API Clipboard

1 réponse
Avatar
Emmanuel COCHERIL
Bonjour à tous,

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 Enum PressePapierFormat
LR_LOADFROMFILE = &H10
IMAGE_BITMAP = 0
IMAGE_ICON = 1
IMAGE_CURSOR = 2
IMAGE_ENHMETAFILE = 3
CF_BITMAP = 2
End Enum


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

----------------------------------------------------------------------------
----------------------------------------------------


Si quelqu'un sait pourquoi le Clipboard n'est pas dispo sur cette machine,
je suis preneur.

Bonne journée,

Emmanuel

1 réponse

Avatar
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.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous