OVH Cloud OVH Cloud

récupérer des ressources

13 réponses
Avatar
scraper
bonjour à tous !

une question :

comment peut on récupérer et utiliser des ressources stockées dans les dll
systeme ??

par exemple, j'aimerais bien intégrer à mon projet l'AVI 256/1036 qui est
stocké dans shdocvw.dll


comment dois je procéder ?

merci de toute aide ... :-)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper

10 réponses

1 2
Avatar
François Picalausa
Hello,

Il y a un exemple sur la KB:
http://support.microsoft.com/default.aspx?kbid3668

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"scraper" a écrit dans le message de
news:
comment peut on récupérer et utiliser des ressources stockées dans
les dll systeme ??

par exemple, j'aimerais bien intégrer à mon projet l'AVI 256/1036 qui
est stocké dans shdocvw.dll


Avatar
scraper
Salut à François Picalausa qui dans son post
news:
nous a écrit/répondu :

Hello,

Il y a un exemple sur la KB:
http://support.microsoft.com/default.aspx?kbid3668



merci !

effectivement, c'est en plein dedans !

... mais j'ai pas réussi à exploiter le truc ??

en fait, je voudrais que l'avi joue sur une form que j'ai créée, à un
endroit bien spécifique, et non pas sur une fenêtre séparée ?

ce me semble bien au dessus de mes possibilités :-(

n'y aurait il pas moyen, à défaut, de placer l'avi dans un fichier res, et
de l'extraire à la demande ?
(si possible pas en écrivant un fichier temp .... ça, je sais faire :-)

disons, le charger en mémoire, et l'utiliser direct ?

le lien que tu m'as indiqué en parle, mais j'ai pas tout compris ... de loin
! lol

merci :-)




--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
Paskal
Bonjour scraper,


peut-être en y accédant d'une autre façon ?

Par exemple, cette source est accessible via un lien res:

exemple :
<html>
<img dynsrc="res://C:WINDOWSsystem32shdocvw/avi/#256/#1036" loop="-1">
</html>

Te joueras cette vidéo dans un document html, en l'extrayant directement de
la dll.

Ce doit très probablement être exploitable en vb...


--
@+
Paskal (MVP)
http://www.faqOE.com





Hello,

Il y a un exemple sur la KB:
http://support.microsoft.com/default.aspx?kbid3668



merci !

effectivement, c'est en plein dedans !

... mais j'ai pas réussi à exploiter le truc ??

en fait, je voudrais que l'avi joue sur une form que j'ai créée, à un
endroit bien spécifique, et non pas sur une fenêtre séparée ?

ce me semble bien au dessus de mes possibilités :-(

n'y aurait il pas moyen, à défaut, de placer l'avi dans un fichier
res, et de l'extraire à la demande ?
(si possible pas en écrivant un fichier temp .... ça, je sais faire
:-)

disons, le charger en mémoire, et l'utiliser direct ?

le lien que tu m'as indiqué en parle, mais j'ai pas tout compris ...
de loin ! lol

merci :-)


Avatar
scraper
Bonjour Paskal ... dans le message
news:
tu nous dit :

Bonjour scraper,


peut-être en y accédant d'une autre façon ?

Par exemple, cette source est accessible via un lien res:

exemple :
<html>
<img dynsrc="res://C:WINDOWSsystem32shdocvw/avi/#256/#1036"
loop="-1"> </html>

Te joueras cette vidéo dans un document html, en l'extrayant
directement de la dll.

Ce doit très probablement être exploitable en vb...



sais pas ...

en tout cas, je connais cet AVI ! lol

mais le fonds rose ? beuââârk ...

bon, si vous connaissez une façon de faire, ce serait sympa !

j'ai pour l'instant intégré cet AVI à un fichier ressource intégré à mon
projet
lorsque j'en ai besoin, je suis obligé de créer un fichier dans un rep'
temporaire ....
n'y a t il vraiment aucun autre moyen ?

merci à tous ...



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
François Picalausa
Hello,

C'est exploitable dans un contrôle webbrowser..
Il est aussi possible d'enregistrer la ressource dans un fichier qui sera
joué après.
lpData dans la fiche est un pointeur vers les données
fileSize est la taille de la ressources

Pour récupérer les données on pourrait commencer par redimensionner un
tableau de bytes de la taille de la ressource:
Dim Data() As Byte
Redim Data(fileSize-1)

Ensuite copier les données à partir du pointeur via CopyMemory:
CopyMemory Data(0), ByVal lpData, fileSize

Et quand on a le tableau, on peut l'écrire vers un fichier:
Dim FFN as Integer

Open "c:toto.avi" For Binary As FFN
Put FFN,, Data
Close FFN

ceci à la place du "Call mmioInstallIOProc"

Ce bout de code n'a absolument pas été testé et donc pourrait planter VB
(notament le CopyMemory.. qu'il faut de toutes façons revérifier une
trentaine de fois pour être certain qu'aucune copie vers de la mémoire
exécutable ne soit possible)

Il doit aussi être possible de jouer l'AVI directement dans un contrôle du
type mci, peut être via les API...
Ou peut être via un contrôle de type "animation"
Sur http://ccrp.mvps.org/ un contrôle de ce type est dispo et il "Support
for loading resources from a DLL"... a voir donc ;-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Paskal" a écrit dans le message
de news:
Par exemple, cette source est accessible via un lien res:

exemple :
<html>
<img dynsrc="res://C:WINDOWSsystem32shdocvw/avi/#256/#1036"
loop="-1"> </html>

Te joueras cette vidéo dans un document html, en l'extrayant
directement de la dll.
Il y a un exemple sur la KB:
http://support.microsoft.com/default.aspx?kbid3668



en fait, je voudrais que l'avi joue sur une form que j'ai créée, à un
endroit bien spécifique, et non pas sur une fenêtre séparée ?




Avatar
Paskal
Bonjour François.



C'est exploitable dans un contrôle webbrowser..
Il est aussi possible d'enregistrer la ressource dans un fichier qui sera
joué après.
lpData dans la fiche est un pointeur vers les données
fileSize est la taille de la ressources



Brr...
Le but serait justement d'éviter d'intégrer des resources qui sont déjà sur
la machine du client (windows), en outre, en jouant l'animation de la dll du
système, celle-ci sera toujours 'à jour' si demain cette animation
changeait...


Pour récupérer les données on pourrait commencer par redimensionner un
tableau de bytes de la taille de la ressource:
Dim Data() As Byte
Redim Data(fileSize-1)

Ensuite copier les données à partir du pointeur via CopyMemory:
CopyMemory Data(0), ByVal lpData, fileSize

Et quand on a le tableau, on peut l'écrire vers un fichier:
Dim FFN as Integer

Open "c:toto.avi" For Binary As FFN
Put FFN,, Data
Close FFN

ceci à la place du "Call mmioInstallIOProc"

Ce bout de code n'a absolument pas été testé et donc pourrait planter VB
(notament le CopyMemory.. qu'il faut de toutes façons revérifier une
trentaine de fois pour être certain qu'aucune copie vers de la mémoire
exécutable ne soit possible)

Il doit aussi être possible de jouer l'AVI directement dans un contrôle du
type mci, peut être via les API...



Ou peut être via un contrôle de type "animation"
Sur http://ccrp.mvps.org/ un contrôle de ce type est dispo et il "Support
for loading resources from a DLL"... a voir donc ;-)



C'est cette dernière solution qui a retenu mon attention : simple et rapide
à mettre en place avec le contrôle ocx (76Ko) ccrpAnimation qui permet tout
simplement de jouer l'animation de n'importe quelle dll.

Soit, dans le cas de scraper :

ccrpAnimation1.AutoSize = True
ccrpAnimation1.BackColor = &H8000000F 'Couleur sommet du bouton
ccrpAnimation1.BorderStyle = aniNone
ccrpAnimation1.BackStyle = aniTransparent 'Pour éviter le fond violet ;-)
ccrpAnimation1.OpenAVIResourceFromDLL 256, "C:WINDOWSsystem32shdocvw.dll"
' 256= ResID de l'animation dans la dll

Merci François !


--
@+
Paskal (MVP)
http://www.faqOE.com
Avatar
scraper
Bonjour Paskal ... dans le message
news:
tu nous dit :

Brr...
Le but serait justement d'éviter d'intégrer des resources qui sont
déjà sur la machine du client (windows), en outre, en jouant
l'animation de la dll du système, celle-ci sera toujours 'à jour' si
demain cette animation changeait...



voui, exact, tu as bien compris ma motivation ...

Ce bout de code n'a absolument pas été testé et donc pourrait
planter VB (notament le CopyMemory.. qu'il faut de toutes façons
revérifier une trentaine de fois pour être certain qu'aucune copie
vers de la mémoire exécutable ne soit possible)





euh ... pas encore eu le temps de m'y mettre !
peut être la semaine prochaine ?

je reviendrai vous tenir informés ! :-)



C'est cette dernière solution qui a retenu mon attention : simple et
rapide à mettre en place avec le contrôle ocx (76Ko) ccrpAnimation
qui permet tout simplement de jouer l'animation de n'importe quelle
dll.

Soit, dans le cas de scraper :

ccrpAnimation1.AutoSize = True
ccrpAnimation1.BackColor = &H8000000F 'Couleur sommet du bouton
ccrpAnimation1.BorderStyle = aniNone
ccrpAnimation1.BackStyle = aniTransparent 'Pour éviter le fond violet
;-) ccrpAnimation1.OpenAVIResourceFromDLL 256,
"C:WINDOWSsystem32shdocvw.dll" ' 256= ResID de l'animation dans la
dll



ah oui,mais là non !

entre intégrer un AVI de 10 Ko à un fichier res, et embarquer dans le projet
un ocx de 76 Ko, plus enregistrement, etc ... AMHA y'a pas photo !

cette solution ne m'emballe pas !

Merci François !



ça, de toutes façons oui, merci François :-)



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
Avatar
François Picalausa
Hello,

entre intégrer un AVI de 10 Ko à un fichier res, et embarquer dans le
projet un ocx de 76 Ko, plus enregistrement, etc ... AMHA y'a pas
photo !



Peut-être utilises-tu déjà Microsoft Windows Common Controls-2 6.0 ?
Dans ce cas, tu pourrais placer un contrôle Animation et utiliser le code
suivant:
Option Explicit

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) _
As Long
Private Declare Function LoadLibrary _
Lib "kernel32" _
Alias "LoadLibraryA" _
( _
ByVal lpLibFileName As String _
) _
As Long
Private Declare Function FreeLibrary _
Lib "kernel32" _
( _
ByVal hLibModule As Long _
) _
As Long

Private Const WM_USER = &H400
Private Const ACM_OPEN = (WM_USER + 100)
Private Const ACM_PLAY = (WM_USER + 101)
Private Const ACM_STOP = (WM_USER + 102)

Private hIEDLLInstance As Long

Private Sub Form_Initialize()
'De préférence, ne pas utiliser un chemin absolu statique
'comme "C:WINDOWSsystem32shdocvw.dll" :
'System32 pourrait être sur d:
'GetSystemDirectory pour un path absolu
'ou un path très relatif:
hIEDLLInstance = LoadLibrary("shdocvw.dll")
End Sub

Private Sub Form_Load()
Animation1.AutoPlay = True
SendMessage Animation1.hWnd, _
ACM_OPEN, _
hIEDLLInstance, _
ByVal MAKEINTRESOURCE(256)

End Sub

Private Function MAKEINTRESOURCE(i As Integer) As Long
MAKEINTRESOURCE = &HFFFF& And i
End Function

Private Sub Form_Terminate()
FreeLibrary hIEDLLInstance
End Sub

'*******************

Si tu n'embarque pas ce contrôle, il est possible de se servir directement
de commctl32.dll
Cette dll étant redistribuée avec windows, il y a peu de chances qu'elle ne
soit pas présente sur le système ;-)
Dans ce cas, le code est un rien plus long:
Option Explicit

Private Const WM_USER = &H400

Private Const ANIMATE_CLASSA = "SysAnimate32"
Private Const ANIMATE_CLASS = ANIMATE_CLASSA
Private Const ICC_ANIMATE_CLASS = &H80 ' animate

Private Const WS_CHILD = &H40000000
Private Const SW_SHOW = 5

Private Enum SWP
SWP_FRAMECHANGED = &H20
SWP_DRAWFRAME = SWP_FRAMECHANGED
SWP_NOZORDER = &H4
SWP_NOSIZE = &H1
End Enum

Private Enum ACM
ACM_OPEN = (WM_USER + 100)
ACM_PLAY = (WM_USER + 101)
ACM_STOP = (WM_USER + 102)
End Enum

Private Enum ACS
ACS_CENTER = &H1
ACS_TRANSPARENT = &H2
ACS_AUTOPLAY = &H4
ACS_TIMER = &H8 'don't use threads... use timers
End Enum

Private Type INITCOMMONCONTROLSEXS
dwSize As Long
dwICC As Long
End Type

Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any _
) _
As Long
Private Declare Function LoadLibrary _
Lib "kernel32" _
Alias "LoadLibraryA" _
( _
ByVal lpLibFileName As String _
) _
As Long
Private Declare Function FreeLibrary _
Lib "kernel32" _
( _
ByVal hLibModule As Long _
) _
As Long
Private Declare Function CreateWindowEx _
Lib "user32" _
Alias "CreateWindowExA" _
( _
ByVal dwExStyle As Long, _
ByVal lpClassName As String, _
ByVal lpWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal hMenu As Long, _
ByVal hInstance As Long, _
lpParam As Any _
) _
As Long
Private Declare Function DestroyWindow _
Lib "user32" _
( _
ByVal hwnd As Long _
) _
As Long
Private Declare Function InitCommonControlsEx _
Lib "comctl32" _
( _
lpInitCtrls As INITCOMMONCONTROLSEXS _
) _
As Long
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Declare Function ShowWindow _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long _
) _
As Long

Private hIEDLLInstance As Long
Private AnimWND As Long

Private Sub Form_Initialize()
'Initialisation des common controls
Dim InitComCtl As INITCOMMONCONTROLSEXS
InitComCtl.dwICC = ICC_ANIMATE_CLASS
InitComCtl.dwSize = LenB(InitComCtl)
InitCommonControlsEx InitComCtl

'Ouvre le dll en vue de lire la ressource
hIEDLLInstance = LoadLibrary("shdocvw.dll")
End Sub

Private Sub Form_Load()
'Crée la fenêtre d'animation
'ACS_AUTOPLAY : démarrer l'animation automatiquement
'ACS_TRANSPARENT : transparence de l'animation
'WS_CHILD : la fenêtre est fille de notre form
AnimWND = Animate_Create(Me.hwnd, 0, ACS_AUTOPLAY Or ACS_TRANSPARENT Or
WS_CHILD, App.hInstance)

'Repositionne l'animation en 10,20
SetWindowPos AnimWND, 0, 10, 20, _
0, 0, _
SWP_NOZORDER Or SWP_DRAWFRAME Or SWP_NOSIZE

'Ouvre l'animation à partir de la dll
Animate_OpenEx AnimWND, _
hIEDLLInstance, _
MAKEINTRESOURCE(256)

'Affiche l'animation
ShowWindow AnimWND, SW_SHOW
End Sub

Private Sub Form_Terminate()
DestroyWindow AnimWND
FreeLibrary hIEDLLInstance
End Sub

'Macros pour la classe animate

Private Function Animate_Create(hwndP As Long, id As Long, dwStyle As Long,
hInstance As Long) As Long
Animate_Create = CreateWindow(ANIMATE_CLASS, vbNullString, _
dwStyle, 0, 0, 0, 0, hwndP, id, hInstance, 0)
End Function

Private Function Animate_Open(hwnd As Long, szName As String) As Boolean
Animate_Open = SendMessage(hwnd, ACM_OPEN, 0, ByVal szName)
End Function

Private Function Animate_OpenEx(hwnd As Long, hInst As Long, szName As Long)
As Boolean
Animate_OpenEx = SendMessage(hwnd, ACM_OPEN, hInst, ByVal szName)
End Function

Private Function Animate_Play(hwnd As Long, from As Long, dwTo As Long, rep
As Long) As Boolean
Animate_Play = SendMessage(hwnd, ACM_OPEN, hInst, ByVal szName)
End Function

Private Function Animate_Stop(hwnd As Long) As Boolean
Animate_Stop = SendMessage(hwnd, ACM_STOP, 0, ByVal 0&)
End Function

Private Function Animate_Close(hwnd As Long) As Boolean
Animate_Close = Animate_Open(hwnd, vbNullString)
End Function

Private Function Animate_Seek(hwnd As Long, frame As Long) As Boolean
Animate_Close = Animate_Play(hwnd, frame, frame, 1)
End Function

'Helpers
Private Function MAKEINTRESOURCE(i As Integer) As Long
MAKEINTRESOURCE = &HFFFF& And i
End Function

Private Function MAKELONG(wLow As Integer, wHigh As Integer) As Long
MAKELONG = (&HFFFF& And wLow) Or (wHigh * &H10000)
End Function

Function CreateWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String, _
ByVal dwStyle As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hWndParent As Long, _
ByVal hMenu As Long, _
ByVal hInstance As Long, _
ByVal lpParam As Long)

CreateWindow = CreateWindowEx( _
0&, _
lpClassName, _
lpWindowName, _
dwStyle, _
x, _
y, _
nWidth, _
nHeight, _
hWndParent, _
hMenu, _
hInstance, _
ByVal lpParam)
End Function

Pour obtenir les notifications ACN_START et/ou ACN_STOP, il faudrait sous
classer la form et récupérer les messages WM_COMMAND.

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net
Avatar
Paskal
Bonjour François Picalausa,


Si tu n'embarque pas ce contrôle, il est possible de se servir
directement de commctl32.dll
Cette dll étant redistribuée avec windows, il y a peu de chances
qu'elle ne soit pas présente sur le système ;-)
Dans ce cas, le code est un rien plus long:
Option Explicit




<copie>....</copie>

Ca fonctionne impec...
BRAVO !!


--
@+
Paskal
Avatar
scraper
Bonjour Paskal ... dans le message
news:
tu nous dit :

Bonjour François Picalausa,


Si tu n'embarque pas ce contrôle, il est possible de se servir
directement de commctl32.dll
Cette dll étant redistribuée avec windows, il y a peu de chances
qu'elle ne soit pas présente sur le système ;-)
Dans ce cas, le code est un rien plus long:
Option Explicit




<copie>....</copie>

Ca fonctionne impec...
BRAVO !!



hello !

bon, s'il le dit !

François, je te remercie du fonds du coeur pour ton aide .... mais
malheureusement j'ai pas eu le temps de tester, et ne le pourrai pas avant
le milieu de semaine prochaine ....

dès que je fais ça, je te tiens de toutes façons au courant ...

merci encore !

Paskal .... tu avais dit 15 jours sans ordi, ou j'avais mal compris ? lol

à +



--

Attention ! Adresse mail invalide ...
Pour me contacter, cliquez sur le lien ci-dessous:
http://scraper.chez.tiscali.fr/contact.htm

scraper
1 2