#include "nsISupports.idl"
[scriptable,uuid(8CE2C123-8386-44EC-AACB-04D8EAFF58B5)]
interface IMyComponent : nsISupports
{
long Add(in long a , in long b);
};
#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
NS_DECL_IMYCOMPONENT
MyComponent(void);
~MyComponent(void);
};
#endif
#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_ISUPPORTS1(MyComponent,IMyComponent)
#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
转载请注明原文地址:https://blackberry.8miu.com/read-47070.html