C# 如何通过Windows Mobile 6使用Storage Manager API格式化SD卡

C# 如何通过Windows Mobile 6使用Storage Manager API格式化SD卡,c#,windows-mobile,compact-framework,windows-mobile-6,C#,Windows Mobile,Compact Framework,Windows Mobile 6,背景: 我正在尝试创建一个实用程序,让我们的客户可以轻松地直接在WindowsMobile6设备(IntermecCK3)上格式化SD卡(实际上是迷你SD)。这将优于第三方工具,例如或必须向客户提供读卡器(这将要求客户卸下电池,拔出由薄金属外壳固定的迷你SD卡,然后通过文件管理控件运行Windows格式化实用程序)。我们的大多数客户都不是很懂技术,所以一个可以自动运行或通过几次点击的实用程序将是理想的 到目前为止,我已经尝试了以下方法: 他看了看问题。这里的答案似乎不适用于Windows Mo

背景:

我正在尝试创建一个实用程序,让我们的客户可以轻松地直接在WindowsMobile6设备(IntermecCK3)上格式化SD卡(实际上是迷你SD)。这将优于第三方工具,例如或必须向客户提供读卡器(这将要求客户卸下电池,拔出由薄金属外壳固定的迷你SD卡,然后通过文件管理控件运行Windows格式化实用程序)。我们的大多数客户都不是很懂技术,所以一个可以自动运行或通过几次点击的实用程序将是理想的

到目前为止,我已经尝试了以下方法:

  • 他看了看问题。这里的答案似乎不适用于Windows Mobile(例如,不支持WMI或format.com实用程序)
  • 尝试使用和。这张看起来很有希望,但SD卡似乎永远不会真正格式化。据我所知,这是因为卡需要先卸下
  • 尝试使用和(以及其他变体和)。结果似乎是类似的,我无法格式化卡,除非它是第一次下马
在做了一些搜索之后,我找到了(paraGOD在底部附近的答案)和,我决定走上一条使用的新道路,它具有、、等功能

我试图在C#中实现这一点,因此我创建了必要的支持结构来表示API中使用的typdef。下面是一个示例:

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;
    }
}
然后,我创建了一个静态存储管理器类来保存所有存储管理器函数(应该在coredll for windows mobile 6中提供这些函数……我想大概是这样):

所以我去测试了其中的一些函数,比如通过FindFirstStore和FindNextStore函数简单地枚举存储,然后我得到了可怕的,在PInvoke DLL“Coredll.DLL”中找不到入口点“FindFirstStore”错误(在调试器输出中,我还得到了一个“System.MissingMethodException”类型的第一次异常,它发生在SDFormatter.exe中,这是有意义的)。更多的研究表明,在Windows Mobile中,这些函数不会公开,即使它们是Coredll的一部分。但是,它们是Windows CE 6的一部分,可以通过platform builder访问

以下是我的主要问题:

  • 我可以通过Windows Mobile 6中的C#访问Storage Manager API吗
  • 如果不能,我可以通过托管C++编写一个实用程序(我不知道多少,但如果需要的话我会绊倒它),但是不必使用平台生成器(它不是免费的)?<
  • 如果只能通过platform builder实现,这是否意味着我要么无法构建自己的SDK,要么必须要求Intermec为我公开功能
如果有人提出建议,我也愿意完全用另一种方式(最好是通过C#)来实现。我在想,可能是让客户将设备安装在摇篮中,然后运行桌面实用程序。我不确定这是否可行,它不能依赖ActiveSync(我们不想再支持另一种工具,所以我们通过一个网络适配器向SD卡发送数据,该网络适配器使用套接字连接到支架,在自定义服务器程序和移动应用程序之间进行通信)

谢谢

在Windows Mobile 5.0和更高版本的设备上可以通过公共API获得,因此您不需要任何像platform builder这样的花哨东西

我想我在某个地方读到FindFirstStore在CE6中只被移动到了coredll.dll(我不记得在哪里看到过)。因此,您的Windows Mobile 6设备可能会从其他地方导出它。(可能是storeapi.dll?)

<>尝试用这个代码创建C++项目,看看它对你是否有用:

#pragma comment( lib, "storeapi.lib" )

int _tmain( int /*argc*/, _TCHAR* /*argv*/[] )
{
    STOREINFO si = { 0 };
    si.cbSize = sizeof( STOREINFO );

    HANDLE ffs = ::FindFirstStore( &si );
    if( INVALID_HANDLE_VALUE != ffs )
    {
        ::FindCloseStore( ffs );
    }
    return 0;
}

我们有完全相同的要求,但是在Windows CE上。我们的解决方案是创建一个小型C++应用程序,然后从C代码中调用。这里是C++应用程序最重要的部分:

#include <windows.h>
#include <Storemgr.h>

int _tmain( int /*argc*/, _TCHAR* /*argv*/[] )
{
    WCHAR szDisk[] = L"DSK0";

    hDsk = OpenStore(szDisk);
    if(hDsk == INVALID_HANDLE_VALUE) 
      // ERROR  : Opening Store 

    if (!GetStoreInfo(hDsk, &si))
      // ERROR  : Getting Store Info 

    if(!DismountStore(hDsk)) 
      // ERROR  : Dismounting Store

    if(!FormatStore(hDsk)) 
      // ERROR  : Formatting Store 

    CloseHandle(hDsk);
}
#包括
#包括
int _tmain(int/*argc*/,_TCHAR*/*argv*/[]))
{
WCHAR szDisk[]=L“DSK0”;
hDsk=OpenStore(szDisk);
if(hDsk==无效的句柄值)
//错误:正在打开存储
如果(!GetStoreInfo(hDsk和si))
//错误:正在获取存储信息
如果(!卸载存储(hDsk))
//错误:正在卸载存储
如果(!格式化存储(hDsk))
//错误:格式化存储
闭合手柄(hDsk);
}

我遇到了这个2009年新闻组的帖子,可能与此相关:我明天会尝试一下(可能要等到周三),然后告诉你进展如何。谢谢你的建议。几天前,当我看到这个问题时,我尝试在本机代码中构建类似的内容,但由于WinMo SDK(5.0和6.0)的原因,它无法链接不要包含
storeapi.lib
。我也检查了coredll,但没有发现任何东西。@ctacke-我刚刚回到我的电脑上亲自尝试了一下。你说得对。storeapi.lib是platform builder附带的Windows Mobile源代码的一部分。
PUBLIC\COMMON\OAK\lib\ARMV4I\RETAIL\storeapi.lib
。如果你知道从他导入库,我将查找这些库,他可以按顺序导入函数。问题是WinMo中不存在storeapi.dll(至少在5.0或6.5模拟器上不存在)而且coredll.lib定义不包含store API入口点。我只是运行了我发布的代码,它在windows mobile 6.5.3中工作。调试器显示它正在从coredll.dll加载资源,而没有其他内容。我假设这意味着它仅通过ordinal从coredll导出。
#include <windows.h>
#include <Storemgr.h>

int _tmain( int /*argc*/, _TCHAR* /*argv*/[] )
{
    WCHAR szDisk[] = L"DSK0";

    hDsk = OpenStore(szDisk);
    if(hDsk == INVALID_HANDLE_VALUE) 
      // ERROR  : Opening Store 

    if (!GetStoreInfo(hDsk, &si))
      // ERROR  : Getting Store Info 

    if(!DismountStore(hDsk)) 
      // ERROR  : Dismounting Store

    if(!FormatStore(hDsk)) 
      // ERROR  : Formatting Store 

    CloseHandle(hDsk);
}