Thread overview
COM2D Wrapper
Mar 24, 2017
Nierjerson
Mar 27, 2017
Nierjerson
Mar 28, 2017
evilrat
Mar 28, 2017
John Chapman
Mar 28, 2017
Kagamin
Mar 28, 2017
Nierjerson
March 24, 2017
I'd like to present the following D library I am working on:

https://github.com/IllusionSoftware/COM2D

It attempts to automate COM in D.

It has some problems but does partially work. Those with a recent version of Adobe Photoshop and an interest in COM can try it out and make contributions if they would like to see it progress.

The goal is to completely remove the necessity to use COM api in D and simply use D directly.

When executing the application, photoshop should start up. One must use a debugger or modify the main.d app to see what is happening. So far, only the top most interface is working as aggregates have not been handled.

If anyone is interested in seeing this through, maybe we can collaborate to get a fully functional implementation.




March 27, 2017
On Friday, 24 March 2017 at 18:17:31 UTC, Nierjerson wrote:
> I'd like to present the following D library I am working on:
>
> https://github.com/IllusionSoftware/COM2D
>
> It attempts to automate COM in D.
>
> It has some problems but does partially work. Those with a recent version of Adobe Photoshop and an interest in COM can try it out and make contributions if they would like to see it progress.
>
> The goal is to completely remove the necessity to use COM api in D and simply use D directly.
>
> When executing the application, photoshop should start up. One must use a debugger or modify the main.d app to see what is happening. So far, only the top most interface is working as aggregates have not been handled.
>
> If anyone is interested in seeing this through, maybe we can collaborate to get a fully functional implementation.

Anyone can help get this working? I think the issue maybe that the interface pointer returned by the COM interface is "C-like" and doesn't match what D expects an interface to be. I get access violations when trying to call the functions on the returned interfaces. Not sure about this though.

Thanks.
March 28, 2017
On Monday, 27 March 2017 at 21:02:05 UTC, Nierjerson wrote:
> On Friday, 24 March 2017 at 18:17:31 UTC, Nierjerson wrote:
>> I'd like to present the following D library I am working on:
>>
>> https://github.com/IllusionSoftware/COM2D
>
> I get access violations when trying to call the functions on the returned interfaces.
>

Why are your photoshop interfaces not extern(Windows)? I saw some mixin magic with extern(Windows), so you are generating extern(Windows) stuff from plain D interface? Are you sure that your code calls generated stuff instead of using D interface? Because if it calls the latter it crashes due to ABI mismatch.

And the most important thing, if you are making D class derived from COM interface and calls its interface functions - you are out of luck, there is probably a way to get correct offset for vptr(something like Class.SomeInterface.offsetof?), D classes has virtual methods alreay(5 or so), so your COM functions called with wrong ptr offset that of course crashes. To test if this is an actual issue pick any function you want to try, get 5 functions back, forge its signature to the function you are testing and call it. I assume it will work, but, no guarantees... But if it works please open an issue in bugtracker (if nothing yet there)

The possible workaround is making C-style COM class where functions takes 'this' as first arg, which also involves filling up COM vtable manually, search the internets, I can't help you with that.
March 28, 2017
On Monday, 27 March 2017 at 21:02:05 UTC, Nierjerson wrote:
> Anyone can help get this working? I think the issue maybe that the interface pointer returned by the COM interface is "C-like" and doesn't match what D expects an interface to be. I get access violations when trying to call the functions on the returned interfaces. Not sure about this though.

I don't have Photoshop so I can't verify this, however I think Photoshop only declares dispinterfaces, meaning those methods aren't present in the vtable, so every method will have to be called using IDispatch.Invoke.

(I'm guessing IDL2D doesn't distinguish between dual and disp- interfaces and just emits any functions it sees.)
March 28, 2017
On Monday, 27 March 2017 at 21:02:05 UTC, Nierjerson wrote:
> Anyone can help get this working? I think the issue maybe that the interface pointer returned by the COM interface is "C-like" and doesn't match what D expects an interface to be. I get access violations when trying to call the functions on the returned interfaces. Not sure about this though.

First write code that works, then write generator for it. It won't work the other way around.
March 28, 2017
On Tuesday, 28 March 2017 at 12:09:23 UTC, Kagamin wrote:
> On Monday, 27 March 2017 at 21:02:05 UTC, Nierjerson wrote:
>> Anyone can help get this working? I think the issue maybe that the interface pointer returned by the COM interface is "C-like" and doesn't match what D expects an interface to be. I get access violations when trying to call the functions on the returned interfaces. Not sure about this though.
>
> First write code that works, then write generator for it. It won't work the other way around.

Thanks, I'm sure you think this was suppose to help. I actually write **ALL** my code in doubly generated(has to go through two generations of code generation before it is generated). I also make sure it doesn't work before I go through that process and I through in a few bugs in the generation code just to waste more of my time. Of course, I know it works that way because I'm a genius!

In any case, I found my problem, thanks to you. You were a great help! I had to decode your answer from Base64 and use the inigma cryptic encoding function to actually find your COM expertise in there though. But thanks anyways! I really appreciate it!