diff --git a/pkgs/racket-doc/scribblings/foreign/com-auto.scrbl b/pkgs/racket-doc/scribblings/foreign/com-auto.scrbl index 06685ea420..1620dad037 100644 --- a/pkgs/racket-doc/scribblings/foreign/com-auto.scrbl +++ b/pkgs/racket-doc/scribblings/foreign/com-auto.scrbl @@ -352,6 +352,29 @@ Racket. (The DLL is the same for all Racket versions.)} Removes any existing callback for @racket[name] in @racket[obj].} +@; ---------------------------------------- + +@section{COM Enumerations} + +@defproc[(com-enumerate-to-list [obj com-object?]) list?]{ + +Produces the elements that @racket[obj] would generate as the +driver of a for-each loop in Visual Basic or PowerShell. + +A call @racket[(com-enumerate-to-list obj)] is equivalent to +@racket[(com-enumeration-to-list (com-get-property obj "_NewEnum"))]. + +@history[#:added "6.2.0.2"]} + + +@defproc[(com-enumeration-to-list [obj com-object?]) list?]{ + +Given a COM object that implements @cpp{IEnumVARIANT}, extracts the +enumerated values into a list. + +@history[#:added "6.2.0.2"]} + + @; ---------------------------------------- @section{Interface Pointers} @@ -381,7 +404,6 @@ interface} extends @cpp{IUnknown}, so @racket[com-iunknown?] returns Returns @racket[#t] if @racket[v] corresponds to an unsafe @cpp{IDispatch}, @racket[#f] otherwise.} - @; ---------------------------------------- @section[#:tag "remote"]{Remote COM servers (DCOM)} diff --git a/racket/collects/ffi/com.rkt b/racket/collects/ffi/com.rkt index 30c3145d9b..be1f5a42c1 100644 --- a/racket/collects/ffi/com.rkt +++ b/racket/collects/ffi/com.rkt @@ -24,6 +24,9 @@ com-unregister-event-callback com-make-event-executor com-event-executor? + com-enumeration-to-list + com-enumerate-to-list + com-object-get-iunknown com-iunknown? com-object-get-idispatch com-idispatch? diff --git a/racket/collects/ffi/unsafe/com.rkt b/racket/collects/ffi/unsafe/com.rkt index c728be74f4..99e873832b 100644 --- a/racket/collects/ffi/unsafe/com.rkt +++ b/racket/collects/ffi/unsafe/com.rkt @@ -61,6 +61,9 @@ com-register-event-callback com-unregister-event-callback + com-enumeration-to-list + com-enumerate-to-list + com-object-get-iunknown com-iunknown? com-object-get-idispatch com-idispatch? @@ -2276,6 +2279,40 @@ (define (com-iunknown? v) (and (IUnknown? v) #t)) (define (com-idispatch? v) (and (IDispatch? v) #t)) +;; ---------------------------------------- +;; Enumerations + +(define IID_IEnumVARIANT + (string->guid "{00020404-0000-0000-c000-000000000046}")) + +(define-com-interface (_IEnumVARIANT _IUnknown) + ([Next (_mfun (_ulong = 1) + (els : (_ptr o _VARIANT)) + (got : (_ptr o _ulong)) + -> (r : _HRESULT) + -> (if (= got 1) + els + #f))] + ;; ... more methods ... + )) + +(define (com-enumeration-to-list obj) + (define i + (QueryInterface (com-object-get-iunknown obj) + IID_IEnumVARIANT + _IEnumVARIANT-pointer)) + (begin0 + (let loop () + (define els (Next i)) + (if (not els) + null + (cons (variant-to-scheme els) + (loop)))) + (Release i))) + +(define (com-enumerate-to-list obj) + (com-enumeration-to-list (com-get-property obj "_NewEnum"))) + ;; ---------------------------------------- ;; Initialize