トップ 一覧 検索 ヘルプ RSS ログイン

C/C++ Sync Suite Companion601/8の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{div_begin}}
[[← 7 章に戻る|C/C++ Sync Suite Companion601/7]] [[↑トップへ|C/C++ Sync Suite Companion601]] [[9 章に進む →|C/C++ Sync Suite Companion601/9]]
{{div_end}}

{{div_begin style="margin-bottom:-10px"}}
!!!8 デスクトップ通知機能の作成
{{div_end}}

{{div_begin "style='position:absolute;right:0px;font-size:70%;margin-right:15px;margin-top:15px;width:250px;'"}}
*{{goto Requirements,必要条件}}
*{{goto Example Notifier,通知機能の例}}
{{div_end}}

{{div_begin "style='position:relative;padding:0px;padding-right:5px;padding-left:10px;margin-right:250px;margin-top:20px;width:auto;border-right-style:dotted;border-right-width:2px;border-right-color:silver;'"}}
デスクトップ コンピュータ上のアプリケーションとコンジットの両方が同時にデスクトップ上の同じユーザ データを変更する可能性がある場合、HotSync マネージャは、デスクトップ アプリケーションに HotSync が開始されたことを通知することができます。これにより、両方が同時にデスクトップ上のデータを変更することがないようにします。このメッセージ機能を使用可能にするために、あなたは '''通知機能'''(原文: notifier)を実装しなければなりません。通知機能はオプションの DLL であり、コンジットとはまったく別個のものです。あなたはこれを実装することにより HotSync マネージャからあなたのデスクトップ アプリケーションへメッセージを送ることができます。

::NOTE
:::あなたのコンジットがデスクトップ データにアクセスするが、デスクトップ アプリケーションとデータを共有しない場合、あなたは通知機能を提供する必要はありません。

通知機能の概要は ''Introduction to Conduit Development'' の中の {{goto Desktop Notifiers,「デスクトップ通知機能」|Introduction to Conduit Development601/5}} を、HotSync マネージャが通知機能を呼び出すときのことについての更なる情報は {{goto Calling Notifiers,「通知機能の呼び出し」|Introduction to Conduit Development601/7}} を参照してください。

この章には以下の節があります:

*{{goto Requirements,必要条件}}
*{{goto Example Notifier,通知機能の例}}


!!{{anchor Requirements}}必要条件 {{goto top,^TOP^}}

HotSync 実施の間に HotSync マネージャにあなたの通知機能を呼び出させるために:

*''C/C++ Sync Suite Reference'' の中の [[第18章 「デスクトップ アプリケーション通知機能 API」|C/C++ Sync Suite Reference601/18]] の中で指定されているデスクトップ アプリケーション通知機能 API を実装します。
*以下の 2 つの方法のどちらかであなたの通知機能を HotSync マネージャに登録します:
**コンジット マネージャ({{span style='color:blue;font-family:monospace;',CondMgr.dll}})の一部である通知機能インストール マネージャ API を使用します。この API は、あなたのインストーラ アプリケーションがプログラム的にエンド ユーザのコンピュータ上の通知機能を登録、変更、登録解除することを可能にします。{{goto Using the Notifier Install Manager API,第 9 章 「通知機能インストール マネージャ API の使用」|C/C++ Sync Suite Companion601/9-2}} を参照してください。
**あなたがコードを書くことなしに通知機能をあなたの開発マシンに登録、登録解除することを可能にする Windows アプリケーションであるコンジット コンフィグレーション ユーティリティ({{span style='color:blue;font-family:monospace;',CondCfg.exe}})を使用します。''Conduit Development Utilities Guide'' の {{goto Registering and Editing Notifier Information,「通知機能情報の登録と変更」|Conduit Development Utilities Guide601/3}} を参照してください。

いずれかのコンジットを呼び出す前とコンジットの完了後に再びコンジットを呼び出す前に、HotSync マネージャは以下のデスクトップ通知機能 API 呼び出しで登録された各通知機能を呼び出します:

 {{span style='color:blue;font-family:monospace;',BOOL HS_Notify (int nCode, int nUserId)}}

{{span style='color:blue;font-family:monospace;',nCode}} パラメータ値はメッセージ コードであり、{{span style='color:blue;font-family:monospace;',nUserId}} パラメータ値はユーザ - そのユーザのために同期が実行されようとしている - の ID です。通知機能は通知機能が受け取る {{span style='color:blue;font-family:monospace;',nCode}} 値を理解して、デスクトップ アプリケーションにそれが知る必要があることを知らせなければなりません。

{{goto Table 8.1,表 8.1}} は、HotSync マネージャが通知機能に送るメッセージ コードについて説明しています。「一般的な応答」列はどのようにデスクトップ アプリケーションが応答すべきなのか、通知機能はどのような値を HotSync マネージャに返すべきなのかを示しています。

::重要
:::デスクトップ アプリケーションはあなたの個々のコンジットが失敗したかどうかは通知されません。

{{anchor Table 8.1}}
'''表 8.1 HotSync マネージャの通知メッセージ'''

,メッセージ コード,説明,一般的な応答
,"{{span style='color:blue;font-family:monospace;',HS_SYNC_FAILURE}}",デスクトップ アプリケーションに同期が不成功に完了したことを通知します。,メッセージは失敗した理由について示しません。
,"{{span style='color:blue;font-family:monospace;',HS_SYNC_QUERYOK}}",デスクトップ アプリケーションが同期可能かどうかを決定するためにデスクトップ アプリケーションにおくられます。,"アプリケーションが同期できる場合、{{span style='color:blue;font-family:monospace;',TRUE}} を返します。{[br}}ユーザが現在データを編集していてアプリケーションが同期できない場合、{{span style='color:blue;font-family:monospace;',FALSE}} を返し、ユーザにユーザは編集を終わらせてから HotSync 実施を再試行するようにメッセージを表示します。HotSync マネージャは同期操作を中止します。"
,"{{span style='color:blue;font-family:monospace;',HS_SYNC_STARTED}}",デスクトップ アプリケーションにユーザが同期を始めようとしているということを通知します。,"指定されたユーザが現在そのデスクトップ アプリケーションを使用している場合、アプリケーションはユーザのデータをディスクに保存します。保存が失敗した場合、デスクトップ アプリケーションは {{span style='color:blue;font-family:monospace;',FALSE}} を返し、HotSync マネージャは同期操作を中止します。{{br}}他のすべての場合では、デスクトップ アプリケーションは {{span style='color:blue;font-family:monospace;',TRUE}} を返します。"
,"{{span style='color:blue;font-family:monospace;',HS_SYNC_SUCCESS}}",デスクトップ アプリケーションに同期操作が成功裏に完了したことを通知します。,ユーザのリストが変更された場合、アプリケーションはそのユーザ データを再読み込みしなければなりません。
,"{{span style='color:blue;font-family:monospace;',HS_USER_UPDATE}}",デスクトップ アプリケーションにユーザ リストが変更されたことを通知します。,アプリケーションは同期操作の完了後にリストの中のユーザを読み込んでユーザ データを再読み込みしなければなりません。


!!{{anchor Example Notifier}}通知機能の例 {{goto top,^TOP^}}

{{goto Listing 8.1,コード 8.1}} の通知機能の例は、Palm OS Desktop にメッセージを送るという機能をベースにしています。{{span style='color:blue;font-family:monospace;',HSNotify.h}} ファイルは {{span style='color:blue;font-family:monospace;',<CDK>\C++\Win\include}} の中にあります。

{{anchor Listing 8.1}}
'''コード 8.1 通知機能の例'''

 #include <windows.h>
 #include <hsnotify.h>
 
 const char* pszPilotDesktopWndClass = "Bell XS-1";
 const char* pszHotSyncWndClass = "KittyHawk";
 
 #define WM_POKEWILMA(WM_USER+0xBAC4)
 #define PW_IDENTIFY0
 #define PW_SYNCSTART1
 #define PW_SYNCSUCCESS2
 #define PW_SYNCFAILURE3
 #define PW_ADVISEUSER4
 #define PW_SYNCOKQUERY5
 #define PW_UPDATEUSERS6
 
 BOOL APIENTRY DllMain( HANDLE hModule, 
                        DWORD ul_reason_for_call, 
                        LPVOID lpReserved )
 
 {
    switch (ul_reason_for_call)
    {
       case DLL_PROCESS_ATTACH:
       case DLL_THREAD_ATTACH:
       case DLL_THREAD_DETACH:
       case DLL_PROCESS_DETACH:
       break;
    }
    return TRUE;
 }
 
 // GetNotifierVersion() is optional. HotSync Manager does not call it. However, 
 // it may be useful for your desktop application to call this function to 
 // identify the version of your notifier.
 NOTIFY_API DWORD GetNotifierVersion()
 {
    return 0;
 }
 
 // HS_Notify() passes messages from HotSync Manager to your 
 // desktop application.
 NOTIFY_API BOOL HS_Notify(int nCode,int nUserID)
 {
    BOOL bRtn = TRUE;
 
    // Find the Palm OS Desktop application.
    HWND hWnd = FindWindow(pszPilotDesktopWndClass,NULL);
 
    if (hWnd != NULL)
    {
       // Make sure it's the right Palm OS Desktop.
       if (SendMessage(hWnd,WM_POKEWILMA,PW_IDENTIFY,0) == WM_POKEWILMA)
       {
          switch (nCode)
          {
             case HS_SYNC_QUERYOK:
             bRtn = (SendMessage(hWnd,WM_POKEWILMA,PW_SYNCOKQUERY,0) == 0);
             break;
 
             case HS_SYNC_STARTED:
             bRtn = (SendMessage(hWnd,WM_POKEWILMA,PW_SYNCSTART,nUserID) == 0);
             break;
 
             case HS_SYNC_SUCCESS:
             SendMessage(hWnd,WM_POKEWILMA,PW_SYNCSUCCESS,nUserID);
             break;
 
             case HS_SYNC_FAILURE:
             SendMessage(hWnd,WM_POKEWILMA,PW_SYNCFAILURE,nUserID);
             break;
 
             case HS_USER_UPDATE:
             SendMessage(hWnd,WM_POKEWILMA,PW_UPDATEUSERS,nUserID);
             break;
          }
       }
    }
 
    return bRtn;
 }
{{div_end}}

{{div_begin "style='border-top-style:solid;border-top-width:1px;border-top-color:silver;'"}}
[[← 7 章に戻る|C/C++ Sync Suite Companion601/7]] [[↑トップへ|C/C++ Sync Suite Companion601]] [[9 章に進む →|C/C++ Sync Suite Companion601/9]]
{{div_end}}