2

PDA 内で見つかったファイルをコピーする必要があるプロジェクトがあります (私の場合、違いがある場合は MC3000 です)。私は ActiveSync をインストールしており、同期フォルダを作成してくれます。ただし、MyDocument フォルダーだけでなく PDA のコンテンツを読み取れるようにしたいので、これを使用することはできません (さらに、同じモデルの 20 以上の可能な PDA で動作する必要があるため、20 以上のディレクトリが作成されます)。

PDA がドッキングされていて、ActiveSync と同期しているときに、PDA 内で IO を実行する方法はありますか。

エクスプローラーで「モバイル デバイス」が表示されます。

ありがとう

4

1 に答える 1

3

RAPIを使用します。これは、 Rapi.dllと ActiveSyncのマネージ ラッパー クラスを提供する codeplex プロジェクトです。これにより、デスクトップ .NET アプリがテザリングされたモバイル デバイスと通信できるようになります。ラッパーはOpenNetCF プロジェクト内で作成されましたが、現在は個別に管理されています。

そのプロジェクトから出荷された RAPI プロジェクト DLL 全体を使用することも、必要なコードのサブセットのみを使用することもできます。接続時にデバイス上にファイルを作成する必要があったため、Rapi に含まれているパフォーマンス統計やデバイス レジストリは必要ありませんでした。必要な 3 つのソース ファイルを取得しました...

それが私のために働く方法はこれです:

  • ActiveSync (DccManSink) を使用してモバイル デバイスの接続/切断状態を検出する
  • RAPI ラッパーを使用して、デバイスへのファイルのコピー、デバイスでのファイルの作成、デバイスからのファイルのコピーなどを行います。

private DccMan DeviceConnectionMgr;
private int AdviceCode;
private int ConnectionStatus = 1;
private System.Threading.AutoResetEvent DeviceConnectionNotification = new System.Threading.AutoResetEvent(false);


public void OnConnectionError()
{
    ConnectionStatus = -1;
    DeviceConnectionNotification.Set();
}

public void OnIpAssigned(int address)
{
    ConnectionStatus = 0;
    DeviceConnectionNotification.Set();
}


private void btnCopyToDevice_Click(object sender, EventArgs e)
{
    // copy the database (in the form of an XML file) to the connected device
    Cursor.Current = Cursors.WaitCursor;

    // register for events and wait.
    this.DeviceConnectionMgr = new DccMan();

    DccManSink deviceEvents = new DccManSink();
    deviceEvents.IPChange += new IPAddrHandler(this.OnIpAssigned);
    deviceEvents.Error += new ErrorHandler(this.OnConnectionError);
    ((IDccMan)DeviceConnectionMgr).Advise(deviceEvents, out this.AdviceCode);

    // should do this asynchronously, with a timeout; too lazy.
    this.statusLabel.Text = "Waiting for a Windows Mobile device to connect....";

    this.Update();
    Application.DoEvents();  // allow the form to update

    bool exitSynchContextBeforeWait = false;
    DeviceConnectionNotification.WaitOne(SECONDS_TO_WAIT_FOR_DEVICE * 1000, exitSynchContextBeforeWait);

    if (ConnectionStatus == 0)
    {
        this.statusLabel.Text = "The Device is now connected.";
        this.Update();
        Application.DoEvents();  // allow the form to update

        RAPI deviceConnection = new RAPI();
        deviceConnection.Connect(true, 120);  // wait up to 2 minutes until connected
        if (deviceConnection.Connected)
        {
            this.statusLabel.Text = "Copying the database file to the connected Windows Mobile device.";
            this.Update();
            Application.DoEvents();  // allow the form to update
            string destPath = "\\Storage Card\\Application Data\\MyApp\\db.xml";
            deviceConnection.CopyFileToDevice(sourceFile,
                                              destPath,
                                              true);

            this.statusLabel.Text = "Successfully copied the file to the Windows Mobile device....";
        }
        else
        {
            this.statusLabel.Text = "Oh, wait, it seems the Windows Mobile device isn't really connected? Sorry.";
        }

    }
    else
    {
        this.statusLabel.Text = "Could not copy the file because the Device does not seem to be connected.";
    }

    Cursor.Current = Cursors.Default;

}
于 2010-03-04T02:40:46.867 に答える