[推薦工具]OpenNETCF.Desktop.Communication Library

摘要:[推薦工具]OpenNETCF.Desktop.Communication Library

今天要跟大家介紹一個好用的行動裝置類別庫OpenNETCF.Desktop.Communication Library(以下簡稱OpenNETCF Library),透過這個類別庫你可以更輕鬆的從本機電腦取得PDA裝置上面的資訊(包括檔案傳輸、系統版本、電池資訊...等,請自行到OpenNETCF Library官網查看)。

說到這裡你可能還不是很明白,麻煩您繼續看到問題一,並思考一下你要怎麼做。

問題一:你要怎麼以程式設計的方式從PC上面取得PDA裝置的檔案,或者將PC上面的檔案傳輸到PDA裝置?

不要告訴我將裝置與PC連線用Active Sync或Windows Device Center進行檔案複製,我說過了要如何以程式設計的方式?答案是有的就是使用Microsoft's Remote API (RAPI)來實作,但你如果自己要叫用RAPI自己要先定義相關的函式才行,透過OpenNETCF Library)你可以很輕鬆的實現。

OK...廢話少說,現在就看看下面的例子

這邊我們將舉兩個例子說明,並同時列出呼叫RAPI與OpenNETCF.Desktop.Communication Library的方法

1.如何將PDA裝置上面的檔案複製到本機電腦

RAPI.DLL

//你必須先自行定義相關函式,才可以使用方法。
[DllImport("rapi.dll", EntryPoint = "CeCreateFile")]  
        public static extern IntPtr CeCreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);  
  
public void CopyFileFromDevice(string LocalFileName, string RemoteFileName, bool Overwrite)  
{  
    this.CheckConnection();  
    IntPtr zero = IntPtr.Zero;  
    int lpNumberOfbytesRead = 0;  
    byte[] lpBuffer = new byte[0x1000];  
    zero = CeCreateFile(RemoteFileName, 0x80000000, 0, 0, 3, 0x80, 0);  
    if (((int) zero) == -1)  
    {  
        throw new RAPIException("Could not open remote file");  
    }
  
    FileStream stream = new FileStream(LocalFileName, Overwrite ? FileMode.Create : FileMode.CreateNew, FileAccess.Write);  
    CeReadFile(zero, lpBuffer, 0x1000, ref lpNumberOfbytesRead, 0);  
    while (lpNumberOfbytesRead > 0)  
    {  
        stream.Write(lpBuffer, 0, lpNumberOfbytesRead);  
        if (!Convert.ToBoolean(CeReadFile(zero, lpBuffer, 0x1000, ref lpNumberOfbytesRead, 0)))  
        {  
            CeCloseHandle(zero);  
            stream.Close();  
            throw new RAPIException("Failed to read device data");  
        }
  
    }
  
    CeCloseHandle(zero);  
    stream.Flush();  
    stream.Close();  
}

OpenNETCF.Desktop.Communication Library

//你只需要直接呼叫方法
CopyFileFromDevice(@"C:\TestFile.txt", @"\My Documents\TestFile.txt", true)

2.取得裝置上電池相關資訊

RAPI

[DllImport("rapi.dll", EntryPoint = "CeGetSystemPowerStatusEx")]
        public static extern void CeGetSystemPowerStatusEx(out SYSTEM_POWER_STATUS_EX powerStatus, bool fupdate);

        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEM_POWER_STATUS_EX
        {
            public byte ACLineStatus;
            public byte BatteryFlag;
            public byte BatteryLifePercent;
            public byte Reserved1;
            public int BatteryLifeTime;
            public int BatteryFullLifeTime;
            public byte Reserved2;
            public byte BackupBatteryFlag;
            public byte Reserved3;
            public int BackupBatteryLifeTime;
            public int BackupBatteryFullLifeTime;
        }


SYSTEM_POWER_STATUS_EX ps = new SYSTEM_POWER_STATUS_EX();
            CeGetSystemPowerStatusEx(out sp, false);
            label1.Text = sp.BatteryLifePercent.ToString();

 OpenNETCF.Desktop.Communication Library

SYSTEM_POWER_STATUS_EX ps = new SYSTEM_POWER_STATUS_EX();
            CeGetSystemPowerStatusEx(out sp, false);
            label1.Text = sp.BatteryLifePercent.ToString();

看到了嗎? 很方便對不對? 眼尖的人一眼就可以看出它不過是把RAPI裡面的函式都定義在一個RAPI類別裡面,對於不是很熟悉定義DLL函式的人可以很輕鬆的使用這個RAPI類別,另一方面也可以避免自行定義函式過程中發生的錯誤。

下圖是OpenNETCF.Desktop.Communication Library網站上提供的範例程式,各位可自行到官網下載。

最後要提醒各位OpenNETCF Library有一些License上的限制,使用前請看官網上面看一下。

官網連結: http://www.opennetcf.com/FreeSoftware/DesktopCommunication/tabid/90/Default.aspx

如果您想更深入了解RAPI,請點選下面連結