DLLpiton.net.ru
Главная
Главная
Форум
Магазин
- - - - - - -
Исходники
Статьи
Материалы
FTP
- - - - - - -
Поиск
Каталог ссылок
Контакты
Ленты новостей
Ча.Во. (FAQ)
Анекдоты
Java программы
Доска заказов программ
Лицензия Dllpiton
Кто на сайте?
Сейчас на сайте находятся:
44 гостей
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Наши спонсоры:

Экспорт новостей
 
Последние новости
 
Вызовы библиотек Symbian C++ в приложениях NET60 Печать E-mail
Вызовы библиотек Symbian C++ в приложениях NET60

 Чистый .NET CF, как известно, не имеет средств для доступа к различным
мультимедийным возможностям смартфона (GPS,Камера,Bluetooth,WiFi,Акселерометр).
Разработчики же под Windows Mobile пользуются встроенными в WM библиотеками для
работы с таким функциями. Но для программистов на NET60 есть выход:
дело в том, что доступ и работа со всеми функциями Symbian OS используется
множество различных библиотек (API), net60 позволяет получить доступ к этим
библиотекам. Вызов библиотеки производится абсолютно так же как вызов API
в Windows.

 Для начала необходимо скачать и установить Symbian S60 SDK,
В ней есть вся документация по API Symbian, без которой нам не
обойтись, и библиотеки.
 Еще нужен CSL Arm Toolchain
В нем есть средство, позволяющее выводить списки API функций из
определенных библиотек.

 Создадим P_Invoke приложение образец

Приложение использует класс Maths, который содержит математические
функции: log,in,pow,sin,cos. В образце будет использоваться функция
pow, которая возводит число y в степень x.

   Screen

 Класс Math Wrapper
В основе приложения состоит класс-обертка для API класса Math, 
расположенного в библиотеке euser.dll

Листинг класса MathWrapper.cs (С#):

/////////////////////////////////////////////////////////////////

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;


namespace RedFiveLabs.Wrappers
{
  ///
  /// Managed wrapper around CHWRMMath
  /// Defined in HWRMMathClient.lib 
  ///
  /// 

  public class MathWrapper
  {
  // private GCHandle _handle;

  public MathWrapper()
  {
  }

  public static double Pow(double x, double y)
  {
  double answer = 0.0;

  ErrorCode result = Pow(ref answer, ref x, ref y);

  if (result != ErrorCode.KErrNone)
  throw new SymbianException("Failed to call Pow(x,y)", result);

  return answer;
  }
   
  [DllImport("euser.dll", EntryPoint = "#539")] // Вызов функции из euser.dll
  //Что такое EntryPoint, станет понятно позже
  private static extern ErrorCode Pow(ref double answer, ref double x, ref double y); 
  // Объявление функции Pow из этой библиотеки
  }
}


 /////////////////////////////////////////////////////////////////// 

  
 Теперь можно вызвать функцию в форме (Form1.cs):

////////////////////////////////////////////////////////////////////

private void menuItem3_Click(object sender, EventArgs e) //Нажатие третьей кнопки меню
  {
  try
  {

  label1.Text = MathWrapper.Pow(x, y).ToString(); //Вот и сама функция
  }

  catch (Exception ex) //В случае ошибки
  {
  Console.WriteLine("{0} Exception caught.", ex);
  label1.Text = "";
  }


  }

//////////////////////////////////////////////////////////////////////


 Как же узнать, какие функции содержатся в библиотеках?
Для начала можно посмотреть API функции в документации SDK (SDK Help),
обязательно узнать, в какой библиотеке содержится нужная функция.
Вот часть страницы из SDK, содержащая информацию о классе Math:

Location: e32math.h 
Link against: euser.lib 

Class Math
class Math;
Description
A collection of mathematical functions. 

Members
Defined in Math: 
ACos(), ASin(), ATan(), ATan(), Cos(), DivMod64(), DtoR(), Exp(), FRand(), Frac(), Int(), Int(), Int(), IsFinite(), IsInfinite(), IsNaN(), IsZero(), Ln(), Log(), Mod(), Mul64(), Poly(), PolyX(), Pow(), Pow10(), Rand(), Random(), Round(), Sin(), Sqrt(), Tan(), UDivMod64(), UMul64() 

Далее приведены подробные описания каждой функции. На странице видим название
библиотеки, содержащей класс Math: euser.dll
 Чтобы получить список параметров и функций API понадобится nm.exe из комплекта 
CSL ARM Toolchain
 Открываем командную строку и вводим следующие команды:

cd C:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\armv5\lib
"C:\Program Files\CSL Arm Toolchain\arm-none-symbianelf\bin\nm.exe" euser.LIB --demangle

 Первая строка устанавливает текущим путь к библиотекам в SDK
(Естественно, в разных версиях SDK путь будет немного отличаться)
 далее запускается nm.exe, получает дланные из библиотеки euser.LIB
(хотя имя библиотеки в приложении указывается с расширением .dll, здесь
нужно вводить .LIB!).
 Параметр --demangle делает отчет более читабельным
 В конце можно указать имя файла для записи отчета:
 > "c:\temp\ordinals.txt"
Тогда получается так:

cd C:\Symbian\9.2\S60_3rd_FP1\Epoc32\release\armv5\lib
"C:\Program Files\CSL Arm Toolchain\arm-none-symbianelf\bin\nm.exe" euser.LIB --demangle > "c:\temp\ordinals.txt"

В случае, если не указывать файл, то на экран будет выведен список
функций указанной библиотеки.Если была запись в файл, то список
можно просмотреть в нем

В списке надо нйти нужную функцию pow:

euser{000a0000}-539.o:
U #euser{000a0000}[100039e5].dll#<\DLL>21b
00000000 T Math::Pow(double&, double const&, double const&)
0000000004 t theImportedSymbol

Число 539 в верхней строке является порядковым номером функции.
Именно это число мы указывали в качестве параметра EntryPoint:

[DllImport("euser.dll", EntryPoint = "#539")] 
private static extern ErrorCode Pow(ref double answer, ref double x, ref double y)

В третьей строке есть название класса и функции.
При вызове функции название класса не учитывается.
 Этими действиями мы получили всю нужную информацию для импорта.

 Скачать готовый проект приложения PI_Invoke для VS 2005 можно здесь.
 
След. »
 
 
 
30.07.2010 г.
up!