1999-03-23 10:27:30 +03:00
|
|
|
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
|
|
<meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; U; Linux 2.0.36 i686) [Netscape]">
|
|
|
|
<meta name="Author" content="Suresh Duddi">
|
|
|
|
<title>XPCOM Code FAQ</title>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
|
|
|
|
<h2>
|
|
|
|
XPCOM Code FAQ</h2>
|
|
|
|
Suresh Duddi <<a href="mailto:dp@netscape.com">dp@netscape.com</a>>
|
|
|
|
<br>Last Modified: March 22 1999
|
|
|
|
<br>
|
|
|
|
<hr WIDTH="100%">
|
|
|
|
<br>I am documenting things randomly as I am replying to people's questions.
|
|
|
|
So this might look more like an FAQ.
|
|
|
|
<h4>
|
|
|
|
What are the Global Objects that XPCOM maintains</h4>
|
|
|
|
|
|
|
|
<ul>mGlobalServiceManager
|
|
|
|
<br>mGlobalComponentManager</ul>
|
|
|
|
|
|
|
|
<h4>
|
|
|
|
What are the static classes that XPCOM maintains</h4>
|
|
|
|
|
|
|
|
<blockquote>nsComponentManager
|
|
|
|
<br>nsServiceManager</blockquote>
|
|
|
|
|
|
|
|
<h4>
|
|
|
|
Is there any restriction on which static class I should call first</h4>
|
|
|
|
|
|
|
|
<blockquote>No restrictions. You can call any function from the static
|
|
|
|
classes nsComponentManager and nsServiceManager. XPCOM will do the right
|
1999-03-23 11:04:18 +03:00
|
|
|
thing to initialize itself at both places.
|
|
|
|
<p>Autoregistration() can happen only after Init_XPCOM() is called since
|
|
|
|
the registy might be required by SelfRegister() functions of the dlls and
|
|
|
|
it is only in Init_XPCOM() do we create register the RegistryFactory()
|
|
|
|
with the ComponentManager.</blockquote>
|
1999-03-23 10:27:30 +03:00
|
|
|
|
|
|
|
<h4>
|
|
|
|
What is the order of creation of the ServiceManager, ComponentManager and
|
|
|
|
Registry</h4>
|
|
|
|
|
|
|
|
<blockquote>Init_XPCOM()
|
1999-03-23 11:04:18 +03:00
|
|
|
<blockquote>
|
|
|
|
<li>
|
|
|
|
create the global component manager</li>
|
|
|
|
|
|
|
|
<li>
|
|
|
|
create the global component manager and register as service with the global
|
|
|
|
service manager</li>
|
|
|
|
|
|
|
|
<li>
|
|
|
|
RegisterFactory(...RegistryFactory...) Register the RegistryFactory()
|
|
|
|
with the component manager so that new registry objects can be created.</li>
|
|
|
|
</blockquote>
|
|
|
|
Now the hard problem is when to trigger Init_XPCOM() There are two static
|
1999-03-23 10:27:30 +03:00
|
|
|
objects nsComponentManager and nsServiceManager. Any function in either
|
|
|
|
of them can be called first. Today nsServiceManager::GetService() is the
|
|
|
|
first one that gets called. All the members of the static nsServiceManager
|
|
|
|
use the nsGetGlobalServiceManager() to get to the global service manager.
|
|
|
|
All members of the static nsComponentManager use the nsGetGlobalComponentManager()
|
|
|
|
to get to the global component manager. Hence if we trigger Init_XPCOM()
|
|
|
|
from both NS_GetGlobalComponentManager() and NS_GetGlobalServiceManager()
|
|
|
|
we will be safe.</blockquote>
|
|
|
|
|
1999-03-23 11:04:18 +03:00
|
|
|
<h4>
|
|
|
|
Is there a global Registry being maintained</h4>
|
|
|
|
|
|
|
|
<blockquote>No. The nsIRegistry is designed to be lightweight access to
|
|
|
|
the registry. Consumers who need to access the registry should use the
|
|
|
|
component manager to create the their own registry access object. This
|
|
|
|
is required because the open() call is supported by the nsIRegistry() and
|
|
|
|
if we maintain a global registry arbitrating which registry file is opened
|
|
|
|
is going to be a major headach.
|
|
|
|
<p>The ProgID for the registry will be <font color="#990000">component://netscape/registry</font></blockquote>
|
|
|
|
|
1999-03-23 10:27:30 +03:00
|
|
|
<hr WIDTH="100%">
|
|
|
|
</body>
|
|
|
|
</html>
|