Accessing COM Objects
Incognito via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Jun 13 10:38:41 PDT 2016
On Monday, 13 June 2016 at 07:40:09 UTC, John wrote:
> On Monday, 13 June 2016 at 01:22:33 UTC, Incognito wrote:
>> I've been reading over D's com and can't find anything useful.
>> It seems there are different ways:
>>
>> http://www.lunesu.com/uploads/ModernCOMProgramminginD.pdf
>>
>> which is of no help and requires an idl file, which I don't
>> have.
>>
>> Then theres this
>>
>> http://wiki.dlang.org/COM_Programming
>>
>> which is also of no help:
>>
>> import std.stdio;
>>
>> import std.stdio, core.sys.windows.com,
>> core.sys.windows.windows, std.exception, std.meta, std.traits;
>> import std.utf, core.stdc.stdlib, core.sys.windows.objidl,
>> core.sys.windows.ole2;
>> pragma(lib, "ole32.lib");
>>
>>
>> GUID Guid(string str)()
>> {
>> static assert(str.length==36, "Guid string must be 36
>> chars long");
>> enum GUIDstring = "GUID(0x" ~ str[0..8] ~ ", 0x" ~
>> str[9..13] ~ ", 0x" ~ str[14..18] ~
>> ", [0x" ~ str[19..21] ~ ", 0x" ~ str[21..23] ~ ", 0x"
>> ~ str[24..26] ~ ", 0x" ~ str[26..28]
>> ~ ", 0x" ~ str[28..30] ~ ", 0x" ~ str[30..32] ~ ", 0x"
>> ~ str[32..34] ~ ", 0x" ~ str[34..36] ~ "])";
>> return mixin(GUIDstring);
>> }
>>
>> int main(string[] argv)
>> {
>>
>> // Adobe Photoshop App 9.0 CLSID
>> {c09f153e-dff7-4eff-a570-af82c1a5a2a8}
>> // Adobe Photoshop App 9.1 CLSID
>> {6DECC242-87EF-11cf-86B4-444553540000}
>>
>> auto CLSID_DOMDocument60 =
>> Guid!("6DECC242-87EF-11cf-86B4-444553540000");
>> auto iid = IID_IUnknown;
>>
>> void* pUnk;
>> auto hr = CoCreateInstance(&CLSID_DOMDocument60, null,
>> CLSCTX_ALL, &iid, &pUnk);
>> if (FAILED(hr))
>> throw new Exception("Error!");
>>
>> writeln("Hello D-World!");
>> return 0;
>> }
>>
>> Maybe my CLSID's are wrong. Got them from the registry. The
>> exception triggers each time. Even if it worked, I wouldn't
>> know how to use it.
>>
>> I can do this stuff in C# by simply dragging and dropping a
>> dll into the references and it works fine but is a bit slow. I
>> was hoping I could speed things up using D but it seems like
>> COM isn't really supported, despite what several references
>> say.
>
> COM is supported in D. The difference is that C# hides all the
> plumbing behind nice classes.
>
> You're going to need Photoshop's COM interface to do anything
> with it. If you don't have a C header that you can translate
> into D, you could use a tool included in the Windows SDK called
> OleView. It will peek inside COM libraries and give you the
> interface definitions.
>
> As to why CoCreateInstance isn't working, make sure you're
> calling CoInitialize or CoInitializeEx beforehand. If it's
> still failing, use std.windows.syserror.sysErrorString(hr) to
> see if it gives you a reason. Otherwise, CLSCTX_ALL might be
> the culprit - try using CLSCTX_SERVER instead.
Cool. Oleview gives me the idl files. How to convert the idl
files to d or possibly c?
Would I just use them in place of IUnknown once I have the
interface?
More information about the Digitalmars-d-learn
mailing list