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
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
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
'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! @+
"Christophe" <geo.ch@tiscali.fr> a écrit dans le message de
news:bmeecd$ls4$1@news.tiscali.fr...
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
'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!
@+
"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
'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! @+
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! @+
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" <sundowne@wanadoo.com> a écrit dans le message de news:
#DiAc$akDHA.3312@tk2msftngp13.phx.gbl...
'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!
@+
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! @+
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 !
@+
"Christophe" <geo.ch@tiscali.fr> a écrit dans le message de
news:bmetqt$m5p$1@news.tiscali.fr...
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 !
"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 !
@+
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 !
@+
Bonjour,
Bittabfichier() as long
di& est un long (ubound(array))
Je vais regarder pour le byref byval avec adressof()
Christophe Vergon
"Sundowne" <sundowne@wanadoo.com> a écrit dans le message de news:
#DkwQSnkDHA.3504@TK2MSFTNGP11.phx.gbl...
"Christophe" <geo.ch@tiscali.fr> a écrit dans le message de
news:bmetqt$m5p$1@news.tiscali.fr...
> 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
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