|
Кто на сайте? |
Сейчас на сайте находятся: 22 гостей |
|
|
|
|
Вызовы библиотек Symbian C++ в приложениях NET60 |
|
|
Вызовы библиотек 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.
Класс 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 можно здесь.
|
|
|
|
|
|
|
|