目前我正在开发一个DLL,它旨在链接到第三方应用程序,以测试此应用程序是否有资格在给定时间运行。
首先,我考虑创建一个DLL并在TInt E32Dll()
函数中处理所需的检查。但是当我读到EKA2中的DLL加载/卸载没有调用此函数时,我感到非常惊讶。
所以现在我需要另一种方法来完成我的任务。我的目标是创建一些可以嵌入第三方应用程序的机制。应该在应用程序启动时调用此机制,执行一些检查(存在特定的Symbian服务器),如果检查失败,则应终止应用程序。另一个要求是这种机制应该对这些第三方应用程序的开发人员来说是透明的。 (E32Dll()函数是最佳候选者 - 只需将特定库链接到项目即可完成...)
我会非常感谢任何其他想法。提前致谢。
答案 0 :(得分:1)
我实际上找到了实现目标的方法 - 在加载DLL时调用一些方法。这个想法是在http://developer.symbian.org/forum/showthread.php?p=30244给我的。
只需要在某个DLL模块中声明一些全局对象,并在加载DLL时调用其构造函数。这个解决方案对我来说很好,事实上,这个答案应该被接受......
...但由于我不是这个解决方案的作者,而且目前接受的答案仍然包含有价值的信息,我不会改变接受的标记。就这样吧。 :)
答案 1 :(得分:0)
我不确定在E32Dll()中做某事,即使它起作用(但它没有找到)是一个好方法,因为在关闭应用程序之前,你必须向用户显示一些通知或对话框。为什么不制作一个普通的DLL +瘦启动代码,它将加载(使用RLibrary)并调用第一个序数函数:
RLibrary library;
//UID
TUidType uidType( TUid::Uid(KDynamicLibraryUidValue),
TUid::Uid(KMyInterfaceUid),
TUid::Uid(KMyImplementationUid) );
// Open dll
User::LeaveIfError( library.Load( KMyDll, uidType ) );
// Check the exported method
TLibraryFunction ordinal1 = aLibrary.Lookup( 1 );
// Call the method...
if ( ordinal1 )
ordinal1();
library.Close();
BR 斯登
您好Haspemulator,您的评论有我的答案:
1)不,第一个序号不是 E32Dll(),因为EKA2不能调用此方法。请查看以下说明(http://developer.symbian.org/wiki/Symbian_OS_Internals/10._The_Loader):
请注意,在EKA2中,不再调用公共DLL入口点E32Dll(TDllReason)。此函数必须存在于每个EKA1 DLL中,以便在DLL附加到进程或线程或从进程或线程分离时调用。不幸的是,这个入口点系统无法保证在指定时间使用适当的参数调用E32Dll()。由于无法可靠地支持此功能,因此EKA2不再支持此功能。此删除简化了用于管理动态加载代码的内核端体系结构,从而提高了可靠性和健壮性。
2)您也可以在此处找到有关此主题的有趣讨论: http://discussion.forum.nokia.com/forum/showthread.php?80781-What-is-the-replacement-for-E32Dll-and-TDllReason
3)在我们的例子中,第一个序数将是你将从DLL导出的第一个函数。您可以在此处找到有关如何编写此类DLL的信息: http://developer.symbian.org/main/documentation/reference/s3/pdk/GUID-4A56B285-790E-5171-88F3-8C40B2AA9699.html
4)更具体的是我从DLL导出方法的意思是检查下面的代码(该方法当然可以返回一些变量 - 例如新创建的对象):
EXPORT_C void InitDll()
{
// Put here your code
}
希望它有所帮助...... BR 斯登