C# 如何通过Windows Mobile 6使用Storage Manager API格式化SD卡
背景: 我正在尝试创建一个实用程序,让我们的客户可以轻松地直接在WindowsMobile6设备(IntermecCK3)上格式化SD卡(实际上是迷你SD)。这将优于第三方工具,例如或必须向客户提供读卡器(这将要求客户卸下电池,拔出由薄金属外壳固定的迷你SD卡,然后通过文件管理控件运行Windows格式化实用程序)。我们的大多数客户都不是很懂技术,所以一个可以自动运行或通过几次点击的实用程序将是理想的 到目前为止,我已经尝试了以下方法: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
- 他看了看问题。这里的答案似乎不适用于Windows Mobile(例如,不支持WMI或format.com实用程序)
- 尝试使用和。这张看起来很有希望,但SD卡似乎永远不会真正格式化。据我所知,这是因为卡需要先卸下
- 尝试使用和(以及其他变体和)。结果似乎是类似的,我无法格式化卡,除非它是第一次下马
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为我公开功能
#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);
}