Difference between revisions of "WinCE Programming Tips/ru"

From Free Pascal wiki
Jump to navigationJump to search
Line 114: Line 114:
 
<delphi>
 
<delphi>
 
const
 
const
   //some of consts already found in Windows
+
   //Некоторые константы
 
   SIPF_OFF    = $00000000;
 
   SIPF_OFF    = $00000000;
 
   SIPF_ON    = $00000001;
 
   SIPF_ON    = $00000001;
Line 126: Line 126:
 
end;
 
end;
  
 +
</delphi>
 +
 +
Документация microsoft об этом: [http://msdn.microsoft.com/en-us/library/ms941818.aspx]
 +
 +
=== Включить/разбудить устройство ===
 +
Понадобится любителям будильников.
 +
 +
<delphi>
 +
function SetSystemPowerState(psState: PWideChar; StateFlags: DWORD; Options : DWORD):DWORD;
 +
stdcall; external 'coredll.dll' name 'SetSystemPowerState';
 +
 +
 +
  SetSystemPowerState(nil, POWER_STATE_ON, POWER_FORCE);
 +
  Application.BringToFront;
 +
  ShowWindow(Handle, SW_SHOW);
 +
</delphi>
 +
 +
=== Подсветка/вибрация ===
 +
Вы можете включать/выключать подсветку и вибратор.
 +
У меня работало нормально (а вот автор статьи говорит, что работает, но не так, как хотелось бы, и что, видимо будут доработки).
 +
 +
<delphi>
 +
const
 +
  NLED_COUNT_INFO_ID = 0;
 +
  NLED_SUPPORTS_INFO_ID = 1;
 +
  NLED_SETTINGS_INFO_ID = 2;
 +
 +
type
 +
  TNLED_COUNT_INFO = record
 +
    cLeds: DWORD;
 +
  end;
 +
 
 +
  TNLED_SETTINGS_INFO = record   
 +
    LedNum: DWORD;                // LED number, 0 is first LED
 +
    OffOnBlink: Integer;          // 0 = выкл, 1 = вкл, 2 = мигание
 +
    TotalCycleTime: DWORD;        // Общее время мигания в микросекундах.
 +
    OnTime: DWORD;                // Время вкл. в цикле в микросекундах.
 +
    OffTime: DWORD;                // Время выкл. в цикле в микросекундах.
 +
    MetaCycleOn: Integer;          // Число вкл. циклов миганий
 +
    MetaCycleOff: Integer;        // Число выкл. циклов миганий
 +
  end;
 +
 +
  function NLedGetDeviceInfo(nID:Integer; var pOutput): WordBool;
 +
  stdcall; external 'coredll.dll' name 'NLedGetDeviceInfo';
 +
  function NLedSetDevice(nID: Integer; var pOutput): WordBool;
 +
  stdcall; external 'coredll.dll' name 'NLedSetDevice';
 
</delphi>
 
</delphi>

Revision as of 19:11, 20 August 2010

WinCE Logo.png

Эта статья относится только к WinCE.

См. также: Multiplatform Programming Guide

English (en) русский (ru)

На этой странице описано несколько приёмов работы с платформой WinCE.

Other Interfaces

Platform specific Tips

Interface Development Articles

Советы / ЧаВо

Приложение работает на эмуляторе, но не работает на устройстве

Когда приложение запущено на эмуляторе, всё нормально, однако на устройстве возникает ошибка типа:

Cannot find 'project1' (or one of its components).

'project1' (или один из компонентов) не найден.

Возможно, ошибка возникает, потому что:

Отсуствует aygshell.dll

Эта ошибка обычно указывает на отсутствие библиотеки на целевом устройстве, особенно если у вас приложение типа "Hello World". Часто это связано с библиотекой aygshell.dll, которая отсуствует на многих устройствах под управлением "голых" Windows CE - как правило, на устройствах под управлением Windows Mobile этой проблемы не возникает.

Эта проблема наблюдалась на считывателях штрих-кодов motorolla, работавших под WinCE 4.2 и 5.

Проблема решается распространением aygshell.dll вместе с программой(кажется, так делает gps-программа navitel).

Вот пара ссылок на темы форума freepascal.org, где обсуждаются проблемы с aygshell.dll(на английском):

А здесь(тоже на английском) изменения в версиях библиотеки aygshell.dll:

Не тот процессор

Возможно, на устройстве установлен не ARM, наиболее распространённый, а x86 или MIPS. Тут уж ничего не поделаешь.

Отсутствие функций из-за версии операционной системы

Возможно, операционная система очень старая, и в ней просто нет функций, используемых Lazarus'ом.

Получить ID устройства

Идентификация устройства полезна для защиты вашей программы. Работает только на windows mobile 5.1 и 5.2 <delphi>

function GetDeviceUniqueID(AppData:LPCWSTR; cbApplictionData:Integer; dwDeviceIDVersion:Integer;

var deviceIDOuput; var pcbDeviceIDOutput:DWORD):Integer; external 'coredll.dll' name 'GetDeviceUniqueID';

function GetDeviceID: string; var

 AppData: array[0..19] of WideChar;
 DeviceID : array[0..19] of Byte;
 Count: DWORD;
 s: string;
 Res, i:Integer;

begin

 //not sure about Unicode
 AppData := Utf8Decode('MY_SIG');
 Count := SizeOf(DeviceID);
 FillChar(DeviceID, Count, #0);
 Res := GetDeviceUniqueID(AppData, SizeOF(AppData), 1, DeviceID, Count);
 if Res = 0 then
 begin
   Result := ;
   for i := 0 to Count -1 do
   begin
     if (i > 0) and ((i mod 2) = 0) then
       Result := Result + '-'; //add space make the string wrap in label
     Result := Result + IntToHex(DeviceID[i], 2);
   end;
 end
 else
   Result := ;//error accord

// you can MD5 it with your string // Result := MD5Print(MD5Buffer(DeviceID, Count)); end; </delphi>

Ссылки: http://msdn2.microsoft.com/en-us/library/ms893522.aspx http://peterfoot.net/RetrieveIMEIThroughTAPI.aspx http://blogs.msdn.com/jehance/archive/2004/07/12/181067.aspx

Получить имя устройтсва

Это легко стелать через реестр:

<delphi> function GetDeviceName: string; var

 aReg:TRegistry;

begin

 aReg := TRegistry.Create(KEY_READ);
 try
   aReg.RootKey := HKEY_LOCAL_MACHINE;
   aReg.OpenKey('Ident', False);
   if aReg.ValueExists('Name') then
     Result := aReg.ReadString('Name')
   else
     Result := 'GUEST';
 finally
   aReg.Free;
 end;

end; </delphi>

Показать/спрятать SIP Panel

Виртуальная клавиатура для сенсорных экранов(SIP: Software Input Panel button).

<delphi> const

 //Некоторые константы
 SIPF_OFF    =	$00000000;
 SIPF_ON     =	$00000001;
 SIPF_DOCKED =	$00000002;
 SIPF_LOCKED =	$00000004;

function SipShowIM(IPStatus:DWORD):Integer; stdcall; external 'coredll.dll' name 'SipShowIM';

begin

 SipShowIM(SIPF_ON)

end;

</delphi>

Документация microsoft об этом: [1]

Включить/разбудить устройство

Понадобится любителям будильников.

<delphi> function SetSystemPowerState(psState: PWideChar; StateFlags: DWORD; Options : DWORD):DWORD;

stdcall; external 'coredll.dll' name 'SetSystemPowerState';


 SetSystemPowerState(nil, POWER_STATE_ON, POWER_FORCE);
 Application.BringToFront;
 ShowWindow(Handle, SW_SHOW);

</delphi>

Подсветка/вибрация

Вы можете включать/выключать подсветку и вибратор. У меня работало нормально (а вот автор статьи говорит, что работает, но не так, как хотелось бы, и что, видимо будут доработки).

<delphi> const

 NLED_COUNT_INFO_ID	= 0;
 NLED_SUPPORTS_INFO_ID	= 1;
 NLED_SETTINGS_INFO_ID	= 2;

type

 TNLED_COUNT_INFO = record
   cLeds: DWORD;
 end;
 
 TNLED_SETTINGS_INFO = record     
   LedNum: DWORD;                 // LED number, 0 is first LED
   OffOnBlink: Integer;           // 0 = выкл, 1 = вкл, 2 = мигание
   TotalCycleTime: DWORD;         // Общее время мигания в микросекундах.
   OnTime: DWORD;                 // Время вкл. в цикле в микросекундах.
   OffTime: DWORD;                // Время выкл. в цикле в микросекундах.
   MetaCycleOn: Integer;          // Число вкл. циклов миганий
   MetaCycleOff: Integer;         // Число выкл. циклов миганий
  end;
 function NLedGetDeviceInfo(nID:Integer; var pOutput): WordBool;
  stdcall; external 'coredll.dll' name 'NLedGetDeviceInfo';
 function NLedSetDevice(nID: Integer; var pOutput): WordBool;
  stdcall; external 'coredll.dll' name 'NLedSetDevice';

</delphi>