Need help on COM Programming Problem

Steve Myers zzmyers at gmail.com
Thu Jul 24 21:38:11 PDT 2008


I have been using D 1.0 for a while (currently using 1.028), mostly in Linux. Recently I have moved to Windows as forced by necessity of having to tie in to some custom OCX controls provided by a hardware manufacturer. I have been almost beating my brains out trying to get the COM interface to work correctly in D. The provider of the OCX gives a sample program in Visual C# which works fine, but when I use it in D, everything seems to set up properly and then when I call methods of the COM Interface, it either silently fails (no errors reported) or it bombs out with an Access Violation. 

Here is a simple program in which I call 2 methods of the object and they appear to work (no error), but they actually don't do anything.

---------------------------
module test;

import std.c.stdio, std.c.stdlib, std.c.windows.windows, std.c.windows.com;
import local.utils;

GUID IID_ITracker = {0x83d5a123, 0x6857, 0x423b, [0x94, 0x55, 0x8b, 0x89, 0xd5, 0x32, 0xeb, 0xf9]};
GUID CLSID_Tracker = {0x43f7fc01, 0xe47e, 0x473c, [0xaa, 0xdd, 0xe7, 0xe5, 0xd2, 0xe0, 0xb8, 0x41]};

interface ITracker : IUnknown 
{
        extern(Windows):
        int ReadConfig(wchar* filePath);
        int WriteConfig(wchar* filePath);
}

int main()
{
        DWORD       dwVer;
        HRESULT     hr;
        ITracker    pITracker;
        
        hr=CoInitialize(null);          //Initialize OLE
        if (FAILED(hr))
        {       printf("OLE 2 failed to initialize\n");
                return EXIT_FAILURE;
        }
        printf("OLE 2 initialized\n");
        
        hr=CoCreateInstance(&CLSID_Tracker, null, CLSCTX_ALL, &IID_ITracker, &pITracker);
        if (FAILED(hr))
        {   printf("Failed to create object x%x\n",hr);
        }
        else
        {       int g, status;
                printf("Object created, calling ITracker.ReadConfig(), ITracker = %p\n", pITracker);
                status = pITracker.ReadConfig(fromString(`"C:\TD\Test\trackerconfig.txt"`));
                if (status < 0)
                        printf("Failed! Error = %d\n", status);
                printf("Calling ITracker.WriteConfig(), ITracker = %p\n", pITracker);
                status = pITracker.ReadConfig(toBSTR(`E:\trackerconfig.txt`));
                if (status < 0)
                        printf("Failed! Error = %d\n", status);
                fflush(stdout);
                pITracker.Release();
        }
        CoUninitialize();
        return EXIT_SUCCESS;
}
--------------
I based this off the sample provided with DMD. I have tried to get this working with Juno, DWin and the basic Phobos libraries to no avail. I am certain I must be doing something really stupid, but for the life of me cannot figure it out. I don't post problems often as I can usually find my answers though Google, but this one has me stumped. 

If someone can please point out what I am doing wrong, I would be eternally grateful.

Steve



More information about the Digitalmars-d-learn mailing list