Bối cảnh:Làm thế nào để bạn định dạng thẻ SD sử dụng API quản lý lưu trữ thông qua Windows Mobile 6
Tôi đang cố gắng để tạo ra một tiện ích mà sẽ cho phép khách hàng của chúng tôi để dễ dàng định dạng thẻ SD (trên thực tế mini-SD) trực tiếp trên thiết bị Windows Mobile 6 (Intermec CK3). Điều này sẽ được ưu tiên hơn một công cụ bên thrid chẳng hạn như FlashFormat hoặc phải cung cấp đầu đọc thẻ cho khách hàng (yêu cầu họ tháo pin, rút thẻ mini-SD được giữ trong vỏ kim loại mỏng manh và sau đó chạy tiện ích định dạng Windows thông qua điều khiển quản lý tệp). Hầu hết khách hàng của chúng tôi không hiểu biết về công nghệ, vì vậy một tiện ích có thể chạy tự động hoặc thông qua một vài cú nhấp chuột sẽ là lý tưởng.
Tôi đã thử những điều sau đây cho đến nay:
- Nhìn this câu hỏi. Câu trả lời ở đây dường như không hoạt động đối với Windows Mobile (ví dụ: không hỗ trợ WMI hoặc tiện ích format.com).
- Đã thử sử dụng CreateFile và DeviceIoControlCE. Điều này dường như đầy hứa hẹn, nhưng thẻ SD sẽ không bao giờ thực sự định dạng. Từ những gì tôi có thể nói, đó là vì thẻ cần phải được tháo dỡ trước.
- Đã thử sử dụng CreatFile và FormatVolumeEx (cùng với các biến thể khác, FormatVolume và FormateVolumeUI). Kết quả có vẻ tương tự ở chỗ tôi không thể định dạng thẻ trừ khi nó được tháo dỡ lần đầu tiên.
Sau khi thực hiện một số tìm kiếm một chạy vào this thread (câu trả lời gần đáy bởi paraGOD) và this blog, tôi quyết định đi xuống một con đường mới của việc sử dụng các Store Manager API, trong đó có chức năng như FindFirstStore, FindNextStore, OpenStore, DismountStore và Sớm.
Tôi đang cố gắng thực hiện điều này trong C#, vì vậy tôi đã tạo các cấu trúc hỗ trợ cần thiết để thể hiện các typdef được sử dụng trong API. Dưới đây là một mẫu thông:
using System.Runtime.InteropServices;
// Try to match the struct typedef exactly (all caps, exact type names).
using DWORD = System.UInt32;
using TCHAR = System.String;
namespace SDFormatter
{
// http://msdn.microsoft.com/en-us/library/ee490035(v=WinEmbedded.60).aspx
// STORAGEDEVICEINFO (Storage Manager)
[StructLayout(LayoutKind.Sequential)]
public struct StorageDeviceInfo
{
public DWORD cbSize;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public TCHAR szProfile;
public DWORD dwDeviceClass;
public DWORD dwDeviceType;
public DWORD dwDeviceFlags;
}
}
Sau đó, tôi tạo ra một lớp quản lý lưu trữ tĩnh để giữ tất cả các chức năng quản lý lưu trữ (trong đó có nghĩa vụ phải có sẵn trong coredll cho windows mobile 6 ... hoặc vì vậy tôi nghĩ) :
using System.Runtime.InteropServices;
// Try to match the Coredll functions exactly (all caps, exact type names, etc.).
using BOOL = System.Boolean;
using BYTE = System.Byte;
using DWORD = System.UInt32;
using HANDLE = System.IntPtr;
using LPCE_VOLUME_INFO = System.IntPtr;
using LPCSTR = System.String;
using LPCTSTR = System.String;
using LPCWSTR = System.String;
using PPARTINFO = System.IntPtr;
using PSTOREINFO = System.IntPtr;
using SECTORNUM = System.UInt64;
// ReSharper disable InconsistentNaming
namespace SDFormatter
{
// http://msdn.microsoft.com/en-us/library/ee490420(v=WinEmbedded.60).aspx
public static class StorageManager
{
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CeGetVolumeInfo(LPCWSTR pszRootPath, CE_VOLUME_INFO_LEVEL InfoLevel,
LPCE_VOLUME_INFO lpVolumeInfo);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreatePartition(HANDLE hStore, LPCTSTR szPartitionName, SECTORNUM snNumSectors);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool CreatePartitionEx(HANDLE hStore, LPCTSTR szPartitionName, BYTE bPartType,
SECTORNUM snNumSectors);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool DeletePartition(HANDLE hStore, LPCTSTR szPartitionName);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool DismountPartition(HANDLE hPartition);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool DismountStore(HANDLE hStore);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FindClosePartition(HANDLE hSearch);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FindCloseStore(HANDLE hSearch);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern HANDLE FindFirstPartition(HANDLE hStore, PPARTINFO pPartInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern HANDLE FindFirstStore(PSTOREINFO pStoreInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FindNextPartition(HANDLE hSearch, PPARTINFO pPartInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FindNextStore(HANDLE hSearch, PSTOREINFO pStoreInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FormatPartition(HANDLE hPartition);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FormatPartitionEx(HANDLE hPartition, BYTE bPartType, BOOL bAuto);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool FormatStore(HANDLE hStore);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool GetPartitionInfo(HANDLE hPartition, PPARTINFO pPartInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool GetStoreInfo(HANDLE hStore, PSTOREINFO pStoreInfo);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool MountPartition(HANDLE hPartition);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern HANDLE OpenPartition(HANDLE hStore, LPCTSTR szPartitionName);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern HANDLE OpenStore(LPCSTR szDeviceName);
[DllImport("Coredll.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool RenamePartition(HANDLE hPartition, LPCTSTR szNewName);
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool SetPartitionAttributes(HANDLE hPartition, DWORD dwAttrs);
// http://msdn.microsoft.com/en-us/library/ee490442(v=winembedded.60).aspx
[DllImport("Coredll.dll", SetLastError = true)]
public static extern bool CloseHandle(HANDLE hObject);
}
public enum CE_VOLUME_INFO_LEVEL
{
CeVolumeInfoLevelStandard = 0
}
}
// ReSharper restore InconsistentNaming
vì vậy, tôi đã đi kiểm tra một số các chức năng này, chẳng hạn như chỉ đơn giản là liệt kê thông qua các cửa hàng thông qua chức năng FindFirstStore và FindNextStore và sau đó tôi nhận được sự sợ hãi, không thể tìm thấy 'FindFirstStore' một Entry Point trong một lỗi PInvoke DLL 'Coredll.dll' (trong th e đầu ra trình gỡ lỗi Tôi cũng nhận được Ngoại lệ đầu tiên của loại 'System.MissingMethodException' xảy ra trong SDFormatter.exe, có ý nghĩa). Một số nghiên cứu khác gợi ý rằng trong Windows Mobile, các chức năng này không bị lộ ra, mặc dù chúng là một phần của Coredll. Tuy nhiên, chúng là một phần của Windows CE 6 và có thể được truy cập thông qua trình tạo nền tảng.
Vì vậy, đây là những câu hỏi chính tôi có:
- Tôi có thể truy cập vào API quản lý lưu trữ thông qua C# trong Windows Mobile 6 số như thế nào?
- Nếu không, tôi có thể viết một tiện ích thông qua quản lý C++ (Tôi không biết nhiều, nhưng tôi sẽ vấp ngã nếu cần), nhưng không cần phải sử dụng trình tạo nền tảng (nó không miễn phí)?
- Nếu chỉ có thể thông qua trình tạo nền tảng, điều đó có nghĩa là tôi đang gặp khó khăn khi xây dựng SDK của riêng mình hoặc sẽ phải yêu cầu Intermec hiển thị chức năng cho tôi?
Tôi cũng mở để thực hiện điều này theo cách hoàn toàn khác (tốt nhất là qua C#) nếu có ai đó có đề xuất. Tôi đã nghĩ rằng có thể có khách hàng gắn kết thiết bị trong cái nôi và chạy một tiện ích máy tính để bàn. Không chắc chắn nếu điều này là có thể và nó không thể dựa vào ActiveSync (chúng tôi không muốn hỗ trợ một công cụ khác, vì vậy chúng tôi gửi dữ liệu đến và đi từ thẻ SD thông qua bộ điều hợp mạng được kết nối với cái nôi bằng cách sử dụng ổ cắm để nói chuyện giữa chúng tôi chương trình máy chủ tùy chỉnh và ứng dụng di động của chúng tôi).
Cảm ơn
Tôi đã xem chuỗi chủ đề tin tức năm 2009 có thể có liên quan: http://www.pocketpcjunkies.com/Uwe/Forum.aspx/wince-pb/21443/StoreApi-Lib-not-export-in-the-SDK-và-liên kết-di-rect-doesn – PaulH