在 Symbian 平台编写多态 DLL






2.58/5 (9投票s)
本文演示了如何在 Symbian 上编写多态 DLL。
必备组件
- 需要掌握 C++ 和 COM 的知识。
- 需要了解 Symbian 编程习惯。
引言
编写多态 DLL 涉及以下步骤:
- 设计和编写接口。
- 实现接口。
让我们更详细地探讨这些步骤。
设计和编写包含方法声明的接口。
接口本质上是一个抽象类。一个例子可以使其更清晰:
class ICalculator { public: virtual TInt Sum(TInt, TInt) = 0; };
上面的代码片段声明了一个类 ICalculator
,其中包含一个名为 Sum
的方法,该方法接受 2 个 TInt
参数并返回一个 TInt
值。请注意类名。这样做是为了遵循约定,即接口名称应以“I”开头。现在,如果有人想实现 ICalculator
接口,他/她必须实现 Sum
方法。
COM 程序员可能会想知道,如果没有 UUID 或类似的东西,它如何成为一个接口。是的!在 Symbian 中,接口也需要 UUID。在编写接口时,UUID 的指定方式如下:
static const TUid KCalculator_DLLUID = {0x100039CE}; static const TUid KCalculator_DLLUID_Ver1 = {0x0352D96B}; class ICalculator { public: virtual TInt Sum(TInt, TInt) = 0; };
您的多态接口已准备就绪。您必须将其写入 .h 文件中,以便可以在其他 .cpp 文件中实现它。
实现接口。
完成接口声明后,编写多态 DLL 就完成了一半。现在需要实现它。实现接口就像继承抽象类一样简单。您必须从接口继承并实现接口的纯虚方法。
再次举例说明有助于我们理解:
class CImpCalculator: public ICalculator { public: EXPORT_C CImpCalculator* NewImpClass(); //function would be exposed through Function table TInt Sum(TInt num1,TInt num2); }; GLDEF_C TInt E32Dll(TDllReason) { return KErrNone; } EXPORT_C CImpCalculator* CImpCalculator::NewImpClass() { return new (ELeave) CImpCalculator; } TInt CImpCalculator::Sum(TInt num1,TInt num2) { return num1 + num2; }
上面的示例除了实现接口之外,还做了更多事情。类 CImpCalculator
有自己的方法 NewImpClass
。该方法具有限定符 EXPORT_C
。显然,这是从实现类暴露的方法。在 Symbian 中,并非需要从接口导出或暴露所有方法。只需要暴露返回接口对象(或者说实现类?)的方法。其余方法可以通过函数表访问。NewImpClass
方法返回指向新创建对象的指针。
每个多态 DLL 都必须编写 E32Dll
方法,因为 Symbian 运行时需要它。如果您忘记编写它,将会出现链接错误。此方法负责为 DLL 实例分配线程本地存储。
现在您可以编译和构建自己的 DLL 了。构建它并开始使用它。
最后,这些 DLL 被称为多态,因为可以编写相同接口的许多实现。此外,所有 Symbian GUI 应用程序都是多态 DLL。请查看 GUI SDK 示例,您会发现 E32Dll
方法已实现。
这就是您在 Symbian 上编写 DLL 所需的一切!请注意,我已在 NOKIA Series 60 模拟器上测试了代码。