Need help on COM Programming Problem

Koroskin Denis 2korden at gmail.com
Fri Jul 25 02:51:55 PDT 2008


On Fri, 25 Jul 2008 08:38:11 +0400, Steve Myers <zzmyers at gmail.com> wrote:

> 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
>

Put some logging or debug step-by-step to understand at what line does the  
access violation take place.
Besides, try using `"C:\TD\Test\trackerconfig.txt"`w or  
toUTF16z(someFileName) instead of  
fromString(`"C:\TD\Test\trackerconfig.txt"`).
Hope this helps.


More information about the Digitalmars-d-learn mailing list