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.

Reply via email to