symbian: точка входа в DLL для EKA2 или аналогичного?

В настоящее время я разрабатываю DLL, которая предназначена для связи со сторонними приложениями, чтобы проверить, может ли это приложение запускаться в данный момент времени.

Сначала я подумал о создании DLL и обработке необходимой проверки в функции TInt E32Dll(). Но я был очень удивлен, когда прочитал, что эта функция не вызывается при загрузке/выгрузке DLL в EKA2.

Итак, теперь мне нужен другой способ выполнить мою задачу. Моя цель — создать какой-то механизм, который можно встроить в сторонние приложения. Этот механизм должен вызываться при запуске приложения, выполнять некоторую проверку (наличие определенного сервера Symbian), и если проверка не удалась, он должен завершить работу приложения. Другое требование состоит в том, что этот механизм должен быть в лучшем случае прозрачен для разработчиков этих сторонних приложений. (Функция E32Dll() была лучшим кандидатом - просто свяжите конкретную библиотеку с проектом, и все готово...)

Буду очень признателен за любые другие идеи. Заранее спасибо.


person Haspemulator    schedule 22.10.2010    source источник


Ответы (2)


Я не уверен, что делать что-то в E32Dll(), даже если это работает (но это не так, как вы понимаете), это хороший способ, потому что перед закрытием приложения вы должны показать какое-то уведомление или диалог пользователю. Почему бы не сделать нормальную DLL + тонкий стартовый код, который будет грузиться (используя RLibrary) и вызывать 1-ю порядковую функцию:

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();

БР СТЭН


Привет, Haspemulator! Вот мой ответ на ваш комментарий:

1) Нет, 1-й порядковый номер не E32Dll(), этот метод нельзя вызывать, начиная с EKA2. Ознакомьтесь с приведенным ниже описанием (http://developer.symbian.org/wiki/Symbian_OS_Internals/10._The_Loader):

Обратите внимание, что в EKA2 больше не вызывается общедоступная точка входа DLL, E32Dll(TDllReason). Эта функция должна присутствовать в каждой DLL-библиотеке EKA1, чтобы вызываться, когда DLL-библиотека присоединяется к процессу или потоку или отсоединяется от него. К сожалению, эта система точек входа не может гарантировать, что E32Dll() будет вызвана с соответствующим параметром в указанное время. Поскольку надежно поддерживать эту функцию невозможно, EKA2 отключает ее поддержку. Это удаление упрощает архитектуру на стороне ядра для управления динамически загружаемым кодом, что повышает надежность и надежность.

2) Вы также можете найти интересное обсуждение этой темы здесь: http://discussion.forum.nokia.com/forum/showthread.php?80781-What-is-the-replacement-for-E32Dll-and-TDllReason

3) В нашем случае 1-й порядковый номер будет 1-й функцией, которую вы экспортируете из 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 STeN


person STeN    schedule 23.10.2010
comment
Является ли первая порядковая функция всегда E32Dll()? - person Haspemulator; 25.10.2010
comment
Привет, я поместил свой комментарий в исходный ответ, так как комментарий имеет ограниченное пространство... BR - person STeN; 25.10.2010

Я действительно нашел способ достичь своей цели - вызвать какой-то метод при загрузке DLL. Идея была дана мне на http://developer.symbian.org/forum/showthread.php?p=30244.

Достаточно просто объявить какой-то глобальный объект в каком-нибудь DLL-модуле, и его конструктор будет вызываться при загрузке DLL. Это решение отлично работает для меня, и действительно, этот ответ действительно должен быть принят...

... Но поскольку я не являюсь автором этого решения, и принятый в настоящее время ответ по-прежнему содержит ценную информацию, я не буду менять отметку о принятии. Просто пусть будет так. :)

person Haspemulator    schedule 25.10.2010
comment
Привет, это интересная идея! Просто имейте в виду возможные недостатки этого - но я не уверен в них: 1) Статические данные, которые обычно доступны для записи, не разрешены в DLL, но проверьте флаг EPOCALLOWDLLDATA. 2) Как вы будете загружать DLL? Если вы будете использовать RLibrary, то мой способ более удобен, но если вы хотите действительно автоматизировать его и будете использовать статическую привязку, то я не уверен, что действительно инициализируется во время создания «DLL-объекта», например будет ли CleanupStack инициализирован или нет? 3)Есть некоторые ограничения на то, что можно и что нельзя делать в конструкторах на Symbian... BR STeN - person STeN; 26.10.2010
comment
Спасибо за идею проверить стек очистки! Я почти уверен, что все библиотеки инициализируются перед основной точкой входа, поэтому не будет CleanupStack и ActiveScheduler. И, конечно, этот хлам никуда не денется... - person Haspemulator; 27.10.2010