scribble is a very bad example to be emulating. It is old and ill
maintained. It does stuff that has long been superceeded.
nsSample.cpp is much more modern.
John.
JohnSmith wrote:
>
> 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.