Thanks very much for the reply, now I can get nsIComponentRegistrar.enumerateContractIDs to work. This is my first milestone that I can get something to work using swt+mozilla :-)
Let me explain my approach.
In swt for win32, there has a lot of predefined native methods calls, the most useful one to me is (there is a set of methods like this in swt, with different parameter types):
COM.VtblCall( fnNumber, ppVtbl, arg0, arg1, ...... )
The swt include native implementation for these Java methods.
Then in my java code, I can do things as:
public nsISimpleEnumerator enumerateContractIDs() {
int result[] = new int[1];
XPCOM.checkException(COM.VtblCall(12, address, result));
return new nsISimpleEnumerator(result[0]);
}
(XPCOM is my helper class)
This are all Java methods, without going to the native code. (I am more comfortable with java code than C/C++, so C/C++ guys please forgive me :-)
Currently, I only have a very small set of my own native code, including loading the xpcom.dll file, and calling the NS_InitXPCOM2, NS_GetComponentManager, etc. I try to limit my dependency on the Mozilla system only to the xpcom.dll file. That is, I do not want include Mozilla include files, I do not want to link with mozilla libraries, etc. In my native code, I just call LoadLibaray("xpcom") and GetProcAddress()
My first runnable test main file look as: (setting the work directory to c:\mozilla)
public static void main(String[] args) {
Embed.NS_InitEmbedding(0,0);
nsIComponentRegistrar registrar = Embed.getComponentRegistrar();
nsISimpleEnumerator enum = registrar.enumerateContractIDs();
int count = 0;
while( enum.hasMoreElements()) {
nsISupports s = enum.getNext();
nsISupportsCString cstring = (nsISupportsCString)s.queryInterface(nsISupportsCString.class);
s.Release();
System.out.println(cstring.toString());
cstring.Release();
}
Embed.NS_TermEmbedding();
}
The output look as follows:
@mozilla.org/persistent-properties;1
@mozilla.org/file/local;1
@mozilla.org/supports-PRUint64;1
......
@mozilla.org/supports-void;1
@mozilla.org/consoleservice;1
@mozilla.org/arena;1
com.voxa.swt.xpcom.XPCOMException: XPCOMException, code=-2147467259
at com.voxa.swt.xpcom.XPCOM.checkException(XPCOM.java:98)
at com.voxa.swt.xpcom.nsISimpleEnumerator.getNext(nsISimpleEnumerator.java:66)
at com.voxa.swt.xpcom.test.TestMain.main(TestMain.java:28)
Exception in thread "main"
I still don't know why I get an exception, I think after hasMoreElements() return true, should not have this exception any more. Maybe my hasMoreElements() implementation has some problem, I need to look.
Then the following are my further questions:
1. As in the printed out contrat IDs, I didn't find "@mozilla.org/embedding/browser/nsWebBrowser;1", I think it means this component is not registered. What should I do to make it to be registered? (same as the fifth question in previous post)
2. For the nsISupportsCString.toString() method, I receive a "string" pointer, do I need to call any method to release the memory associated with it? If yes, which method should I call? NS_GetMemoryManager.free(ptr)? I tried this, but seemed it do not return NS_OK.
3. Currently I am hand coding those nsI... classes in Java, which is a tedious work, and easy for making error, especially those fnNumbers. Is there any easy way to extend XPIDL to generate Java code?
4. For AString and ACString, when I receive these from XPCOM calls, as I said, I am only using xpcom.dll file, so there is no nsAString.h file included in my native code, in such as situation, how can I manipulate it? Can I also manipulate it using the vtbl? If I can, what is the binary vtbl format for it?
BTW, to answer my own first question in previous post, it seemed that XPCOM is binary compatible with COM/OLE vtable on win32.
Thanks in advance.
yang
Doug Turner wrote:
jml wrote:1. Is XPCOM binary compatible with COM/OLE?
In swt, it use vtbl to call COM/OLE methods. I want to just use that provided by swt, then I needn't write my native code.
XPCOM uses vtbls as well as its binary format. How compatiblity XPCOM is wrt COM/OLE, i am not sure.
What native code would you have to write if XPCOM wasn't compatible with COM/OLE. I am not sure I completely follow.
2. what is the "string"/"wstring"/"domstring" mean in XPCOM?
What is the binary format of each of them? Since I need to package the java String into a memory buffer then pass the pointer of the buffer to XPCOM methods, so I need to know the format for this buffer.
These types map to the AString and ACString. Take a look at the nsEmbedString for a very light implementation of this virtual class.
http://lxr.mozilla.org/seamonkey/source/xpcom/glue/standalone/nsEmbedString.cpp#40
3. Is there anything similiar to IDispatch? How I do dynamically get property and call methods?
Nothing for public comsumption. Note that there has been some work done to allow communication with COM objects that support IDispatch interfaces. However, there is nothing in XPCOM that directly supports a IDispatch like interface.
4. How does nsIComponentRegistrar.enumeratoeContractID work?
What will the nsISimpleEnumerator.getNext() return then? It seemed in mozilla, the documentation is too little.
I just posted a response to this in the .xpcom newsgroup. (The contract id enumeration can be QI'ed for nsISupportsCString. The cid enumeration can be QI'ed for a nsISupportsID.)
5. How I make the web
component to be registered?
Registered by what or how?
Have you taking a look a the embedding documentation. It explains many parts of the Gecko system which will aide you in embedding Gecko into swt.
http://www.mozilla.org/projects/embedding/
Regards,
Doug Turner
[EMAIL PROTECTED]
