Property dans dll

Résolu
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 - 29 nov. 2008 à 18:27
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 - 3 déc. 2008 à 09:24
Bonjour,
J'ai un petit probléme;
Comme on dit, vaut mieux 1 qui sait...

Je veux mettre cette fonction dans une dll:
Public Function CaptureWindow(ByVal hWndSrc As Long, _
            ByVal Client As Boolean, ByVal LeftSrc As Long, _
            ByVal TopSrc As Long, ByVal WidthSrc As Long, _
            ByVal HeightSrc As Long) As Picture

=>msg d'erreur pas type attendu

car picture as property

Comment qu'on fait?????????????????????

18 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 nov. 2008 à 01:01
Public Function CaptureWindow(ByVal hWndSrc As Long, _
            ByVal Client As Boolean, ByVal LeftSrc As Long, _
            ByVal TopSrc As Long, ByVal WidthSrc As Long, _
            ByVal HeightSrc As Long) As OBJECT
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2008 à 01:00
    Set serveurdll6 = interfacedll6.objGetClassInstance("cls_outils")
    SET CaptureWindow = serveurdll6.CaptureWindow(hWndSrc, Client, LeftSrc, TopSrc, WidthSrc, HeightSrc)
    Set serveurdll6 = Nothing

et tu n'as pas répondu à : que donne la simple référence de ta dll dans le projet? <hr size ="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
29 nov. 2008 à 19:01
salut,

dll = classe,
sauf rares cas, ta fonction renverra de préférence un OBJECT qu'un PICTURE
++

<hr size ="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 nov. 2008 à 20:50
Merci pour ta réponse pcpt

Donc en théorie, je peux envoyer une picturebox pour que la fonction me la retourne pleine (de mes property).

Je vais essayer...

cas exceptionnel ça veut dire propertybag?
j'ai vu ça dans une source je crois;
j'ai retenu que j'entendais gratter la dd comme si j'ecrivais dans un fichier
on peut transporter le propertybag?
quels sont les avantage par rapport a l'ecriture dans un fichier?
a +
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 nov. 2008 à 20:53
"Donc en théorie, je peux envoyer une picturebox pour que la fonction me la retourne pleine (de mes property)."

est ce la meilleure solution?
(avant de tout essayer)
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 nov. 2008 à 22:52
non, picturebox est un module d'objet privé.

j'ai pas la solution
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
29 nov. 2008 à 23:36
ou faire comme style EB, une class(item) dans la dll qui possederait une propriete picture?Peut-on creer une propriete picture dans une class de dll (maclass.picture loadpicture "c:\image1"...     maclass.picturecaptureecran...)?
J'imagine que ça ne peut pas etre rendu public aussi.

N'y aurait-il pas un pro pour me dire comment il fait d'habitude?

Vous n'hebergez jamais ce type de fonctions dans vos dll?
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 nov. 2008 à 02:24
Malgrés toute ma bonne volontée...

LE MEME code avec object copié/coller dans un module fonctionne parfaitement , mais pas dans la dll!!!

LE MEME
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 nov. 2008 à 02:51
re,

indique stp :
1. les déclarations des fonctions/API utilisées
2. le nom de la classe de ta dll
3. le code complet de ta fonction
4. la déclaration de ta classe au niveau de ton appli
5. la ligne d'appel de ta fonction
6. le type (Instancing, MTSTransactionMode et Persistable) de ta classe


<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
30 nov. 2008 à 13:28
Bonjour pcpt

multiuse
notaamtsobject
notpersistable

'j'appelle dans une longue procédure:
    r = GetWindowRect(hWndActive, RectActive)
            Frm_invisible.Pictemp.Top = 0 'RectActive.Top
            Frm_invisible.Pictemp.Left = 0 'RectActive.Left
            Frm_invisible.Pictemp.Height = RectActive.Bottom - RectActive.Top
            Frm_invisible.Pictemp.Width = RectActive.Right - RectActive.Left
            Wait 0.5
    'je' capture dans pictemp
     Set Frm_invisible.Pictemp.Picture = CaptureWindow(hWndActive, False, 0, 0, _
            RectActive.Right - RectActive.Left, RectActive.Bottom - RectActive.Top)
(ça marche tres bien dans un module)

'ca passe par une autre class pour "conserver l'intégrité de chaque instances"

        
Public Function CaptureWindow(ByVal hWndSrc As Long, _
            ByVal Client As Boolean, ByVal LeftSrc As Long, _
            ByVal TopSrc As Long, ByVal WidthSrc As Long, _
            ByVal HeightSrc As Long) As Object ' Picture
    Dim interfacedll6 As Object
    Dim serveurdll6 As Object
    On Error GoTo Error
    Set interfacedll6 = CreateObject("madll.ServerInterface")
    Set serveurdll6 = interfacedll6.objGetClassInstance("cls_outils")
    CaptureWindow = serveurdll6.CaptureWindow(hWndSrc, Client, LeftSrc, TopSrc, WidthSrc, HeightSrc)
    Set serveurdll6 = Nothing
    Set interfacedll6 = Nothing
    Exit Function
Error:
    Set serveurdll6 = Nothing
    Set interfacedll6 = Nothing
    Err.Clear
End Function

dans la dll (ou dans un module (marche)
         Public Function CaptureWindow(ByVal hWndSrc As Long, _
            ByVal Client As Boolean, ByVal LeftSrc As Long, _
            ByVal TopSrc As Long, ByVal WidthSrc As Long, _
            ByVal HeightSrc As Long) As Object 'Picture

            Dim hDCMemory As Long
            Dim hBmp As Long
            Dim hBmpPrev As Long
            Dim r As Long
            Dim hDCSrc As Long
            Dim hPal As Long
            Dim hPalPrev As Long
            Dim RasterCapsScrn As Long
            Dim HasPaletteScrn As Long
            Dim PaletteSizeScrn As Long
         Dim LogPal As LOGPALETTE
'On Error GoTo Err23
         ' traitement du device context
         If Client Then
            hDCSrc = GetDC(hWndSrc) ' device context pour la zone client
         Else
            hDCSrc = GetWindowDC(hWndSrc) ' device context pour la fenetre entiere
         End If

         ' créer un memory device context pour la copie
         hDCMemory = CreateCompatibleDC(hDCSrc)
         ' créer une bitmap et la mettre dans le memory DC
         hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
         hBmpPrev = SelectObject(hDCMemory, hBmp)

         ' capturer les propriétés de l'ecran
         RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)
         HasPaletteScrn = RasterCapsScrn And RC_PALETTE
         PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)

         ' si l'ecran a une palette faire une copie et la liberer
         If HasPaletteScrn And (PaletteSizeScrn = 256) Then
            ' faire une copie de la palette
            LogPal.palVersion = &H300
            LogPal.palNumEntries = 256
            r = GetSystemPaletteEntries(hDCSrc, 0, 256, _
                LogPal.palPalEntry(0))
            hPal = CreatePalette(LogPal)
            ' liberer la palette
            hPalPrev = SelectPalette(hDCMemory, hPal, 0)
            r = RealizePalette(hDCMemory)
         End If
         ' copier l'image de l'ecran dans le memory DC
         r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, _
            LeftSrc, TopSrc, vbSrcCopy)
         hBmp = SelectObject(hDCMemory, hBmpPrev)
         ' si l'ecran avait une palette la restaurer
         If HasPaletteScrn And (PaletteSizeScrn = 256) Then
            hPal = SelectPalette(hDCMemory, hPalPrev, 0)
         End If
         ' liberer le device context
         r = DeleteDC(hDCMemory)
         r = ReleaseDC(hWndSrc, hDCSrc)
         ' appeler CreateBitmapPicturepour creer un objet image à partir des handles
         ' bitmap et palette et retourner l'objet picture
         Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
Exit Function
'Err23:
'err.Clear
End Function
     
     
      ' CreateBitmapPicture
      '    - Créer un objet bitmap depuis une image bitmap et une palette
      ' hBmp
      '    - Handle d'une bitmap
      ' hPal
      '    - Handle d'une Palette
      '    - Peut être null si la bitmap n'utilise pas de palette
      ' Resultat
      '    - Un objet picture qui comtient la bitmap
      '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      '
         Public Function CreateBitmapPicture(ByVal hBmp As Long, _
            ByVal hPal As Long) As Object 'Picture

            Dim r As Long
         Dim Pic As PicBmp
         ' IPicture a besoin d'une reference a un "Standard OLE Types"
         Dim IPic As IPicture
         Dim IID_IDispatch As GUID
'On Error GoTo Err24
         ' Renseigner le ID de l'Interface IDispatch
         With IID_IDispatch
            .Data1 = &H20400
            .Data4(0) = &HC0
            .Data4(7) = &H46
         End With

         ' Renseigner Pic
         With Pic
            .Size = Len(Pic)          ' longueur de la structure
            .Type = vbPicTypeBitmap   ' Type de Picture (bitmap)
            .hBmp = hBmp              ' Handle du bitmap
            .hPal = hPal              ' Handle de la palette (peut êtrenull)
         End With

         ' créer un Picture object
         r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

         ' retourner un nouveau objet Picture
         Set CreateBitmapPicture = IPic
Exit Function
'Err24:
'err.Clear
End Function

nota: toutes les autres fonctions de la dll fonctionnent avec ce systeme d'interface (j'aimerais avoir ton opinion)

les types (Instancing, MTSTransactionMode et Persistable) sont les même pour les 2 class.

J'espére que tu vas pouvoir m'aider sans trop te casser la tete
tout le code est a ta disposition.
a+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
30 nov. 2008 à 17:44
salut,

createobject est ASynchronone
que donne la simple référence de ta dll dans le projet?

tu parles de 2 classes, laquelle est quoi?
la moitié de mes questions est restée sans réponse

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
1 déc. 2008 à 00:49
1. les déclarations des fonctions/API utilisées:

      Private Type PALETTEENTRY
         peRed As Byte
         peGreen As Byte
         peBlue As Byte
         peFlags As Byte
      End Type

      Private Type LOGPALETTE
         palVersion As Integer
         palNumEntries As Integer
         palPalEntry(255) As PALETTEENTRY  ' assez pour 256 couleurs
      End Type

      Private Type GUID
         Data1 As Long
         Data2 As Integer
         Data3 As Integer
         Data4(7) As Byte
      End Type
    '------------------------------------------------------------------------
    ' Windows 95 et NT API
    '------------------------------------------------------------------------
         Private Const RASTERCAPS As Long = 38
         Private Const RC_PALETTE As Long = &H100
         Private Const SIZEPALETTE As Long = 104

         Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
         End Type

         Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
            ByVal hdc As Long) As Long
         Private Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
            ByVal hdc As Long, ByVal nWidth As Long, _
            ByVal nHeight As Long) As Long
         Private Declare Function GetDeviceCaps Lib "gdi32" ( _
            ByVal hdc As Long, ByVal iCapabilitiy As Long) As Long
         Private Declare Function GetSystemPaletteEntries Lib "gdi32" ( _
            ByVal hdc As Long, ByVal wStartIndex As Long, _
            ByVal wNumEntries As Long, lpPaletteEntries As PALETTEENTRY) _
            As Long
         Private Declare Function CreatePalette Lib "gdi32" ( _
            lpLogPalette As LOGPALETTE) As Long
         Private Declare Function SelectObject Lib "gdi32" ( _
            ByVal hdc As Long, ByVal hObject As Long) As Long
         Private Declare Function BitBlt Lib "gdi32" ( _
            ByVal hDCDest As Long, ByVal XDest As Long, _
            ByVal YDest As Long, ByVal nWidth As Long, _
            ByVal nHeight As Long, ByVal hDCSrc As Long, _
            ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop As Long) _
            As Long
         Private Declare Function DeleteDC Lib "gdi32" ( _
            ByVal hdc As Long) As Long
       
         Private Declare Function SelectPalette Lib "gdi32" ( _
            ByVal hdc As Long, ByVal hPalette As Long, _
            ByVal bForceBackground As Long) As Long
         Private Declare Function RealizePalette Lib "gdi32" ( _
            ByVal hdc As Long) As Long
         Private Declare Function GetWindowDC Lib "user32" ( _
            ByVal hWnd As Long) As Long
         Private Declare Function GetDC Lib "user32" ( _
            ByVal hWnd As Long) As Long
         Private Declare Function GetWindowRect Lib "user32" ( _
            ByVal hWnd As Long, lpRect As RECT) As Long
         Private Declare Function ReleaseDC Lib "user32" ( _
            ByVal hWnd As Long, ByVal hdc As Long) As Long
'         Private Declare Function GetDesktopWindow Lib "user32" () As Long

         Private Type PicBmp
            Size As Long
            Type As Long
            hBmp As Long
            hPal As Long
            Reserved As Long
         End Type

Private Declare Function OleCreatePictureIndirect _
            Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, _
            ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

2. le nom de la classe de ta dll

cls_outils et  serveur.cls

code de serveur.cls:
Public Function objGetClassInstance(rstrClassName As String) As Object
' Retourne une référence d'objet Automation pour la classe demandée.
' Retourne Nothing en cas d'erreur.
On Error GoTo gciError

Set objGetClassInstance = CreateObject("dll_windoor." & rstrClassName)
GoTo gciExit

gciError:
  objGetClassInstance = Nothing
  Resume gciExit
 
gciExit:
End Function

3. le code complet de ta fonction
4. la déclaration de ta classe au niveau de ton appli
5. la ligne d'appel de ta fonction
6. le type (Instancing, MTSTransactionMode et Persistable) de ta classe

c'est ok
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
1 déc. 2008 à 01:21
Je vais pas pouvoir ce soir, mais demain j'essaye d'instancier simplement cette fonction.
Je te dis ce qu'il en est.

bonne nuit:)
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
1 déc. 2008 à 10:22
j'essaye genre Public Declare Function Nbre_disque Lib "madll.cls_outils" () As Integer mais ça marche pas.
je n'ai pas trouvé comment instancier directement mais j'ai lu (a confirmer) que "VB génère pas des vrai DLL, en fait, ce sont des DLL ActiveX instanciable".
On ne peux donc pas les appeller directement?

J'ai bien peur que pour moi, mettre capture_window dans ma dll reste un defi sans solution.

merci pour ton aide pcpt
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
1 déc. 2008 à 10:51
       CA MARCHE

SET CaptureWindow = ma solution

avec as object ça fait 2 réponses acceptées

2 grands merci

et 2 petite citations:

Des chercheurs qui cherchent,on en trouve mais des chercheurs qui trouvent, on en cherche.

On peut toujours apprendre ce qu'on ne sait pas, non ce qu'on croit savoir.

Citation de Gustave Thibon
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
1 déc. 2008 à 10:56
j'suis trop content en fait
(galérer si longtemp pour si peu, quel prix a payer pour les autodidactes comme moi!)...
...mais j'apprends

merci encore
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2008 à 11:34
salut,

tout est bien qui fini bien

vb ne fait pas de vraies dll, c'est des activex oui.
çà ne l'empêche pas de les ajouter en "


simple référence


", comme j'ai indiqué
projet > références ....
alors la classe s'instancie (enfin pas toute seule ^^), et plus besoin de tes create object. toute ta classe 'serveur' peut alors disparaître, et l'intellisense sera présent

bonne continuation

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
cs_candyraton Messages postés 109 Date d'inscription dimanche 27 juillet 2008 Statut Membre Dernière intervention 2 février 2012 3
3 déc. 2008 à 09:24
en "


simple référence


":

Private Sub Command1_Click()
Dim person1 As New madll.cls_outils
MsgBox person1.Nbre_disque
end sub

ou

 public ou Private person1 As New cls__outils
Private Sub Command1_Click()

MsgBox person1.Nbre_disque

end sub

avantage: pas besoin de classe serveur
              plus rapide?
              accepte d'avoir un grand nbre d'appels vers la même class?

inconvenient:devoir ajouter "perso1." à l'appel de fonction.

ça c'est dur a trouver.
a+
0
Rejoignez-nous