Hi.
I am trying to instantiate an object and for the life of me i am not able to
do so. The code i have was copied verbatin from the widget/tests/scribble
application. It must be something stupid i am doing but I know this has to
do with registration so bear with me. Before i forget i am using straight
m18 build on an NT4sp3/VC60 . Here is the code
// register event queue classes
static NS_DEFINE_IID(kEventQueueCID, NS_EVENTQUEUE_CID);
static NS_DEFINE_IID(kIEventQueueServiceIID, NS_IEVENTQUEUESERVICE_IID);
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
nsComponentManager::RegisterComponentLib(kEventQueueCID, NULL, NULL,
XPCOM_DLL, PR_FALSE, PR_FALSE);
nsComponentManager::RegisterComponentLib(kEventQueueServiceCID, NULL,
NULL, XPCOM_DLL, PR_FALSE, PR_FALSE);
// register appshell classes
static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID);
static NS_DEFINE_IID(kCAppShellCID, NS_APPSHELL_CID);
nsComponentManager::RegisterComponentLib(kCAppShellCID, NULL, NULL,
WIDGET_DLL, PR_FALSE, PR_FALSE);
// register graphics classes
static NS_DEFINE_IID(kCDeviceContextCID, NS_DEVICE_CONTEXT_CID);
static NS_DEFINE_IID(kIDeviceContextIID, NS_IDEVICE_CONTEXT_IID);
nsComponentManager::RegisterComponentLib(kCDeviceContextCID, NULL, NULL,
GFXWIN_DLL, PR_FALSE, PR_FALSE);
nsresult res;
// Create the Event Queue for the UI thread...
res = nsServiceManager::GetService(kEventQueueServiceCID,
kIEventQueueServiceIID,
(nsISupports
**)&scribbleData.mEventQService);
if (NS_OK != res) {
NS_ASSERTION(PR_FALSE, "Could not obtain the event queue service");
return res;
}
printf("Going to create the event queue\n");
res = scribbleData.mEventQService->CreateThreadEventQueue();
if (NS_OK != res) {
NS_ASSERTION(PR_FALSE, "Could not create the event queue for the
thread");
return res;
}
// Create an application shell
nsIAppShell *appShell = nsnull;
nsComponentManager::CreateInstance(kCAppShellCID, nsnull, kIAppShellIID,
(void**)&appShell);
appShell->Create(argc, argv);
res = nsComponentManager::CreateInstance(kCDeviceContextCID, nsnull,
kIDeviceContextIID, (void **)&scribbleData.mContext);
if (NS_OK != res)
return res;
The code works until it reachs
nsComponentManager::CreateInstance(kCDeviceContextCID,. At that point there
is an assertion raised. Here is the stack:
NTDLL! 77f76148()
nsDebug::Assertion(const char * 0x100da79c, const char * 0x100da788, const
char * 0x100da738, int 157) line 256 + 13 bytes
nsDebug::WarnIfFalse(const char * 0x100da79c, const char * 0x100da788, const
char * 0x100da738, int 157) line 358 + 21 bytes
nsNativeComponentLoader::GetFactory(nsNativeComponentLoader * const
0x009d6c60, const nsID & {...}, const char * 0x009df2d0, const char *
0x009df310, nsIFactory * * 0x0012fa84) line 157 + 37 bytes
nsFactoryEntry::GetFactory(nsIFactory * * 0x0012fa84, nsComponentManagerImpl
* 0x009d4590) line 217 + 58 bytes
nsComponentManagerImpl::FindFactory(nsComponentManagerImpl * const
0x009d4590, const nsID & {...}, nsIFactory * * 0x0012fa84) line 1031
nsComponentManagerImpl::CreateInstance(nsComponentManagerImpl * const
0x009d4590, const nsID & {...}, nsISupports * 0x00000000, const nsID &
{...}, void * * 0x0012fae8) line 1198 + 20 bytes
nsComponentManager::CreateInstance(const nsID & {...}, nsISupports *
0x00000000, const nsID & {...}, void * * 0x0012fae8) line 82
nsServiceManagerImpl::GetService(nsServiceManagerImpl * const 0x009d3030,
const nsID & {...}, const nsID & {...}, nsISupports * * 0x0012fb78,
nsIShutdownListener * 0x00000000) line 344 + 19 bytes
nsServiceManager::GetService(const nsID & {...}, const nsID & {...},
nsISupports * * 0x0012fb78, nsIShutdownListener * 0x00000000) line 560
nsGetServiceByCID::operator()(const nsID & {...}, void * * 0x0012fb78) line
44 + 22 bytes
nsCOMPtr<nsIPref>::assign_from_helper(const nsCOMPtr_helper & {...}, const
nsID & {...}) line 856 + 18 bytes
nsCOMPtr<nsIPref>::nsCOMPtr<nsIPref>(const nsCOMPtr_helper & {...}) line 553
nsDeviceContextWin::nsDeviceContextWin() line 61 + 30 bytes
nsGfxFactoryWin::CreateInstance(nsGfxFactoryWin * const 0x009e00c0,
nsISupports * 0x00000000, const nsID & {...}, void * * 0x0041b68c) line 150
+ 30 bytes
nsComponentManagerImpl::CreateInstance(nsComponentManagerImpl * const
0x009d4590, const nsID & {...}, nsISupports * 0x00000000, const nsID &
{...}, void * * 0x0041b68c) line 1201 + 24 bytes
nsComponentManager::CreateInstance(const nsID & {...}, nsISupports *
0x00000000, const nsID & {...}, void * * 0x0041b68c) line 82
CreateApplication(int * 0x0012fecc, char * * 0x009d3260) line 149 + 25 bytes
main(int 1, char * * 0x009d3260) line 8 + 13 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00400000, char *
0x00141e68, HINSTANCE__ * 0x00400000) line 105 + 41 bytes
WinMainCRTStartup() line 330 + 54 bytes
If you take a close look at
nsNativeComponentLoader::GetFactory(nsNativeComponentLoader * const
0x009d6c60, const nsID & {...}, const char * 0x009df2d0, const char *
0x009df310, nsIFactory * * 0x0012fa84) line 157 + 37 bytes
you will see the comment :
// If the dll failed to get us a factory. But the dll registered that
// it would be able to create a factory for this CID. mmh!
// We cannot just delete the dll as the dll could be hosting
// other CID for which factory creation can pass.
// We will just let it be. The effect will be next time we try
// creating the object, we will query the dll again. Since the
// dll is loaded, this aint a big hit. So for optimized builds
// this is ok to limp along.
NS_WARN_IF_FALSE(NS_SUCCEEDED(rv), "Factory creation failed");
If you have a way of registering all the components also please do tell me.
I called nsAutoregister (with the same bin dir) to no avail. I am about to
go and learn more about regxpcom.