ページ

2007-06-26

勉強開始

Advanced / W-Zero3[es]の事前予約が受付開始から 7分で終了してしまったそうですね。
僕は予約開始が始業時間と重なっていたにもかかわらずいましたが、 無事予約することができました。
 
まだ29日の本予約が残っているので油断はできませんが、機種変更にグッと近づいたと言えるでしょう。
 
モチベーションが高まったところで、発売まで残り1ヶ月弱の間、WindowsMobileでのプログラム開発の勉強でもしていようと思います。
Windows Mobile 6 SDKその他はインストール済みなので、 マイクロソフトのページにあるサンプルを入力して実行してみます。
 
ものすごく遅い(笑
 
やはり.NETは起動がもたつきますね。
新機種になればいくらかは改善するのかもしれませんが、ネイティブで開発する方法も勉強しておいた方がよさそうです。
 
ということで、早速 Visual Studioで新しいプロジェクトを作成。
プロジェクトの種類で「Visual C++」-「スマートデバイス」、テンプレートで「Win32スマートデバイス プロジェクト」を選択。  
プラットフォーム画面で選択されたSDKを「Pocket PC 2003」から「Windows Mobile 6 Professional」に変更。  
自動生成された雛形にコードを追加していきます。
#include "stdafx.h"
#include "WMSample01.h"
#include <windows.h>
#include <commctrl.h>

#include <winsock2.h>
#include <ws2tcpip.h>void    ShowMessage(HWND hWnd);

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
        :
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    static SHACTIVATEINFO s_sai;
 
    switch (message) 
    {

        case WM_COMMAND:
            wmId    = LOWORD(wParam); 
            wmEvent = HIWORD(wParam); 
            // 選択されたメニューの解析:
            switch (wmId)
            {
                
                case IDC_BUTTON1:
                    ShowMessage(hWnd);
                    break;
                case IDM_HELP_ABOUT:
                    DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
                    break;
                case IDM_OK:
                    SendMessage (hWnd, WM_CLOSE, 0, 0);    
                    break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;

  case WM_CREATE:
            SHMENUBARINFO mbi;

            memset(&mbi, 0, sizeof(SHMENUBARINFO));
            mbi.cbSize     = sizeof(SHMENUBARINFO);
            mbi.hwndParent = hWnd;
            mbi.nToolBarId = IDR_MENU;
            mbi.hInstRes   = g_hInst;

            if (!SHCreateMenuBar(&mbi)) 
            {
                g_hWndMenuBar = NULL;
            }
            else
            {
                g_hWndMenuBar = mbi.hwndMB;
            }

            // shell アクティベート情報のストラクチャを初期化します。
            memset(&s_sai, 0, sizeof (s_sai));
            s_sai.cbSize = sizeof (s_sai);
            
            CreateWindow(_T("BUTTON"), _T("button1"), 
                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                78, 45, 72, 20, hWnd, (HMENU)IDC_BUTTON1,
                g_hInst, NULL);

            break;
     
         :
    }
    return 0;
 }

         :

void ShowMessage(HWND hWnd)
{
    WSADATA        wsaData;
    _TCHAR         msg[256];
    char           hostname[256];
    _TCHAR         _hostname[256];
    int            len;

    WSAStartup(MAKEWORD(2,2), &wsaData);

    gethostname(hostname, 256);

    len = MultiByteToWideChar(CP_ACP, 0, hostname, -1, _hostname, 0);
    MultiByteToWideChar(CP_ACP, 0, hostname, -1, _hostname, len);

    swprintf(msg, _T("host=%s"), _hostname);
    WSACleanup();

    MessageBox(hWnd, (LPCWSTR)msg, _T("ホスト名"), MB_OK);
}
 
WinSockを使っているので、Ws2.libをリンクするように指定しておきます。
(僕は普通のWin32APIのつもりでWS2_32.Libを一生懸命探していました。)
本当はC#のサンプルと同じようにIPアドレスを取得したかったのですが なぜかうまく動かず、 時間切れで断念してしまいました。
 
また久しぶりのCで、文字列操作がかなりあやふやになっています。
じっくり勉強する時間が欲しいですね。

0 件のコメント: