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