avicap32
ldci17-Jan-2012/14:56:38+1:00
Salut à tous
j'ai besoin de créer en rebol cette fonction issue de la avicap32.dll

BOOL VFWAPI capGetDriverDescription(
WORD wDriverIndex,
LPTSTR lpszName,
INT cbName,
LPTSTR lpszVer,
INT cbVer
);

Comme lpszName et lpszVer sont des pointeurs sur une chaine de longeur N (cbName et cbVersion), j'ai conçu la routine comme suit

capGetDriverDescription: make routine! [
   wDriverIndex [integer!]
   lpszName [string!]
   cbName [struct![len [integer!]]]
   lpszVer [string!]
   cbVer [struct![len [integer!]]]
   return: [integer!]
] avicap32.dll "capGetDriverDescriptionA"

ensuite je crée mes variables

szDeviceName: copy ""
insert/dup szDeviceName " " 80
szDeviceVersion: copy ""
insert/dup szDeviceVersion " " 80

cbName: make struct! [
   len [integer!]
] [80]

cbVer: make struct! [
   len [integer!]
] [80]

mais l'appel "capGetDriverDescription 0 szDeviceName cbName szDeviceVersion cbVer" plante Rebol

Qui aurait une idée lumineuse?
DocKimbel18-Jan-2012/14:36:10+1:00
Salut François,

cBName et cbVer sont définis comme "INT", tu devrais simplement les déclarer comme [integer!] dans l'entête de la routine au lieu de struct!.
ldci19-Jan-2012/10:05:46+1:00
Yep parfait
Merci Doc
ldci23-Jan-2012/17:05:35+1:00
Salut à tous
J'ai quasiment terminé une version complète de avicap.r qui permet d'accéder aux webcams sous windows avec Rebol
Le seul point qui me reste à régler est un problème de callback
exemple

; for Callback: to be tested
capSetCallbackOnError: func [
   "The capSetCallbackOnError macro sets an error callback function in the client application. AVICap calls this procedure when errors occur."
   hwnd [integer!] fpProc [integer! integer! integer!]]
   [SendMessage hwnd WM_CAP_SET_CALLBACK_ERROR 0 fpProc
]

fpProc designe une fonction qui être passée comme paramètre à SendMessage
ex:
statusCallbackProc: func [hWnd nID lpStatusText]
[
   ;hWnd: Application main window handle
   ;nID: Status code for the current status
   ;lpStatusText: Status text string for the current status
   
   if not hWnd [ return 0]
   if to-integer nID == 0 [ ;Clear old status messages
    hwndSetTitle: getFocus
            setWindowText hwndSetTitle appName
    return 1]
   
   probe lpsz
   return 1
]
l'appel capSetCallbackOnStatus hWndC StatusCallbackProc me renvoie bien 1 ce qui signifie qu'il n' y a pas d'erreur , mais lpStatusText n'est pas correct

Qui a une idée de comment passer en rebol une fonction qui sera "called back" par la dll ett récupérer les modifications ?

Merci d'avance
DocKimbel23-Jan-2012/21:58:26+1:00
Salut François,

Tu as une solution possible décrite ici: http://www.rebol.com/article/0141.html
ldci23-Jan-2012/22:33:08+1:00
Salut Nenad
Je connais cette référence, mais pas clair : marche en R2 ou en R3? En R2 rebol ne connait pas callback.
A +
DocKimbel23-Jan-2012/22:55:32+1:00
C'est pour R2, mais /Core n'est pas suffisant, personnellement j'utilise rebcmdview et ça passe sans problème (je pense que ça doit passer aussi avec rebpro, pas sûr pour rebview).
ldci29-Jan-2012/19:53:18+1:00
Toujours pour la vidéo
comme documenté par Nick Antonaccio quand on utilise la lib user32.dll on peut créer une windows pour visualiser la vidéo comme dans la fonction suivante après avoir créé un layout rebol qui contiendra cette fenêtre
; make a rebol window for video
makeWindow: does [
   hwndSetTitle: getFocus
   setWindowText hwndSetTitle vAppName
   hwnd: findWindow "REBOLwind" vAppName
   hWndC: capCreateCaptureWindow vAppName to-integer (WS_CHILD OR WS_VISIBLE) 5 5 320 240 hwnd 0
   return hWndC
]

Ca marche bien , mais j'aimerais renvoyer la fenêtre créée par l'appel DLL dans une face rebol comme une box ou une image.
Pourrait on faire pointer le hwnd (de type integer) sur une face Rebol?
DocKimbel30-Jan-2012/1:30:28+1:00
A ma connaissance, non, car les faces ont une structure purement interne à View et n'utilise a priori pas l'API Windows pour le rendu de leur contenu (afin de rendre View le moins dépendant possible de l'OS). Donc aucune handle hwnd n'existe pour les faces, car ce ne sont pas des fenêtres créées par un CreateWindow() ou dérivé.
jocko30-Jan-2012/8:31:23+1:00
tu dois pouvoir vérifier si ces faces sont des objets windows avec un handle, il existe des outils pour celà, et si c'est le cas, tu pourras utiliser des fonctions de l'API windows pour les récupérer
ldci30-Jan-2012/12:43:28+1:00
Merci à tous les deux pour votre réponse
A+
DocKimbel30-Jan-2012/19:44:39+1:00
Je viens de faire un test rapide avec l'outil Spy++ de Microsoft, la fenêtre View est visible, avec un hwnd, mais elle n'a aucune structure fille...
ldci30-Jan-2012/21:24:49+1:00
@docKimbel
Je confirme : j'ai regardé avec MS Object Inspect. On obtient les informations sur la fenêtre et ses caractéristique, mais pas de structure fille.
C'est dommage car l'idée était de renvoyer la vidéo dans une face rebol pour bénéficier les capacités de traitement graphique de la face pour faire des incrustations de texte par exemple.

A propos sous windows
get-modes system/ports/system get-modes system/ports/system 'system-modes
renvoie des infos intéréssantes
[window: 722434 winmsg: [] tray: none endian: little]
notamment un handle sur la fenêtre et une intereception possible des messages system de Windows (winmsg)
A +
DocKimbel30-Jan-2012/21:57:43+1:00
Oui, le handle de la fenêtre est dispo, mais il est probable que ce ne soit que celui de la console REBOL (qui est créé même si elle est non affichée). De même, l'interception des messages Windows se fait au niveau la boucle d'évènements de la console (de mémoire).

Pour l'intégration de la video, tu peux peut-être tenter de la rediriger vers le fond d'une fenêtre View et afficher du texte par dessus via une face transparente...
shadwolf31-Jan-2012/3:25:06+1:00
aaaaaaaaaaaaaaaaaaaaaaaah tiens le premier pas vers la décompilation de rebol/view est en marche !!!


bravo!!! aaaaaaah bas les blops binaires nous privant de la joie de regarder comment c'est fait dedans (d'ailleurs la décompilation est légale en france il me semble...)

heu puis je cependnat emmettre une hypothèse ? Vous avez utiliser des outils de debuggage sur des binaires compilés sans mode debuggage... il est logique de ne rien voir...
jocko31-Jan-2012/8:40:01+1:00
Il ne s'agit pas d'outils de désassemblage du code, mais d'outils externes d'observation des fenêtres et autres objets d'un programme en fonctionnement.
ldci31-Jan-2012/9:39:57+1:00
@jocko: tout à fait d'accord.
@docKimbel: bonne idée mais malheureusement la vidéo reste en avant plan et la face ajoutée passe derrière.
@shadwolf: il y a encore des gens qui sont contents avec rebol 2 et qui continuent de faire de jolies choses sans vouloir forcément décompiler REBOL.
Ceci étant quand le programme devient complexe (dans mon cas couplage de caméras vidéo, de caméras thermiques et des signaux physiologiques) il est normal de vouloir chercher à optimiser le code notamment en passant par les dll windows.
shadwolf1-Feb-2012/6:36:27+1:00
ldci on est quand meme en ce moment dans le "worst case scenario" non ?

J'avait evoqué il ya quelques années cette eventualité (cad l'abandon du dev de rebol par carl )

Moi red ne me convainc pas comme successeur de rebol je sais que dock fait de son mieux voir qu'il fait des exploits. un rebol compilable a été longtemps un reve ...mais en meme temps c'est trop complexe pour que la communauté de hobbihistes que nous sommes contribuent... et pourtant il y a un essaie d'implémentation de gtk+ ou sdl dans red il me semble... red est trop obscure et c'est pas forcement a dock de faire la documentation d'ailleurs... bref moi la partie de rebol qui m'a sutout motivée c'est vid ... et parse meme si je suis complétement nul en parse ce qui me fait triper c'est que ne comprennat pas le code que je copie colle les 3 quart du temps j'arrive a avoir quelque chose qui fonctionne (area-tc est née d'un copier coller habile de color-syntaxe.r et d'une intuission de ma part parse doit pouvoir cracher du code dynamique pour agg )... c'est comme ca que je fonctionne.

avec red je comprend absolument rien ...

Pour ce qui est de R2 oaui malheureusement y aque pour ce que je veux faire (viva-rebol) que rebol 2 est plain de bugs.

Il me semble peu cohérent de voir le handle de la fenetre et rien d'autre ... les boutons sont pas désinée avec agg a la volée il me semble.

bref ceci dit j'ai propose de rachetter les sources de rebol a carl puisqu'il en a plus rien a battre. ou carement de reponjdre a son dedain par le notre en decompilant rebol.exe histoire de lui montrer c'est quoi une revolution en bon et due forme.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2