xpcom组件样例

    科技2026-08-29  5

    #include "nsISupports.idl" [scriptable,uuid(8CE2C123-8386-44EC-AACB-04D8EAFF58B5)] interface IMyComponent : nsISupports { long Add(in long a , in long b); }; /*Component.h*/ #pragma once #ifndef _MY_COMPONENT_H_ #define _MY_COMPONENT_H_ #include "IMyComponent.h" #define MY_COMPONENT_CONTRACTID "@wangwei/XPCOMSample/MyComponent;1" #define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample" #define MY_COMPONENT_CID {0x8ce2c123, 0x8386, 0x44ec, { 0xaa, 0xcb, 0x04, 0xd8, 0xea, 0xff, 0x58, 0xb5 }} class MyComponent : public IMyComponent { public: NS_DECL_ISUPPORTS //声明ISuppotrs接口的方法,包含mRefCnt NS_DECL_IMYCOMPONENT //声明IMyComponent接口方法 MyComponent(void); ~MyComponent(void); }; #endif /*MyComponent.cpp*/ #include "Component.h" MyComponent::MyComponent(void) { } MyComponent::~MyComponent(void) { } NS_IMETHODIMP MyComponent::Add(int32_t a, int32_t b, int32_t *_retval) { *_retval = a + b; return NS_OK; } //NS_IMPL_ISUPPORTSn 为指定类实现nsISupports,此类有n个接口 NS_IMPL_ISUPPORTS1(MyComponent,IMyComponent) /*MyComponentModule.cpp*/ #include "mozilla/ModuleUtils.h" #include "nsIClassInfoImpl.h" #include "Component.h" NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent) NS_DEFINE_NAMED_CID(MY_COMPONENT_CID); static const mozilla::Module::CIDEntry kSampleCIDs[] = { { &kMY_COMPONENT_CID,false,nullptr, MyComponentConstructor}, { nullptr } }; static const mozilla::Module::ContractIDEntry kSampleContracts[] = { { MY_COMPONENT_CONTRACTID, &kMY_COMPONENT_CID }, { nullptr } }; static const mozilla::Module::CategoryEntry kSampleCategories[] = { {"my-category", "my-key", MY_COMPONENT_CONTRACTID }, { nullptr } }; static const mozilla::Module kSampleModule = { mozilla::Module::kVersion, kSampleCIDs, kSampleContracts, kSampleCategories }; NSMODULE_DEFN(nsSampleModule) = &kSampleModule; NS_IMPL_MOZILLA192_NSGETMODULE(&kSampleModule) GECKO_SDK_PATH = /root/xulrunner-sdk GECKO_INCLUDES = -I$(GECKO_SDK_PATH)/include -I$(GECKO_SDK_PATH)/include/nspr CPP = g++ CPPFLAGS += -fno-rtti -fno-exceptions -shared GECKO_DEFINES = -DXPCOM_GLUE GECKO_LDFLAGS = -L$(GECKO_SDK_PATH)/lib -lxpcomglue -lnspr4 -lplds4 build: idl MyComponent.o MyComponentModule.o $(CPP) $(CPPFLAGS) -o libMyComponent.so $(GECKO_DEFINES) $(GECKO_LDFLAGS) MyComponent.o MyComponentModule.o chmod +x libMyComponent.so idl: IMyComponent.idl ${GECKO_SDK_PATH}/sdk/bin/header.py --cachedir=cache -I ${GECKO_SDK_PATH}/idl -o IMyComponent.h IMyComponent.idl ${GECKO_SDK_PATH}/sdk/bin/typelib.py --cachedir=cache -I ${GECKO_SDK_PATH}/idl -o IMyComponent.xpt IMyComponent.idl %.o:%.cpp $(CPP) $(GECKO_INCLUDES) -fPIC -c -o $@ $*.cpp .PHONY : clean clean: xpcomclean xpcomclean: -rm -rf *.o -rm -rf *.so nsCOMPtr<ICalculate> iSample = do_CreateInstance(CALCULATE_CONTRACTID, &rv); nsCOMPtr.h: nsCOMPtr<T>& operator=( const nsCOMPtr_helper& rhs )->assign_from_helper nsCOMPtr_helper重载了()运算符 nsComponentManagerUtils.h: do_CreateInstance->nsCreateInstanceByContractID : public nsCOMPtr_helper nsCreateInstanceByContractID重载了()运算符->CallCreateInstance->CreateInstanceByContractID nsComponentManager.cpp: nsComponentManagerImpl::CreateInstanceByContractID->GetFactoryEntry->GetFactory nsNativeComponentLoader.cpp: nsNativeComponentLoader::GetFactory->GetFactoryFromModule->GetModule-> xcDll.cpp: nsDll::GetModule->FindSymbol(NS_GET_MODULE_SYMBOL)->PR_FindSymbol prlink.c: 找到库文件中NSGetModule函数指针,并调用它,实例化出来的对象指针传递上去 PR_FindSymbol->pr_FindSymbolInLib->GetProcAddress/dlsym nsModule.h: #define NS_GET_MODULE_SYMBOL "NSGetModule" CalculateModule.cpp中NS_IMPL_NSGETMODULE宏定义了NSGetModule函数指针 NSGetModule->NS_NewGenericModule2->new nsGenericModule
    Processed: 0.014, SQL: 9