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