Difference between revisions of "WinCE Programming Tips/ru"

From Free Pascal wiki
Jump to navigationJump to search
m
Line 33: Line 33:
  
 
* http://hpcmonex.net/izemize.htm
 
* http://hpcmonex.net/izemize.htm
 +
 +
==== Не тот процессор ====
 +
 +
Возможно, на устройстве установлен не 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
 +
  //some of consts already found in Windows
 +
  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>

Revision as of 18:53, 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

 //some of consts already found in Windows
 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>