Interfacing with XPCOM
John Reimer
terminal.node at gmail.com
Mon Dec 8 03:09:15 PST 2008
Hello Sergey,
> Sun, 7 Dec 2008 07:04:22 +0000 (UTC), John Reimer wrote:
>
>> Hello Jason,
>>
>>> Sergey Gromov wrote:
>>>
>>>> But what's the typical use case for extern(C++) objects ? I think
>>>> it's something like this:
>>>>
>>>> extern(C++) class CppInterfaceClass { ... }
>>>>
>>>> extern(C++) CppInterfaceClass create()
>>>> {
>>>> return new CppInterfaceClass(...);
>>>> }
>>>> extern(C++) void destroy(CppInterfaceClass obj)
>>>> {
>>>> delete obj;
>>>> }
>>> while extern(C++) will accept that code, but it won't work right.
>>>
>> (Sorry, I've been away for a bit)
>>
>> I don't think the example is how extern(C++) was designed to work
>> either.
>>
>> When used for C++ classes, extern(C++), from what I gather, is
>> intended to be applied to an /interface/ in the D code, NOT a D
>> class:
>>
>> extern(C++) interface Foo {
>> int foo(int a, b);
>> }
>> This interface represents the link to the external C++ class. An
>> instance of that class is created by the C++ code using a factory
>> function which D links to in its code (BUT does not implement):
>>
> This is one possible use. But the opposite use is also perfectly
> possible. The ultimate example of the opposite use is a COM object
> implemented in D.
>
>> Of course, the documentation on extern(C++) already discusses this.
>> I just thought it should be made clear here since the prior code
>> sample implies that the C++ object creation and destruction are done
>> in D, which it cannot be.
>>
> Of course it can. My example wasn't quite correct though. Assuming
> your definition of interface Foo, here is the implementation:
>
>> extern(C++) interface Foo {
>> int foo(int a, int b);
>> }
> class FooImpl : Foo {
> override int foo(int a, int b) { // implicit extern(C++), correct
> VTAB placement
> return a + b;
> }
> }
> extern(C++) Foo createFoo() {
> return new FooImpl;
> }
> extern(C++) void destroyFoo(Foo foo) {
> delete foo;
> }
> The only problem with this code is that FooImpl will be GCed as soon
> as it leaves the createFoo().
>
Yes, you are correct here, as far as I understand it. My apologies for forming
the implication that you misunderstood.
-JJR
More information about the Digitalmars-d
mailing list