Hello,
I am working with comtypes to interface Microsoft's DirectShow library.
First, I found a Type Library on the internet that was created for
accessing DirectShow from .NET. It seems that DirectShow only comes
with IDL files and no type library.
This got me started.
The following line imports the typelibrary and automatically generates
a wrapper module for DirectShow.
ds = comtypes.client.GetModule('DirectShow.tlb')
Next, I can basically start with something like this:
graph = comtypes.CoCreateInstance(CLSID_FilterGraph, ds.IGraphBuilder,
comtypes.CLSCTX_INPROC_SERVER)
I had to create the CLSID_FilterGraph parameter myself by doing the
following:
CLSID_FilterGraph =
comtypes.GUID('{e436ebb3-524f-11ce-9f53-0020af0ba770}')
One of the first issues I ran into was that the type library I found on
the web didn't expose the IMediaControl interface. So, using the
generated wrapper as a template, I created my own wrapper:
class IMediaControl(comtypes.IUnknown):
_case_insensitive_ = True
_iid_ = comtypes.GUID('{56A868B1-0AD4-11CE-B03A-0020AF0BA770}')
_idlflags_ = []
IMediaControl._methods_ = [
COMMETHOD([], HRESULT, 'Run'),
COMMETHOD([], HRESULT, 'Pause'),
COMMETHOD([], HRESULT, 'Stop'),
COMMETHOD([], HRESULT, 'StopWhenReady'),
COMMETHOD([], HRESULT, 'GetState',
(['in'], c_long, 'msTimeout'),
(['out'], POINTER(c_int), 'pfs' ))
]
This got me further. Once I defined the interface, I get access to the
interface by calling:
control = graph.QueryInterface(IMediaControl)
This seemed to work. Once I got everything setup, I tried to use this
interface. For example:
control.Run()
This generates an exception:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ds.py", line 462, in play
control.Run()
ValueError: Procedure probably called with not enough arguments (4
bytes missing)
You can get errors like this when using ctypes if you use the wrong
calling convention (CDLL versus WINDLL).
The method "Run" on the IMediaControl interface doesn't take any
arguments.
I did notice that some wrapper code uses STDMETHOD versus COMMETHOD,
but changing this didn't make any difference.
Can anyone explain what might be happening here, or offer some
suggestions?
Thanks in advance,
Jeff 3 3204 wi*********@yahoo.com schrieb:
Hello,
I am working with comtypes to interface Microsoft's DirectShow library.
Cool, another one using comtypes!
First, I found a Type Library on the internet that was created for
accessing DirectShow from .NET. It seems that DirectShow only comes
with IDL files and no type library.
What I sometimes do is to compile the IDL files into a typelib just
for creating the comtypes interface wrappers. This may be somewhat
dangerous because these typelibs should *not* be registered by accident,
so that they do not conflict with other typelibs.
Then, I found out with oleview that on my system the IMediaControl interface
is described in the 'ActiveMovie control type library (Ver 1.0)',
in c:\windows\system32\quartz.dll. So I was able to create the wrapper
by calling comtypes.client.GetModule("quartz.dll") - it seems that windows
searches the $PATH to find type libraries.
This got me started.
The following line imports the typelibrary and automatically generates
a wrapper module for DirectShow.
ds = comtypes.client.GetModule('DirectShow.tlb')
Next, I can basically start with something like this:
graph = comtypes.CoCreateInstance(CLSID_FilterGraph, ds.IGraphBuilder,
comtypes.CLSCTX_INPROC_SERVER)
I had to create the CLSID_FilterGraph parameter myself by doing the
following:
CLSID_FilterGraph =
comtypes.GUID('{e436ebb3-524f-11ce-9f53-0020af0ba770}')
One of the first issues I ran into was that the type library I found on
the web didn't expose the IMediaControl interface. So, using the
generated wrapper as a template, I created my own wrapper:
class IMediaControl(comtypes.IUnknown):
_case_insensitive_ = True
_iid_ = comtypes.GUID('{56A868B1-0AD4-11CE-B03A-0020AF0BA770}')
_idlflags_ = []
IMediaControl._methods_ = [
COMMETHOD([], HRESULT, 'Run'),
COMMETHOD([], HRESULT, 'Pause'),
COMMETHOD([], HRESULT, 'Stop'),
COMMETHOD([], HRESULT, 'StopWhenReady'),
COMMETHOD([], HRESULT, 'GetState',
(['in'], c_long, 'msTimeout'),
(['out'], POINTER(c_int), 'pfs' ))
]
This got me further. Once I defined the interface, I get access to the
interface by calling:
control = graph.QueryInterface(IMediaControl)
This seemed to work. Once I got everything setup, I tried to use this
interface. For example:
control.Run()
This generates an exception:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ds.py", line 462, in play
control.Run()
ValueError: Procedure probably called with not enough arguments (4
bytes missing)
You can get errors like this when using ctypes if you use the wrong
calling convention (CDLL versus WINDLL).
The method "Run" on the IMediaControl interface doesn't take any
arguments.
I did notice that some wrapper code uses STDMETHOD versus COMMETHOD,
but changing this didn't make any difference.
Can anyone explain what might be happening here, or offer some
suggestions?
Your mistake here is that IMediaControl derives from IDispatch, not IUnknown.
So, control.Run() really calls the first IDispatch method, which is
GetTypeInfoCount(), which takes one argument ;-).
I'm not 100% sure the following code will work for you because I'm using
a comtypes version that's not yet committed to the repository, but it works
for me:
from comtypes.client import GetModule, CreateObject
# create and import the interface wrapper
ds = GetModule("quartz.dll")
# FilgraphManager is what the wrapper shows as coclass,
# you can pass that to CreateObject instead of a CLSID or ProgID.
# CreateObject calls QueryInterface for the 'most useful' interface,
# so usually there's no need to specify the interface you want:
fg = CreateObject(ds.FilgraphManager)
# this prints '0'
print fg.Run()
Thomas
Thomas,
Thanks a ton for the quick response.
I called GetModule('quartz.dll'), and now I can at least call
IMediaControl::Run. I get another error, but that's my problem (I
don't have the graph set correctly yet).
You mentioned that you sometimes create a type library for creating the
interface wrappers.
Would you mind sharing with me how you do this?
I seem to recall a thread on ctypes-users where you were looking for a
method to do this. I can't seem to locate what you conclusion was.
By the way, I've been using ctypes and comtypes quite a bit lately, and
I just wanted to say that they are both excellent.
Now if only I had an equivalent way to access C++ dlls, I'd no longer
have to write typemaps in SWIG.
While I'm at it, I thought I would ask you a separate completely
unrelated question.
I have a C++ library wrapped with SWIG. One member function takes a
void* to a buffer.
I want to allocate this buffer using ctypes and pass it to my SWIG
wrapper, but I've been struggling to get it to work.
I tried passing in the addressof, and then casting it back in my SWIG
wrapper, but this doesn't work. Do you have any suggestions on this?
I've also thought about using a numpy array, since this is supported in
both SWIG and ctypes.
Thanks again for your help.,
Jeff
Thomas Heller wrote:
wi*********@yahoo.com schrieb:
Hello,
I am working with comtypes to interface Microsoft's DirectShow library.
Cool, another one using comtypes!
First, I found a Type Library on the internet that was created for
accessing DirectShow from .NET. It seems that DirectShow only comes
with IDL files and no type library.
What I sometimes do is to compile the IDL files into a typelib just
for creating the comtypes interface wrappers. This may be somewhat
dangerous because these typelibs should *not* be registered by accident,
so that they do not conflict with other typelibs.
Then, I found out with oleview that on my system the IMediaControl interface
is described in the 'ActiveMovie control type library (Ver 1.0)',
in c:\windows\system32\quartz.dll. So I was able to create the wrapper
by calling comtypes.client.GetModule("quartz.dll") - it seems that windows
searches the $PATH to find type libraries.
This got me started.
The following line imports the typelibrary and automatically generates
a wrapper module for DirectShow.
ds = comtypes.client.GetModule('DirectShow.tlb')
Next, I can basically start with something like this:
graph = comtypes.CoCreateInstance(CLSID_FilterGraph, ds.IGraphBuilder,
comtypes.CLSCTX_INPROC_SERVER)
I had to create the CLSID_FilterGraph parameter myself by doing the
following:
CLSID_FilterGraph =
comtypes.GUID('{e436ebb3-524f-11ce-9f53-0020af0ba770}')
One of the first issues I ran into was that the type library I found on
the web didn't expose the IMediaControl interface. So, using the
generated wrapper as a template, I created my own wrapper:
class IMediaControl(comtypes.IUnknown):
_case_insensitive_ = True
_iid_ = comtypes.GUID('{56A868B1-0AD4-11CE-B03A-0020AF0BA770}')
_idlflags_ = []
IMediaControl._methods_ = [
COMMETHOD([], HRESULT, 'Run'),
COMMETHOD([], HRESULT, 'Pause'),
COMMETHOD([], HRESULT, 'Stop'),
COMMETHOD([], HRESULT, 'StopWhenReady'),
COMMETHOD([], HRESULT, 'GetState',
(['in'], c_long, 'msTimeout'),
(['out'], POINTER(c_int), 'pfs' ))
]
This got me further. Once I defined the interface, I get access to the
interface by calling:
control = graph.QueryInterface(IMediaControl)
This seemed to work. Once I got everything setup, I tried to use this
interface. For example:
control.Run()
This generates an exception:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ds.py", line 462, in play
control.Run()
ValueError: Procedure probably called with not enough arguments (4
bytes missing)
You can get errors like this when using ctypes if you use the wrong
calling convention (CDLL versus WINDLL).
The method "Run" on the IMediaControl interface doesn't take any
arguments.
I did notice that some wrapper code uses STDMETHOD versus COMMETHOD,
but changing this didn't make any difference.
Can anyone explain what might be happening here, or offer some
suggestions?
Your mistake here is that IMediaControl derives from IDispatch, not IUnknown.
So, control.Run() really calls the first IDispatch method, which is
GetTypeInfoCount(), which takes one argument ;-).
I'm not 100% sure the following code will work for you because I'm using
a comtypes version that's not yet committed to the repository, but it works
for me:
from comtypes.client import GetModule, CreateObject
# create and import the interface wrapper
ds = GetModule("quartz.dll")
# FilgraphManager is what the wrapper shows as coclass,
# you can pass that to CreateObject instead of a CLSID or ProgID.
# CreateObject calls QueryInterface for the 'most useful' interface,
# so usually there's no need to specify the interface you want:
fg = CreateObject(ds.FilgraphManager)
# this prints '0'
print fg.Run()
Thomas
wi*********@yahoo.com schrieb:
Thomas,
Thanks a ton for the quick response.
I called GetModule('quartz.dll'), and now I can at least call
IMediaControl::Run. I get another error, but that's my problem (I
don't have the graph set correctly yet).
You mentioned that you sometimes create a type library for creating the
interface wrappers.
Would you mind sharing with me how you do this?
Nothing fancy: I compile them with midl.
I seem to recall a thread on ctypes-users where you were looking for a
method to do this. I can't seem to locate what you conclusion was.
By the way, I've been using ctypes and comtypes quite a bit lately, and
I just wanted to say that they are both excellent.
Thanks!
Now if only I had an equivalent way to access C++ dlls, I'd no longer
have to write typemaps in SWIG.
While I'm at it, I thought I would ask you a separate completely
unrelated question.
I have a C++ library wrapped with SWIG. One member function takes a
void* to a buffer.
I want to allocate this buffer using ctypes and pass it to my SWIG
wrapper, but I've been struggling to get it to work.
I tried passing in the addressof, and then casting it back in my SWIG
wrapper, but this doesn't work. Do you have any suggestions on this?
Which object does the SWIG wrapper expect? Would a bufferobject suffice?
If this is the case, you could call buffer() on a ctypes object, maybe one
created with 'ctypes.create_string_buffer(size_in_bytes)'. Every ctypes
type instance supports the buffer protocol.
I've also thought about using a numpy array, since this is supported in
both SWIG and ctypes.
That might also work.
Thomas This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Aki Niimura |
last post by:
Hello everyone,
I started to use pickle to store the latest user settings for the tool
I wrote. It writes out a pickled text file when it terminates and it
restores the settings when it starts....
|
by: Bob Staheli |
last post by:
The .Net DataObject class implements the COM/OLE IDataObject interface , so
how do I get it.
I have tried this, but it does not work :
// Declare the COM/OLE IDataObject interface
public...
|
by: solid.snake.84 |
last post by:
In my ATL Class, I have a function with the body
STDMETHODIMP CSimpleObj::Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CSimpleDialog...
|
by: Chris Fonnesbeck |
last post by:
I have built the following unit test, observing the examples laid out
in the python docs:
class testMCMC(unittest.TestCase):
def setUp(self):
# Create an instance of the sampler...
|
by: Jeff |
last post by:
How does this work, who is the person that translated
ComTypes.FORMATETC.cfFormat from a long to a short?
Did I miss something somewhere that said that a long in a C++ structure
translates...
|
by: alain MONTMORY |
last post by:
Hello everybody,
I am a newbie to python so I hope I am at the right place to expose my
problem..... :-http://www.python.org/doc/2.4.2/ext/pure-embedding.html 5.3 Pure Embedding
I download the...
|
by: Thomas Heller |
last post by:
comtypes seems to gain some attention (comtypes is a pure Python, lightweight
COM client and server framework, based on the ctypes Python FFI package.)
I'll try to release a new version over the...
|
by: wcc |
last post by:
Hello group,
Is there a separate mailing list for comtypes? Or this is the
appropriate place to post questions related to this package(from Thomas
Heller)?
Thanks,
--
wcc
|
by: nassegris |
last post by:
Hello!
I need to somehow extract the TypeLib ID from a COM-dll compiled using
VB6. Is is possible or do I have to look it up in the registry somehow
(ie by iterating over TypeLibIDs in...
|
by: Kemmylinns12 |
last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and efficiency. While initially associated with cryptocurrencies...
|
by: Naresh1 |
last post by:
What is WebLogic Admin Training?
WebLogic Admin Training is a specialized program designed to equip individuals with the skills and knowledge required to effectively administer and manage Oracle...
|
by: antdb |
last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine
In the overall architecture, a new "hyper-convergence" concept was proposed, which integrated multiple engines and...
|
by: Oralloy |
last post by:
Hello Folks,
I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA.
My problem (spelled failure) is with the synthesis of my design into a bitstream, not the C++...
|
by: Carina712 |
last post by:
Setting background colors for Excel documents can help to improve the visual appeal of the document and make it easier to read and understand. Background colors can be used to highlight important...
|
by: Ricardo de Mila |
last post by:
Dear people, good afternoon...
I have a form in msAccess with lots of controls and a specific routine must be triggered if the mouse_down event happens in any control.
Than I need to discover what...
|
by: Johno34 |
last post by:
I have this click event on my form. It speaks to a Datasheet Subform
Private Sub Command260_Click()
Dim r As DAO.Recordset
Set r = Form_frmABCD.Form.RecordsetClone
r.MoveFirst
Do
If...
|
by: DizelArs |
last post by:
Hi all)
Faced with a problem, element.click() event doesn't work in Safari browser.
Tried various tricks like emulating touch event through a function:
let clickEvent = new Event('click', {...
|
by: F22F35 |
last post by:
I am a newbie to Access (most programming for that matter). I need help in creating an Access database that keeps the history of each user in a database. For example, a user might have lesson 1 sent...
| |