Creating XPCOM Components written by Doug Turner and Ian Oeschger that introduces XPCOM and illustrates how to create XPCOM components for Gecko-based applications.
An introduction to XPCOM on IBM's website by Rick Parrish.
// Install script for helloworld var err; const APP_VERSION="0.0.0.1";//版本号 //初始化安装 err = initInstall("helloworld"+APP_VERSION, // name for install UI "/helloworld", // registered name APP_VERSION); // package version if(err!=0) {//安装出错,取消安装 cancelInstall(err); } //标准目录 var fProgram = getFolder("Program");//程序根目录 var fChrome = getFolder("Chrome");//chrome目录 var fComponents = getFolder("Components");//components目录 // workaround for Mozilla 1.8a3 and newer, failing to register enigmime correctly var delComps = [ "compreg.dat" ]; // Components registry for (var j=0; j<delComps.length; j++) { var delFile = getFolder(fComponents, delComps[j]); if (File.exists(delFile)) File.remove(delFile); } err = getLastError(); if (err == DOES_NOT_EXIST) { // error code: file does not exist resetError(); } elseif (err != SUCCESS) { cancelInstall(err); } // addDirectory: blank, archive_dir, install_dir, install_subdir addDirectory("", "components", fComponents, ""); addDirectory("", "chrome", fChrome, ""); err = getLastError(); if (err == ACCESS_DENIED) { alert("Unable to write to components directory "+fComponents+".\n You will need to restart the browser with administrator/root privileges to install this software. After installing as root (or administrator), you will need to restart the browser one more time, as a privileged user, to register the installed software.\n After the second restart, you can go back to running the browser without privileges!"); cancelInstall(ACCESS_DENIED); } elseif (err != SUCCESS) { cancelInstall(err); } else { // Register chrome registerChrome(PACKAGE | DELAYED_CHROME, getFolder("Chrome","helloworld.jar"), "content/helloworld/"); err = getLastError(); if (err != SUCCESS) { cancelInstall(err); } else { performInstall(); } }
2)在Componts文件夹中加入MyComponent.dll和IMyComponent.xpt
3)修改overlay.js如下:
// This is the main function const ENIG_C = Components; const ENIG_ENIGMAIL_CONTRACTID ="@mydomain.com/XPCOMSample/MyComponent;1" var gEnigmailSvc =null; function helloWorld() { try { alert("准备创建组件"); gEnigmailSvc = ENIG_C.classes[ENIG_ENIGMAIL_CONTRACTID].createInstance(ENIG_C.interfaces.IMyComponent);//创建实例 if(gEnigmailSvc!=null) { alert("创建组件成功"); gEnigmailSvc = gEnigmailSvc.QueryInterface(ENIG_C.interfaces.IMyComponent); } else { alert("创建组件失败"); return; } var res = gEnigmailSvc.Add(3, 4); alert('Performing 3+4. Returned '+ res +'.'); alert("创建结束"); } catch(ex) { alert("error"); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构