代码之家  ›  专栏  ›  技术社区  ›  Haspemulator

塞班:eka2或类似的dll入口点?

  •  0
  • Haspemulator  · 技术社区  · 14 年前

    目前,我正在开发一个DLL,它旨在链接到第三方应用程序,以测试此应用程序是否有资格在给定时间运行。

    首先,我想创建一个DLL并处理所需的签入 TInt E32Dll() 功能。但是当我读到在eka2中的dll加载/卸载时没有调用这个函数时,我非常惊讶。

    所以现在我需要另一种方法来完成我的任务。我的目标是创建一些可以嵌入到第三方应用程序中的机制。应在应用程序启动时调用此机制,执行一些检查(存在特定的Symbian服务器),如果检查失败,则应终止应用程序。另一个要求是,该机制对那些第三方应用程序的开发人员最好是透明的。(e32dll()函数是最好的候选函数-只需将特定的库链接到一个项目,就可以完成…)

    我会非常感激其他的想法。事先谢谢。

    2 回复  |  直到 14 年前
        1
  •  0
  •   STeN    14 年前

    我不确定在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();
    

    溴 斯坦


    您好,我是您的回复:

    1)不,第一个序数不是 e32dll()。 ,无法调用此方法,因为eka2。检查下面的描述( http://developer.symbian.org/wiki/Symbian_OS_Internals/10._The_Loader ):

    注意,在eka2中,公共dll入口点e32dll(tdlreason)不再被调用。此函数必须存在于每个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 
    }
    

    希望有帮助… 溴 斯坦


        2
  •  1
  •   Haspemulator    14 年前

    我已经找到了实现我目标的方法——当加载dll时调用一些方法。这个想法是在 http://developer.symbian.org/forum/showthread.php?p=30244

    只需在某些dll模块中声明一些全局对象,当加载dll时将调用其构造函数。这个解决方案对我来说很好,而且,事实上,这个答案应该被接受…

    …但是由于我不是这个解决方案的作者,而且目前接受的答案仍然包含有价值的信息,所以我不会改变接受的标志。就这样吧。:)