plug-in本质是一个dll
mmp文件是这样的
TARGET ShoutcastEngine.dll
TARGETTYPE PLUGIN
UID 0x10009D8D 0xE020240A
这个dll是对某种interface的实现,这个interface的定义如下:
#define KInternetRadioAdapterInterfaceUid 0x1020240E //定义接口的id
class MInternetRadioAdapter //接口函数的声明
一般M类不能通过指针记录保存下来,所以定义一个C类继承至M类,但是基本什么都不做。
class CPluginAdapter : public CBase,
public MInternetRadioAdapter
{
//这个接口的实现类可以通过Observer向调用者回调
MInternetRadioAdapterObserver *iObserver;
}
所以,plug-in现在要做的就是要实现M类接口,其实就是从CPluginAdapter 继承! 但是接口可以有多种实现,这样就需要一个实现ID,调用者可以根据需要调用不同的实现,但是代码不需要很多改动!
最后,plug-in需要向ECom组件注册,能够让外界找到自己!symbian是这样做的,为这个DLL同时生成RSS文件,向系统注册自己。
RESOURCE REGISTRY_INFO theInfo { dll_uid = KShoutcastDLLUid; interfaces = { INTERFACE_INFO // PluginAdapter
{ interface_uid = KAudioAdapterInterfaceUid; implementations = { IMPLEMENTATION_INFO { implementation_uid = KShoutcastImplementationUid; version_no = 1; display_name = "Shoutcast Engine Plugin"; default_data = "Shoutcast"; opaque_data = ""; } }; } }; }
|
这里最主要的三个ID分别是:
DLL ID - OS范围内识别该DLL的
Interface ID - 调用者通过REComSession::ListImplementationsL(TUid::Uid(KInternetRadioAdapterInterfaceUid), infoArray);指明Interface ID可以将自己曝露
Implementation ID - 调用者可以通过impl = REComSession::CreateImplementationL(implementationUid, _FOFF(CPluginAdapter,iDestructorIDKey), this);这个ID创建接口实现对象,最后一个this参数将会作为实现类的观察者。
因此,设计plug-in最重要的就是要设计接口。接口是调用者和实现类之间交互的方式,只有接口设计好了,plug-in才能有多种实现。
阅读(2071) | 评论(0) | 转发(0) |