Dear list,

I use DMD 2.070.0 I try to access COM Interfaces via the declarations in core.sys.windows.*
I have some problems and maybe someone could give me a usage hint.
Have a look at the following (relatively meaningless) sample program which demonstrates the problem.

IMHO the problem is that GUID constants are declared as enums in the
winapi bindings (see src\druntime\import\core\sys\windows\uuid.d).
Within the dclient.d sample which comes with dmd they are explicitely
defined as GUIDs:

GUID IID_IHello  = { 0x00421140, 0, 0, [0xC0, 0, 0, 0, 0, 0, 0, 0x46] };

So maybe they should be declared as "extern GUID ..." because they also seem to be defined in windows\lib\uuid.lib which comes with DMD.
What do you think ?

Thanks

-- KlausO


Sample program:


import std.stdio;
import std.utf;
import core.stdc.stdlib;

import core.sys.windows.windows;
import core.sys.windows.com;
import core.sys.windows.objidl;

bool CreateCompoundDoc(const wstring filename)
{
        IStorage storage;

        HRESULT hr = StgCreateDocfile( toUTF16z(filename),
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT | STGM_CREATE,
                                                                   0,
                                                                  &storage);

        if (S_OK == hr)
        {
                IUnknown pUnk;

                //
                // Does not compile:
                //
// Error: function core.sys.windows.unknwn.IUnknown.QueryInterface(const(GUID)* riid, void** pvObject) is not callable using argument types (const(GUID), void**)
                //
                hr = storage.QueryInterface(IID_IUnknown, cast(void**)&pUnk);

                //
                // Does not compile either:
                //
// Error: GUID(0u, cast(ushort)0u, cast(ushort)0u, [cast(ubyte)192u, cast(ubyte)0u, cast(ubyte)0u, cast(ubyte)0u, cast(ubyte)0u, cast(ubyte)0u, cast(ubyte)0u, cast(ubyte)70u]) is not an lvalue
                //
                hr = storage.QueryInterface(&IID_IUnknown, cast(void**)&pUnk);
        }
}

int main(string[] argv)
{
        HRESULT hr=CoInitialize(null); // Initialize OLE
        if (FAILED(hr))
        {
                printf("OLE 2 failed to initialize\n");
                return EXIT_FAILURE;
        }

        CreateCompoundDoc("hello.doc");

        // Only call this if CoInitialize worked
        CoUninitialize();
        return EXIT_SUCCESS;
}

Reply via email to