I am trying to use the RDF service, which I obtained through XPCOM.  I
didn't have any difficulty getting the service from the service manager.
Whenever I call any methods of the RDF service, however, the method recieves
a different set of arguments then I passed in, and it crashes.  It looks to
me like a DLL related problem marshalling the arguments, but I am at a loss
as to how to fix it.  Any help would be appreciated.

Details:
I am writing a DLL that makes XPCOM calls.  It is not itself an XPCOM
object.
I am compiling on my DLL a windows NT platform using my own makefile, not
the Mozilla makefile.  I use the DLL from within a mozilla browser.

My code:
static nsIRDFService* gRDFService = NULL;
...
 rv = nsServiceManager::GetService(kRDFServiceCID,
     NS_GET_IID(nsIRDFService),
     (nsISupports**) &gRDFService);
...
  printf("NbRdfInterface: gRDFService: %X\n",gRDFService);
  printf("NbRdfInterface: url: %s\n",url);
...
  rv = gRDFService->GetDataSource(url, NULL);
// originally: rv =
gRDFService->GetDataSource(url,getterAddRefs(datasource));  I changed it to
isolate the problem.
...

Instrumentation that I have put into nsRDFService.cpp:
NS_IMETHODIMP
RDFServiceImpl::GetDataSource(const char* aURI, nsIRDFDataSource**
aDataSource)
{
    printf("\nRDFService: GetDataSource: this = %X\n",this);
    printf("RDFService: GetDataSource: aURI = %s\n",aURI);
    printf("RDFService: GetDataSource: mNamedDataSources =
%X\n\n",mNamedDataSources);
...

Mozilla Debug output:
...
// Other components calling the RDF service.  It works for them...
RDFService: GetDataSource: this = A11410
RDFService: GetDataSource: aURI = rdf:local-store
RDFService: GetDataSource: mNamedDataSources = A11320

RDFService: GetDataSource: this = A11410
RDFService: GetDataSource: aURI = rdf:charset-menu
RDFService: GetDataSource: mNamedDataSources = A11320

RDFService: GetDataSource: this = A11410
RDFService: GetDataSource: aURI = rdf:local-store
RDFService: GetDataSource: mNamedDataSources = A11320
...

// My component has a valid set of arguments.
NbRdfInterface: gRDFService: A11410
NbRdfInterface: url: file:/C:/jsrc/rdfTest.rdf

// My Component calls the RDF service.
RDFService: GetDataSource: this = 1C8A0450
RDFService: GetDataSource: aURI =
RDFService: GetDataSource: mNamedDataSources = 64722F63
...
// Boom!
...

For reasons that I don't understand, the parameters that I passed to
GetDataSource are not the ones that it recieves.  I have tried working the
problem from the following angles:

1) Calling GetServiceManager in an attempt to initialize the service
manager.
        This didn't help.  Plus, you will observe that the service manager
is giving me the correct pointer to the RDF service, I just can't seem to
use it.

2) Calling a different RDF service method.
        No dice.  The other method had exactly the same problem.

3) Fiddling with different ways of linking things.
       As near as I can figure out, my DLL statically links xpcom.lib, but
not any rdf libraries.
      I have tried to use xpcom.dll instead of xpcom.dll, but I couldn't get
it to link.  I have also tried linking rdf.lib, which is a step in the wrong
direction, but that didn't work either.

    -- Dan Lange





Reply via email to