Accessing COM Objects

Joerg Joergonson via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jun 15 00:01:30 PDT 2016


On Wednesday, 15 June 2016 at 06:09:33 UTC, thedeemon wrote:
> On Monday, 13 June 2016 at 17:38:41 UTC, Incognito wrote:
>
>> Cool. Oleview gives me the idl files. How to convert the idl 
>> files to d or possibly c?
>
> There are ready tools idl2d:
> https://github.com/dlang/visuald/tree/master/c2d
>
> and tlb2idl:
> https://github.com/dlang/visuald/tree/master/tools
>
> I've used this idl2d and it works pretty well (although not 
> perfect, sometimes manual editing still required).
>
> Example of real-world DirectShow interfaces translated:
> https://gist.github.com/thedeemon/46748f91afdbcf339f55da9b355a6b56
>
>> Would I just use them in place of IUnknown once I have the 
>> interface?
>
> If you have the interface defined AND you know its IID, you can 
> request it from CoCreateInstance and then use as ordinary D 
> object.
>
> You might want to look at this wrapper that takes most of COM 
> machinery:
> https://gist.github.com/thedeemon/3c2989b76004fafe9aa0
>
> Then you just write almost as in C#, something like
>
>   auto pGraph = ComPtr!IGraphBuilder(CLSID_FilterGraph, 
> "pGraph").require;
>
>   ComPtr!ICaptureGraphBuilder2 pBuilder = 
> ComPtr!ICaptureGraphBuilder2(CLSID_CaptureGraphBuilder2).require;
>   pBuilder.SetFiltergraph(pGraph);
>   ...
>   auto CLSID_NullRenderer = 
> Guid!("C1F400A4-3F08-11D3-9F0B-006008039E37"); //qedit.dll
>   auto pNullRendr = ComPtr!IBaseFilter(CLSID_NullRenderer, 
> "nulrend");
>   pGraph.AddFilter(pNullRendr, "Null Renderer"w.ptr);
>   ...
>   auto imf = ComPtr!IMediaFilter(pGraph);
>   imf.SetSyncSource(null);
>
> All the CreateInstance, QueryInterface, AddRef/Release etc. is 
> taken care of. And even HRESULT return codes are automatically 
> checked.

Thanks, if I can get the idl converted I'll test it out. It seems 
idl2d from VD is not easily compilable?



More information about the Digitalmars-d-learn mailing list