I have a Windows native window class in C++, and I need a function to return the window title.

So in D, I have this:

// isn't D's ABI stable enough to just return this from C++
// and call it a string in the extern(C++) interface? anyways..
struct DString
{
    size_t length;
    immutable(char)* ptr;
    string toString() { return ptr[0..length]; }
    alias toString this;
}

extern(C++) interface NativeWindow {
    DString getTitle() const;
}

and in C++, this:

class NativeWindow
{
public:
    struct DString {
        size_t length;
        const char* ptr;
    };

    virtual DString getTitle() const {
        DString ret;
        ret.length = GetWindowTextLength(_hwnd) + 1;
        ret.ptr = (const char*)gc_malloc(ret.length, 0xA, NULL);
        GetWindowText(_hwnd, (char*)ret.ptr, ret.length);
        return ret;
    }
};

So while it's not generally safe to _store_ pointers to D's GC allocated memory exclusively in C++, I've read that D's GC scans the stack, and getTitle() is being called from D(and so, is on that stack..right?). So is the string I'm returning safe from GC collection?

  Thanks

Reply via email to