Windows Phone 7开发折腾笔记(一)

昨天实在是把这学期的项目拖得不能再拖了,作为一个极端偏执的微软教徒(为什么要叫教徒呢,在java和.net的大战中,作为一个还算不错的coder,我自然知道java是非常的好的,但就是毫无理由地恨它,并拒绝接受一切和它有关的东西,比如android),我自然而然选择了ce平台,而把现在的手机拿去交作业看上去似乎太落伍,所以走了wp7路线,不过新手机倒还没买,先用电脑做开发还是可以的。

首先说下WP7 SDK在xp下安装的问题,因为学校的机房是xp,这个就比较纠结,sdk在xp下大家也都有破解的办法,就是把baseline.dat中两行从1改成0,网上都有,无需多说。这里主要说一下模拟器怎么运行。我在学校运行模拟器会没法启动,找不到MFPlat.dll,这个简单,直接上网down一个就行了,但这之后模拟器可以跑起来,但没法启动系统,提示一个乱码的dll有问题,经多方面搜索,得知是缺一个bcrypt.dll,但这个文件是不能随便从网上下载的,因为它是从vista才开始有的,而且它的功能是通过调用驱动在内核实现的,所以这个文件我们必须自己编译。打开VC6,新建工程bcrypt,添加一个cpp文件,内容如下:

#include <windows.h>
 
typedef struct _BCRYPT_ALGORITHM_IDENTIFIER
{
    LPWSTR pszName;
    ULONG  dwClass;
    ULONG  dwFlags;
} BCRYPT_ALGORITHM_IDENTIFIER;

typedef PVOID BCRYPT_ALG_HANDLE;
  
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            DisableThreadLibraryCalls(hInstDLL);
        break;
    }
    return TRUE;
}

LONG WINAPI BCryptEnumAlgorithms(ULONG dwAlgOperations, ULONG *pAlgCount, BCRYPT_ALGORITHM_IDENTIFIER **ppAlgList, ULONG dwFlags)
{
    *ppAlgList=NULL;
    *pAlgCount=0;
    return ERROR_CALL_NOT_IMPLEMENTED;
}

LONG WINAPI BCryptOpenAlgorithmProvider(
  BCRYPT_ALG_HANDLE *phAlgorithm,
  LPCWSTR pszAlgId,
  LPCWSTR pszImplementation,
  DWORD dwFlags
)
{
    return ERROR_CALL_NOT_IMPLEMENTED;
}

LONG
WINAPI
BCryptGenRandom(
    BCRYPT_ALG_HANDLE   hAlgorithm,
    PUCHAR  pbBuffer,
    ULONG   cbBuffer,
    ULONG   dwFlags)
{
    return ERROR_CALL_NOT_IMPLEMENTED;
}

LONG
WINAPI
BCryptCloseAlgorithmProvider(
    BCRYPT_ALG_HANDLE   hAlgorithm,
    ULONG   dwFlags)
{
    return ERROR_CALL_NOT_IMPLEMENTED;
}

然后添加一个def文件将几个函数导出:

LIBRARY bcrypt
EXPORTS
BCryptEnumAlgorithms
BCryptOpenAlgorithmProvider
BCryptGenRandom
BCryptCloseAlgorithmProvider

编译出bcrypt.dll即可,此时模拟器就可以正常启动了,因为没有d3d10,好像没法做xna框架的游戏,ie渲染好像也不行,不过silverlight的应用是可以正常调试的。

然后就试着写一个程序,发现了一个关键的问题:Silverlight框架是一个独立的.NET框架,与我们PC与WM5、6的.NET是完全不同的,为PC或WM5、6编写的代码是基本无法移植过去的,需要重新编写。

列举几个我遇到的问题。我的程序很简单,提交对12306的请求查火车正晚点。

首先,是HttpWebRequest的问题。SL本来是做网页应用的,类似ajax,它要求数据的请求必须异步,也就是说WebRequest没有GetResponse方法,这样一来我原来的代码肯定是没法用了,同时,异步成为一种模式贯穿整个SL应用开发中,可能我们原来随便写个messagebox向用户请求信息,但在SL中必须改成异步。

然后,对于Response的内容处理又遇到了问题,12306返回的网页是ANSI编码,也就是gbk/gb2312,我按照常规的写法在读取时对StreamReader中传入Encoding.GetEncoding(“gb2312”)居然不被支持,阅读MSDN才知道SL只支持Unicode的big和little endian和UTF-8,发生这一问题的原因是.NET中编码的转换是Windows系统完成的,而SL作为Flash的同类产品要求跨平台,如果要转码就要把各种国家的字符映射表放到SL里,这样SL自己就变得很庞大,很显然微软永远不会这么做。在Web开发中我们可以调用ASP.NET写的一个转码的WebService完成,但在WP7中,如果需要就要自己用一个字符映射表实现Encoding类了。这里我用的是网上某个SL项目中的Gb2312Encoding.cs,需要的搜一下便知,不好之处也很显然,就是每个WP7应用如果需要gbk的处理都要增加100K左右的程序大小。希望以后微软能对WP的SL做一些改进使之能调用一些原来.NET CF的功能吧。

今天上午就折腾了这么多,以后有新发现再写~

3 Replies to “Windows Phone 7开发折腾笔记(一)”

Leave a Reply

Your email address will not be published. Required fields are marked *