摘要:[推薦工具]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
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
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,請點選下面連結