OVH Cloud OVH Cloud

CreateDIBsection

4 réponses
Avatar
Christophe
Bonjour,

Description du probleme:

A l'interieur d'une classe je crée un objet DIBsection dans un DC en
memoire.

Le code fonctionne un moment et puis au bout d'un certain temps,
createdibsection renvoie 0, et Err.lastddllerror renvoie 87
"invalid parameter"
Or les parametres semblent corrects puisque le code fonctionne "un certain
temps"

Cette erreur apparaissait au bout plusieurs heures d'utilisation, j'ai
aujourd'hui changer une ligne de code (voir le code joint) et l'erreur
apparait beaucoup plus rapidement.

ligne de code modifiée:
j'ai remplacer : redim bittabfichier(0) par erase bittabfichier


Le code:

Private mbi As BITMAPINFO

Public Sub initShadowDIB()
Dim addr&
Dim di As Long


If handleDIBshadow& Then
di = SelectObject(mshadowDC&, OldObject)
di = DeleteObject(handleDIBshadow&)
End If
If mshadowDC& Then
di = RestoreDC(mshadowDC&, mSaveShadowDC&)
di = DeleteDC(mshadowDC&)
End If

'cree un DC compatible avec l'écran
'init dibsection

mshadowDC& = CreateCompatibleDC&(0&)
mSaveShadowDC = SaveDC(mshadowDC&)
Err.Clear
handleDIBshadow& = CreateDIBSection(mshadowDC&, mbi, DIB_RGB_COLORS, addr&,
0, 0)
If handleDIBshadow& = 0 Then
Debug.Print "pas de handle"
Hex (87)
End If
mOldObject& = SelectObject(mshadowDC&, handleDIBshadow&)

'initialise les couleurs

Select Case mbi.bmiHeader.biBitCount
Case 1
di& = SetDIBColorTable(mshadowDC&, 0, 2, colorarray(0))
Case 4
di& = SetDIBColorTable(mshadowDC&, 0, 16, colorarray(0))
Case 8
di& = SetDIBColorTable(mshadowDC&, 0, 256, colorarray(0))
End Select

'transfert les données
di& = UBound(bittabfichier) + 1
CopyMemory ByVal addr&, bittabfichier(0), di&
Erase bittabfichier
'initialise l'Espace reel du bitmap
setEspaceBitmap

End Sub

Merci de vous pencher sur la question

4 réponses

Avatar
Sundowne
"Christophe" a écrit dans le message de
news:bmeecd$ls4$
Bonjour,

Description du probleme:

A l'interieur d'une classe je crée un objet DIBsection dans un DC en
memoire.

Le code fonctionne un moment et puis au bout d'un certain temps,
createdibsection renvoie 0, et Err.lastddllerror renvoie 87
"invalid parameter"
Or les parametres semblent corrects puisque le code fonctionne "un certain
temps"

Cette erreur apparaissait au bout plusieurs heures d'utilisation, j'ai
aujourd'hui changer une ligne de code (voir le code joint) et l'erreur
apparait beaucoup plus rapidement.

ligne de code modifiée:
j'ai remplacer : redim bittabfichier(0) par erase bittabfichier


Le code:

Private mbi As BITMAPINFO

Public Sub initShadowDIB()
Dim addr&
Dim di As Long


If handleDIBshadow& Then
di = SelectObject(mshadowDC&, OldObject)
di = DeleteObject(handleDIBshadow&)
End If
If mshadowDC& Then
di = RestoreDC(mshadowDC&, mSaveShadowDC&)
di = DeleteDC(mshadowDC&)
End If

'cree un DC compatible avec l'écran
'init dibsection

mshadowDC& = CreateCompatibleDC&(0&)
mSaveShadowDC = SaveDC(mshadowDC&)
Err.Clear
handleDIBshadow& = CreateDIBSection(mshadowDC&, mbi, DIB_RGB_COLORS,


addr&,
0, 0)
If handleDIBshadow& = 0 Then
Debug.Print "pas de handle"
Hex (87)
End If
mOldObject& = SelectObject(mshadowDC&, handleDIBshadow&)

'initialise les couleurs

Select Case mbi.bmiHeader.biBitCount
Case 1
di& = SetDIBColorTable(mshadowDC&, 0, 2, colorarray(0))
Case 4
di& = SetDIBColorTable(mshadowDC&, 0, 16, colorarray(0))
Case 8
di& = SetDIBColorTable(mshadowDC&, 0, 256, colorarray(0))
End Select

'transfert les données
di& = UBound(bittabfichier) + 1
CopyMemory ByVal addr&, bittabfichier(0), di&
Erase bittabfichier
'initialise l'Espace reel du bitmap
setEspaceBitmap

End Sub

Merci de vous pencher sur la question






'jour
Je pense que le pb reside dans la déclaration de l'API CopyMemor, un
grand classique de ce style de pb : Les param sont-ils passés byref ou byval
? Cela correspond-t-il à la maniére dont tu utilises l'API?
Cherches dans cette voie!
@+
Avatar
Christophe
Re,

Je declare copymemory comme suit:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef
pDst As Any, ByRef pSrc As Any, ByVal ByteLen As Long)

il est vrai que j'utilise ensuite

CopyMemory ByVal addr&, bittabfichier(0), di&

Mais l'erreur se situe au niveau de creatdibsection qui echoue
car addr& contient l'adresse du bloc de données bitmap si je passe addr& by
ref je passe l'adresse de la variable addr& et pas la valeur de addr& qui
elle est l'adresse du bloc de données.

Je pense pas que ça vient de là

Christophe vergon

"Sundowne" a écrit dans le message de news:
#DiAc$



'jour
Je pense que le pb reside dans la déclaration de l'API CopyMemor, un
grand classique de ce style de pb : Les param sont-ils passés byref ou


byval
? Cela correspond-t-il à la maniére dont tu utilises l'API?
Cherches dans cette voie!
@+




Avatar
Sundowne
"Christophe" a écrit dans le message de
news:bmetqt$m5p$
Re,

Je declare copymemory comme suit:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef
pDst As Any, ByRef pSrc As Any, ByVal ByteLen As Long)

il est vrai que j'utilise ensuite

CopyMemory ByVal addr&, bittabfichier(0), di&

Mais l'erreur se situe au niveau de creatdibsection qui echoue
car addr& contient l'adresse du bloc de données bitmap si je passe addr&


by
ref je passe l'adresse de la variable addr& et pas la valeur de addr& qui
elle est l'adresse du bloc de données.

Je pense pas que ça vient de là

Christophe vergon





'Jour
RtlMoveMemory conduit à de très curieuses erreurs aux effets totalement
imprédictibles, même s'il est vrai que le plantage survient en général
rapidement !
Ceci dit la déclaration que tu donnes de CopyMemory me semble tout à
fait incorrecte !
L'array bittabfichier(0) doit être un long puisque tu le copie dans
addr&. Est-ce bien le cas ?
La valeur affectée à di& est-elle bien un long ?
Ne compte pas sur le transtypage de VB dans ces cas !
Enfin et surtout , il me semble qu'il y a un pb sur le premier paramétre
déclaré byref que tu passes ensuite byval !

@+
Avatar
Christophe
Bonjour,

Bittabfichier() as long
di& est un long (ubound(array))

Je vais regarder pour le byref byval avec adressof()

Christophe Vergon



"Sundowne" a écrit dans le message de news:
#

"Christophe" a écrit dans le message de
news:bmetqt$m5p$
> Re,
>
> Je declare copymemory comme suit:
>
> Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"


(ByRef
> pDst As Any, ByRef pSrc As Any, ByVal ByteLen As Long)
>
> il est vrai que j'utilise ensuite
>
> CopyMemory ByVal addr&, bittabfichier(0), di&
>
> Mais l'erreur se situe au niveau de creatdibsection qui echoue
> car addr& contient l'adresse du bloc de données bitmap si je passe addr&
by
> ref je passe l'adresse de la variable addr& et pas la valeur de addr&


qui
> elle est l'adresse du bloc de données.
>
> Je pense pas que ça vient de là
>
> Christophe vergon
>


'Jour
RtlMoveMemory conduit à de très curieuses erreurs aux effets


totalement
imprédictibles, même s'il est vrai que le plantage survient en général
rapidement !
Ceci dit la déclaration que tu donnes de CopyMemory me semble tout à
fait incorrecte !
L'array bittabfichier(0) doit être un long puisque tu le copie dans
addr&. Est-ce bien le cas ?
La valeur affectée à di& est-elle bien un long ?
Ne compte pas sur le transtypage de VB dans ces cas !
Enfin et surtout , il me semble qu'il y a un pb sur le premier


paramétre
déclaré byref que tu passes ensuite byval !

@+