デバイスのシステム日付と時刻を、ドッキングされているデスクトップに同期しようとしています。コンパクト フレームワーク (C#) を使用しています。
私の目標は、デバイスがデスクトップ マシン上のデータベースに最後に同期されたのはいつかを検出することです。
これどうやってするの?
デバイスのシステム日付と時刻を、ドッキングされているデスクトップに同期しようとしています。コンパクト フレームワーク (C#) を使用しています。
私の目標は、デバイスがデスクトップ マシン上のデータベースに最後に同期されたのはいつかを検出することです。
これどうやってするの?
最後の質問が何であるかわかりません。デバイスの時刻をデバイスがドッキングされているPCの時刻と同期する方法を尋ねた場合は、無料のITSUtilsとPCのレジストリの変更を使用して、タイムスナイシングを自動化できます。レジストリの変更は次のとおりです。
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\AutoStartOnConnect]
"OnConnect"="\"c:\\windows\\system32\\cmd.exe\" /c d:\\OnConnect\\install.bat"
アクセスできる場合は、experts-exchangeの私の投稿もご覧ください。
install.batの代わりに、任意のbatまたはcmdファイルを使用できます。itsutilsには、psynctimeと呼ばれるPCアプリが含まれています。レジストリに作成してリンクしたbat/cmdファイルでpsynctimeを開始する必要があります。次に、デバイスの時刻がPCの時刻に同期されます。batファイルがitsutilファイルにアクセスできることを確認します。itsutilsがPATH環境のディレクトリにあるか、bat/cmdのディレクティブにあります。
別の方法として、時刻を同期するためにDLLとactivesyncリモート呼び出しコードを作成する必要があります。したがって、psynctimeツールを使用する方が簡単です。
デバイスがPCのインターネット接続を使用してインターネットを使用できることを知っていますか?ActiveSync接続設定を参照し、「PCが仕事/インターネット/自動に接続されている」を探します。自動またはインターネットに設定されている場合、デバイスはActiveSync接続を介してインターネットにアクセスできる必要があります。それをテストするには、デバイスでInternetExplorerMobileを試してみてください。うまくいく場合は、Mitchが提供するコードでSNTPサービスを使用することもできます。ただし、デバイスがActiveSync経由で接続されていることを検出するコードも追加する必要があります。
これが私が使ってきたものです。データベース オブジェクトが初めて開始されたときに、デバイスを同期させます。
#if PocketPC
[DllImport("coredll.dll")]
#else
[DllImport("kernel32.dll")]
#endif
private static extern bool SetLocalTime([In] ref SYSTEMTIME lpLocalTime);
...はい、Windows PC にも WinMobile PC と同じコードを使用しています。
このNODATE
変数は私のプロジェクト全体に対してグローバルであり、1900 年 1 月 1 日として定義されています。この会社では、その日に SQL Server で何も起こらなかったことを願っています。
構造から始めます。
/// <summary>
/// SYSTEMTIME structure with some useful methods
/// </summary>
public struct SYSTEMTIME {
public short Year, Month, DayOfWeek, Day, Hour, Minute, Second, Millisecond;
/// <summary>
/// Convert form System.DateTime
/// </summary>
/// <param name="time">Creates System Time from this variable</param>
public void FromDateTime(DateTime time) {
Year = (short)time.Year;
Month = (short)time.Month;
DayOfWeek = (short)time.DayOfWeek;
Day = (short)time.Day;
Hour = (short)time.Hour;
Minute = (short)time.Minute;
Second = (short)time.Second;
Millisecond = (short)time.Millisecond;
}
/// <summary>
/// Convert to System.DateTime
/// </summary>
public DateTime ToDateTime() {
return new DateTime(Year, Month, Day, Hour, Minute, Second, Millisecond);
}
/// <summary>
/// STATIC: Convert to System.DateTime
/// </summary>
public static DateTime ToDateTime(SYSTEMTIME time) {
return time.ToDateTime();
}
}
次に、呼び出しを行うこのメソッドで行うように、その構造を使用します (SQL Server と同期します)。
/// <summary>
/// Synchronize the Time on the SQL Server with the time on the device
/// </summary>
public static int SyncWithSqlTime() { // pass in SQL Time and set time on device
SYSTEMTIME st = new SYSTEMTIME();
DateTime sqlTime = Global.NODATE;
using (SqlCommand cmd = new SqlCommand("SELECT GETDATE() AS CurrentDateTime;", new SqlConnection(DataSettings.DatabaseConnectionString))) {
try {
cmd.Connection.Open();
SqlDataReader r = cmd.ExecuteReader();
while (r.Read()) {
if (!r.IsDBNull(0)) {
sqlTime = (DateTime)r[0];
}
}
} catch (Exception) {
return -1;
}
}
if (sqlTime != Global.NODATE) {
st.FromDateTime(sqlTime); // Convert to SYSTEMTIME
if (SetLocalTime(ref st)) { //Call Win32 API to set time
return 1;
}
}
return 0;
}
一番下の最後のif
条件は、 を使用して時間を設定した場所SetLocalTime
です。
これでどこかに行けるといいのですが、
~Joe
SNTP (ネットワーク タイム プロトコル) を使用して両方を国際標準時間に同期してみませんか。
次に、データベースの最終更新時刻を確認するだけです。[リンク先のコードをモバイル デバイスで使用しました]
そのコードは次のように使用されます (毎時間、または必要な更新間隔で呼び出されます)。
SNTPClient client = new SNTPClient(sntpTimeServerString);
client.Connect(5000, true);
// Set system clock to timenow
DateTime timenow = client.ToTime();
更新(OPのコメントに基づく):インターネットに接続していないため、最後の同期を決定するには時間以外の何かを使用する必要があると思います. たとえば、最後のシーケンス ID を使用して、デバイスのローカル データベースにデスクトップと比較して変更があるかどうかを判断します。
リモート API 2 (RAPI2)。=> 日付用と時間用の 2 つの rapi.CreateProcess を起動します。
rapi.CreateProcess("cmd", "/c date " + DateTime.Now.ToString("dd-MM-yyyy"));
rapi.CreateProcess("cmd", "/c time " + DateTime.Now.ToString("HH:mm:ss"));
2 つのウィンドウ コマンド プロンプトが開き、携帯電話を PC の時計と同期させます。