728x90
iPhone 광풍이 연일 전국을 휩쓸고 있습니다.
그동안 윈도우 모바일 개발을 하시던 분들이 참 씁쓸해 하시는 요즘입니다만,
여전히 산업용 시장에서 윈도우 CE 기반의 장비들이 많이 사용되고 있고
윈도우 모바일 기반의 컨슈머 제품들도 계속 출시되고 있으니
윈도우 모바일 7 의 성능 개선을 기대하며 내공을 증진시키시는게 중요한 시기가 아닌가 싶습니다.

요즘 몇가지 커스텀 컨트롤 개발을 하면서
상용으로 판매되는 제품들을 이리저리 살펴보고 있습니다.
mirabyte 라는 회사에서 " iPhone 터치 컨트롤을 닷넷에서! " 를 모토로 만든
Compact Framework (2.0 이상) 용 터치기반 UI 컨트롤 라이브러리입니다.



가격은 49.95 유로로 우리나라 돈으로 몇 만원 주시면 구입가능한 금액입니다.
트라이얼 버전도 제공하고 있고, 재배포에 대한 특별한 제약이 없으니
터치기반 어플리케이션 개발에 활용하기 딱 좋아 보입니다.

(그래도... 한번 따라 만들어 봐야겠죠? ^^)

- NoPD -
728x90
728x90
윈도우 모바일 계열의 단말기 제조에서 타의 추종을 불허하는 HTC. 이미 발매된 단말기들 뿐만 아니라 앞으로 발매될 단말기들도 늘 새로움으로 시장에 즐거움을 주고 있습니다. 특히나 HTC의 윈도우 모바일 기반 단말기들은 Shell 프로그램 자체도 상당히 완성도가 높아서 XDA 등의 개발자 네트워크에서는 새로운 쉘을 다른 단말기에 포팅하는 사례가 많이 올라오고 있지요.

오늘은 HTC 의 HD2 단말기에서 멀티터치 관련 API 가 발견되었다는 소식을 전해드립니다. 윈도우 모바일은 아직까지 멀티터치 기능이 지원되지 않는 것으로 알려져 있었는데, 공식 Release 되지 않은 Registry 영역에 대한 작업을 통해 멀티터치를 구현할 수 있다고 합니다. XDA-Developers 에 올라온 동영상을 감상해 보시겠습니다.





개발자가 직접 간단한 에제 샘플까지 올려두었으니, 한번 테스트 해보실 분들은 도전해 보시는 것도 괜찮을 것 같습니다. 해당 레지스트리 영역이 HTC 단말에만 있는 것인지 윈도우 모바일 6.5 OS 이미지 상에 HTC의 Shell 을 올리는 경우 생기는 것인지는 한번 확인해 봐야겠습니다.

http://forum.xda-developers.com/showpost.php?p=5042917&postcount=1

- NoPD -

728x90
728x90
윈도우 모바일에서 기본적으로 Form 을 열면 전체 화면에 출력되지가 않는다.
상단의 Task Bar 영역과 하단의 Menu 영역을 제외한 나머지 영역이
ClientRectangle 로 기본적으로 잡혀 있는 상태이기 때문이다.

전체 화면으로 어플리케이션의 Form 을 띄우기 위해서는
Form 에 Menu 객체를 제거한 다음
아래와 같이 간단한 코드를 생성자에 추가해 주면 된다.

public Form1()
{
    InitializeComponent();
    this.WindowState = FormWindowState.Maximized;
}

- NoPD -

728x90
728x90
윈도우 모바일 6 부터 기본적으로 SQL Server 2005 Compact Edition (이하 SQL CE)가 기본적으로 OS 이미지에 올라가 있습니다. 배포하는 과정 없이 쉽게 사용할 수 있다보니 이전보다 개발자들이 SQL CE를 자주 쓰는 듯한 요즈음입니다. 하지만 몇가지 이유들로 인하여 데이터 엑세스시에 Not Enough Storage 에러를 발생하는 경우가 있는 것 같습니다.

윈도우 모바일 6 의 DLL 메모리 적재 방식

모든 문제점들의 원인이라고 단정지을 수는 없지만 기본적으로 윈도우 모바일 6가 DLL을 메모리에 적재하는 방식에 대하여 한번 집고 넘어갈 필요가 있습니다. SQL CE 팀블로그에 올라온 포스팅(http://blogs.msdn.com/sqlservercompact/archive/2007/10/26/troubleshooting-can-t-load-sqlce-dll.aspx) 에서 해당 내용을 발췌해 봤습니다.

When a DLL is loaded in one process, Windows CE reserves that address space in every process address space. Multiple processes that use the same DLL share it at the same relative address in every process. If your application does not use the same DLL, it cannot use the memory that is reserved for that DLL. In other words, Windows CE does not map a RAM-based DLL at an address where another process maps another DLL. For example, if Process A loads DLL X at address 0x00970000, Windows CE does not map DLL Y in the Process B address space at 0x00970000. Instead, Windows CE seeks the next lower address that is available, depending on the size of DLL Y. So if DLL Y is in the size range of 128 KB, Windows CE selects 0x00950000 if that address is available for Process B. Because of the way that Windows CE allows processes to share a common DLL, Windows CE does not permit two different processes to load two different DLLs at the same relative address of each process.

당연할 이야기일지 모르지만 서로 다른 DLL 에게 동일한 메모리 어드레스를 할당하지 않는 다는게 요입니다. 당연한 이야기도 한정된 메모리 영역을 가지고 있는 스마트 디바이스로 넘어오면 치명적인 문제가 될 수 있습니다. 여러개의 분산된 DLL 을 동적으로 로딩하는 어플리케이션이 있다고 가정하면, 모든 DLL 들은 자신의 용량과 관계없이 최소한의 메모리 이격을 둔채 (본문에서 128KB) 메모리를 할당받게 될 것입니다. 이는 곳, 메모리 영역이 금방 소진될 수 있다는 의미가 됩니다.

닷넷 컴팩트 프레임워크와 메모리 적재 방식의 상관관계

컴팩트 프레임워크를 포함한 모든 닷넷 프레임워크는 관리코드 (Managed) 사용시에 자동으로 GC (Garbage Collector)가 사용하지 않는 메모리 영역의 객체 인스턴스를 해제하고 자원을 해제시킵니다. 그런데 컴팩트 프레임워크에서 사용되는 SQL CE 관련 객체들에 자원 해제와 관련한 내부적인 문제가 있는 것으로 보입니다.  (참고 : http://support.microsoft.com/kb/824462, SqlCeCommand objects are not automatically disposed if you use a SqlCeDataAdapter object)

If you use the SqlCeDataAdapter object to populate a DataSet object, and you do not explicitly call the Dispose method for all the associated SqlCeCommand instances, you may receive the following error message:
Error Code: 8007000E
Message: Not enough storage is available to complete this operation.
Note The type of SqlCeCommand instances may be select, insert, update, or delete.

쿼리문 할당을 위해 사용한 SqlCeAdapter.SelectCommand, SqlCeAdapter.InsertCommand, SqlCeAdapter.UpdateCommand, SqlCeAdapter.DeleteCommand 객체가 할당된 SqlCeCommand 객체를 명시적으로 소멸(Dispose) 시켜줄 것을 권고 하고 있습니다. 추측컨데, 데이터 Row가 많은 자료의 경우 데이터를 Insert 하면서 객체를 소멸시키지 않고 반복적으로 루프문에서 사용할 가능성이 높은데 이 과정에서 메모리에 계속 새로운 영역들이 Reserve 되는 것이 아닌가 싶습니다.

다만 의아한 것은 이러한 에러가 발생한 시점에 메모리 용량을 점검해보면 수십메가 이상이 남아있는 경우가 많습니다. 이는 아마도 실제 메모리가 소모되어 발생했다기 보다 메모리 주소를 더이상 Reserve 할 수 없어서 발생하는 것이지 싶습니다.

참고자료

- INFO: Understanding Windows CE DLL Load Failures (http://support.microsoft.com/kb/326163)
- Methods to dispose of SQL Server CE, SQL Server 2005 Compact Edition, or SQL Server 2005 Mobile Edition managed objects from memory (링크)
- SQL Mobile 2005 - Error : Not Enough Storage is Available (링크)
728x90

+ Recent posts