wince6.0所支持的软件包是什么格式的,哪有下载的?

wince6.0所支持的软件包是什么格式的,哪有下载的?,第1张

整理一下WINCE6.0的安装过程,发现有很多人自今仍为CE6.0的安装困扰,不是安装失败就是无法编译成功,有的甚至出现破坏先前安装的5.0版本的现象,针对这种现象,结合网上的安装文档,我总结了安装指导说明 PS:文中所指的安装程序路径为我拿到的软件包及在我PC的路径,请根据您的具体路径来修正。 Window CE6.0安装顺序 Windows CE6.0的安装过程繁琐,为确保安装顺利,请仔细阅读本文,按照步骤一步一步进行安装。 一、所需安装软件包括 1、Visual Studio 2005 2、Visual Studio 2005 Service Pack 1 3、MSDN(可选) 4、Windows Embedded CE6.0(即PB6.0) 5、Windows Embedded CE 6.0 Platform Builder Service Pack 1 6、WINCE6.0R2 7、Microsoft Device Emulator 2.0 8、Virtual Machine Network Driver for Microsoft Device Emulator 9、WINCE6.0 Updates 二、所用磁盘空间 在安装之前,请检查您PC的磁盘空间,目标安装盘剩余空间最好大于15G,建议30个G,因为哪滑还要有R3和以后的系统定制和应用开发。C盘李宽腊剩余空间最好大于4G,建议目标安装盘不要选择C盘。 安装程序 所用磁盘空间 Visual Studio 2005 2G Visual Studio 2005 Service Pack 1 1.8G (C盘) MSDN 1.5G Windows Embedded CE6.0 (ARMV4I、X86) 7.8G (C盘1G) WINCE6.0R2 几百M 总共:14G左右 三、安装顺序 1、先安装Visual Studio 2005 安装程序位于VS2005\VSTS\vs目录下,直接双击该目录下setup.exe进行安装。最好别用DEFAULT安装,把组件CUSTOM一下,不然会花很多冤枉的磁盘空间。WINCE600的Platform Builder不像WINCE500是独立的,而是作为VS2005的插件,以后建立和定制OS、编译调试全部在VS2005里完成。 2、安装Visual Studio 2005 Service Pack 1 安装程序位于\VS2005\VSTS\sp1目录下,直接双击该目录下VS80sp1-KB926601-X86-ENU.exe进行安装。这是必须的装的,Release Note里面提到SP1提供了Windows Embedded 6.0 platform and tools support。安装文件为VS80sp1-KB926601-X86-ENU.exe。此补丁对不同的VS2005版本(Standard / Professional / Tem Edition) 都适用。 如果您用的是Vista系统,装巧贺完此补丁后,还要装VS80sp1-KB932232-X86-ENU.exe补丁。 3、安装MSDN 安装程序位于\VS2005\VSTS\msdn目录下,直接双击该目录下setup.exe进行安装。 4、安装Windows Embedded CE6.0 安装程序位于\CE6\Windows Embedded CE 6.0\目录下,直接双击该目录下setup.exe进行安装。在安装过程中,请注意选择安装路径,在选择CPU类型时,根据您目标硬件平台来选择,考虑节省磁盘空间,建议只选ARMV4I和X86。 这里要特别的注意,如何选择路径的问题,小安就是个例子(不要骂我呦,嘿嘿),安装CE 6.0时,选中要安装的选项后选浏览,就可以更改目录了。这里可以参考GM的安装说明,如下: http://blog.csdn.net/gooogleman/archive/2009/05/28/4219567.aspx 5、安装Windows Embedded CE 6.0 Platform Builder Service Pack 1 安装程序位于\CE6\Windows Embedded CE 6.0 Platform Builder Service Pack 1\目录下,直接双击该目录下Windows Embedded CE 6.0 Platform Builder Service Pack 1.msi进行安装。 6、安装WINCE6.0R2 安装程序位于\CE6\CE6R2\目录下,直接双击该目录下setup.exe进行安装。 这里要对WINCE6.0R2进行必要的说明,WinCE6.0 R2 是WinCE6.0的一个增强组件,相当于WinCE6.0的补丁,先安装WinCE6.0之后再安装WinCE6.0 R2就OK! 7、安装Microsoft Device Emulator 2.0 安装程序位于\CE6\Microsoft Device Emulator 2.0\目录下,直接双击该目录下vs_emulator20.exe进行安装。 8、安装Virtual Machine Network Driver for Microsoft Device Emulator 安装程序位于\CE6\ Virtual Machine Network Driver for Microsoft Device Emulator\目录下,直接双击该目录下Virtual Machine Network Driver for Microsoft Device Emulator.msi进行安装。 9、安装WINCE6.0 Updates 安装程序位于\CE6\WinCe 6.0 Patches\目录下,请仔细查看文件的时间序,安装时间序一个一个安装,从WinCEPB60-061231-Product-Update-Rollup-Armv4I.msi开始装,这里只提供到EPB60-080731-2008M07-Armv4I.msi。欲升级最新补丁,请登录微软网站下载 http://www.microsoft.com/windows ... etting-started.mspx 10. 安装WINCE 6.0 R3 利用最新发布的 Windows Embedded CE 6.0 R3,设备制造商可以使用熟悉的工具和创新的技术,创建用户界面更具沉浸感、浏览体验更丰富多彩、与 Windows PC、服务器、服务和设备的连接更具特色的与众不同的设备。以高性能、高可靠性 Windows Embedded CE 平台为基础,设备制造商可以快速、高效地将其设备推向市场。具体怎么样,我也不清楚,我只是把它安装了,怎么用,以后和大家一起探讨吧。 下载地址: http://www.cevx.com/bbs/viewthre ... %26amp%3Btypeid%3D5 当然,有个大家熟悉的牛人做了个调试助手,我把链接发过来: 需要的同学请到这里下载: http://files.cnblogs.com/we-hjb/R3DownLoad.rar Viewers for Windows Embedded CE 6.0 R3 Mobile QQ Messenger Client for Windows Embedded CE 6.0 R3 至此,Windows CE6.0 所有软件安装完毕。 下面我将各个部分的网址链接在这里给出,大家按照上面的步骤,从下面的链接下载即可,不敢保证所有的网址都能正常打开,如果有什么不能下载的,请和我联系,我尽快做出修改。 下载地址: 本文以WINCE6.0 180天免费试用版说明如何安装WINCE6.0 R2 注意必须有足够的硬盘空间。 1. 安装Visual Studio 2005 WINCE6.0作为Visual studio 2005的一个插件,必须首先安装VS2005。 2. 安装VS2005 SP1补丁 根据安装的VS2005的语言版本下载并安装相应的SP1补丁,比如 中文版SP1补丁下载地址: http://www.microsoft.com/downloa ... 6-b39d-37baf6b5b1dc 英文版SP1补丁下载地址: http://www.microsoft.com/downloa ... 6-b39d-37baf6b5b1dc 『说明』请注意,完整安装过程需要耗费较长时间。 3. 安装WINCE6.0 如果使用WINCE6.0 180天试用版可以到 http://www.microsoft.com/windowsembedded/eval/trial.mspx 注册一个密匙并在线安装WINCE6.0,安装速度视网速而定,如果网速不好,可以到网上找离线安装包下载。 安装时注意在选择bsp时选上ARMV4l。 4. 安装WINCE6.0 SP1补丁 下载并安装Windows Embedded CE 6.0 Platform Builder Service Pack 1.msi,下载地址: http://www.microsoft.com/downloa ... &displaylang=en 5. 安装WINCE6.0 R2 在线安装WINCE6.0 R2,地址: http://www.microsoft.com/downloa ... &DisplayLang=en 也可以从网上找离线安装包下载后安装。 6. 给WINCE6.0打补丁 按照时间顺序打补丁,补丁从2007年年底开始。 注意6410必须打上08年1月的补丁WinCEPB60-080131-2008M01-Armv4I.msi,否则会编译失败,下载地址: http://www.microsoft.com/downloa ... &DisplayLang=en 7. 升级.NET Cmpact Framwork3.5 下载地址: http://www.microsoft.com/downloa ... &DisplayLang=en 8.VS2005: 最后,我要补充一点,在安装完Visual Studio 2005之后,应该首先安装VS 2005 SP1,然后再安装PB 6.0。毕竟PB是作为一个插件出现在VS 2005中的,接下来还需要安装PB 6.0 SP1,可以在微软网站上下载,下载地址为: www.microsoft.com/downloads/deta ... &displaylang=en 补充: wince6.0的安装顺序&VS2005(下)Platform Buidler for CE 6.0离线安装包下载: http://hi.baidu.com/tommy1987090 ... 71073333fa1cd0.html 本文参考网址: http://hi.baidu.com/ch_ff/blog/item/7488ee9578638b19d31b7006.html http://blog.mcuol.com/User/lqshu/Article/15812_1.htm http://hi.baidu.com/jjzhang166/b ... 134a4ff21fe786.html http://blog.csdn.net/gooogleman/archive/2009/05/28/4219567.aspx http://blog.163.com/mfk_happy/bl ... 942008816102254414/ http://www.esdevelop.cn/category/windowsce/200801/wince_6.html http://www.cnblogs.com/we-hjb/archive/2009/10/14/1583500.html 转自 http://blog.csdn.net/hao507/archive/2010/03/17/5388044.aspx 补充: 补充一下,看你电脑配置,不装个3、4个小时成不了

有两个地方启动程序:

1. 在注册表HKLM\Init上加入键值:Launch99="你的程序名(可以是绝对路径)",如果你的程序要依赖别的程序,还要加入:Depend99=依赖程序的启动序号(梁滑知让握可以看看Init下其它程序的启动顺序)

2.好像是在HKLM下有个WBT,里面有个地方也可以加入启动程序,每次注销都会重新启动一遍,而Init只有在重新开机时才启动。

你要启动的程橡消序,可以放在你的flash卡上(Init需要加入绝对路径),或者加入bib文件,编译进内核

Windows CE6.0启动铅漏没过程分析 在Windows CE 6.0中,内核(Kenerl)和OEM代码被分成oal.exe、kernel.dll和kitl.dll三个部分,其中启动代码(startup)和 OAL层的实搜世现部分不再与内核链接生成NK.exe,取而代之的是启动代码(startup)和硬件相关且独立于内核的OAL层的实现部分编译成 oal.exe,而与内核相关且独立于硬件的OAL层代码包含在kernel.dll中;内核无关传输层(KITL)的支持代码从OAL层分离出来编译成 kitl.dll。 从表面上看,好像只是代码重新组合了一下,从帮助 文档中BSP的移植过程看好像也是这么一回事,实际上,整个Windows CE 6.0内核布局发生了很大的改变。Windows CE 6.0的启动过程也是如此,如果你想按照Windows CE 5.0的启动顺序去分析Windows CE 6.0的启动顺序,可能会走到一个死胡同。主要是因为Windows CE 6.0在启动过程中调用了kernel.dll和kitl.dll两个动态链接库的原因,而且Windows CE6.0不再编译生成KernKitlProf.exe内核文件。 从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将 *** 作系统编译成槐纳具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。 首先看一下将WinCE6.0编译成诸如 WinCE5.0所说的基本内核情况,即kern.exe。对于oal.exe源码位置比较容易找到,因为oal.exe是启动代码与硬件相关的OAL层 实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kernel.dll,在BSP目录结构中,基本上无法找到kernel.dll的编 译文件,所以必须从其他方面着手。 下面为WinCE 6.0的编译日志输出文件:makeimg.out在文件复制过程的一部分: Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\nk.exe for debugger Copying E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll to E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kernel.dll for debugger 从日志输出文件可以看出,在文件复制过程 中,WinCE6.0编译器将oal.exe更名为nk.exe,而将kern.dll文件更名为kernel.dll,也就是说,kern.dll文件 的实现部分就是kernel.dll的实现体。根据前面的分析,oal.exe是与硬件相关独立于内核的OAL层的实现部分,而kernel.dll为内 核相关独立于硬件的OAL层的实现部分。同样可以从最后整合后的二进制配置文件ce.bib文件中看出端倪。 @CESYSGEN IF CE_MODULES_NK nk.exe E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\oal.exe NK SHZ kitl.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kitl.dll NK SHZ kernel.dll E:\WINCE600\OSDesigns\xsbase270\xsbase270\RelDir\XSBase270_ARMV4I_Release\kern.dll NK SHZ @CESYSGEN ENDIF 而kern.dll动态库在整个Windows CE6.0中没有显式编译过程,即没有一个sources文件有kern.dll的编译过程,所以只能从 *** 作系统的编译文件Makefile中寻找其编译 过程。下面看一下$(_PUBLICROOT)\common\CESYSGEN\makefile中的部分内容: nk::$(NK_COMPONENTS) $(NK_REPLACE_COMPONENTS) @copy $(SG_INPUT_LIB)\oemstub.pdb $(SG_OUTPUT_OAKLIB) @copy $(SG_INPUT_LIB)\oemstub.lib $(SG_OUTPUT_OAKLIB) set TARGETTYPE=DYNLINK set TARGETNAME=kern set RELEASETYPE=OAK set DLLENTRY=NKStartup set DEFFILE=NO_DEF_FILE set TARGETLIBS= set SOURCELIBS=%%NKLIBS%% $(SG_INPUT_LIB)\nkmain.lib $(SG_INPUT_LIB)\fulllibc.lib $(MAKECMD) /NOLOGO NOLIBC=1 kern.dll 从上述代码中可以发现,原来kern.dll动态库是从oemstub.lib编译而来,而且与nkmain.lib有关。 在理顺了上述文件的相互之间的关系之后,再来分析Windows CE 6.0的启动过程可能就比较容易啦。 在理清了上述文件的关系之后,便可以分析任意一款基于ARM微处理器的Windows CE 6.0的启动过程,现在以深圳亿道电子技术有限公司开发的基于PXA270 ARM开发平台为例,分析Windows CE 6.0 *** 作系统启动过程。 1、Startup函数: 从Windows CE 6.0的帮助文档可以看出,WinCE6.0的启动只与oal.exe和kernel.dll有关,至于kitl.dll,只有将 *** 作系统编译成具有 KITL功能时才用到。分析Windows CE 6.0的启动过程实际上找到编译oal.exe和kernel.dll的源码位置。 oal.exe的通过Startup函数完成硬件 的初始化。Startup.s代码与该硬件平台的Bootloader启动代码共用,其中PreInit函数主要完成将ARM处理器工作模式切换到管理员 模式、同时关闭MMU,并检测系统启动原因,如果是热启动、即在该函数调用之前已经启动了Bootloader程序,相当基本硬件初始化已经完成,则直接 跳转到OALStartUp函数中;否则需要进行硬件中断屏蔽、内存、系统时钟频率、电源管理等硬件的基本初始化过程。(具体过程见代码的分析) $(_PLATFORMROOT)\xsbase270\src\common\Startup\Startup.s LEAF_ENTRY StartUp bl PreInit tst r10, #RCSR_HARD_RESET beq OALStartUp tst r10, #RCSR_GPIO_RESET bne Continue_StartUp bl xlli_mem_init 初始化内存控制器 ldr r0, =xlli_PMRCREGS_PHYSICAL_BASEldr r0, [r0, #xlli_PSPR_offset] mov r1, r10 bl XllpPmValidateResumeFromSleep cmp r0, #0 bne Failed_Sleep_ResumeSleep_Reset ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE ldr r0, [r0, #xlli_PSPR_offset]mov r1, r10 b XllpPmGoToContextRestorationFailed_Sleep_Resume ldr r1, =xlli_RCSR_SMR bic r10, r10, r1 Continue_StartUp bl xlli_intr_init初始化中断控制器 bl EnableClks使能内核时钟(内存/OS定时器/FFART时钟之需) bl OALXScaleSetFrequencies 设置系统频率 bl xlli_mem_Topt bl xlli_mem_restart 复位内存,使其处于工作模式 bl xlli_ost_init 初始化 *** 作系统定时器 bl xlli_pwrmgr_init 初始化电源管理 bl xlli_IMpwr_init 初始化内部存储器 b ENTRY_END 2、OALStartUp函数: 在系统硬件初始化完毕之后,Startup调用 OALStartUp函数,OALStartUp函数主要完成将OEMAddressTable表传递给内核;然后调用KernelStart函数跳转到 内核OEMAddressTable表的主要作用表的每一个入口都定义了一个内存中的物理位置、内存的大小以及映射这物理地址的静态虚拟地址; ◆静态虚拟内存地址被定义在缓冲存储器的范围之内; ◆内核可以创建非缓冲的内存地址指向到相同的物理地址; ◆对于同一物理地址,既有一个缓冲的虚拟内存地址,也有一个非缓冲的虚拟内存地址; ◆OEMAddressTable最后必须以0结尾; ◆对于MIPS和SHx类型的CPU,物理地址与虚拟地址的映射由CPU完成,无需创建OEMAddressTable $(_PLATFORMROOT)\xsbase270\src\Inc\ Oemaddrtab_cfg.inc): $(_PLATFORMROOT)\xsbase270\src\oal\OalLib\Startup.s 3、KernelStart函数主要作用: ◆完成OEMAddressTable表中的物理地址到虚拟地址和虚拟地址到物理地址之间的映射; ◆对存储器页表和内核参数区存储空间(RAM或DRAM)进行清零处理。 ◆读出CPU的ID号,内核需要根据该ID决定ARM的MMU处理,因为ARMV6和ARMV6之前的ARM处理器的MMU处理过程有所区别; ◆设置并开启MMU和Cache,因为在Startup函数关闭MMU和Cache; ◆设置ARM处理器工作模式的SP指针,ARM处理器共用7种不同的工作模式 (USER、FIQ、IRQ、Supervisor、Abort、Undefined、System),除用户模式(USER)和系统模式 (System)之外,其他5种工作模式都有具有特定的SP指针寄存器(ARM处理器称其为影子寄存器); ◆读取内核启动所需要的KDataStruct结构体; ◆调用ARMInit函数重新定位Windows CE内核参数pTOC和初始化OEMInitGlobals全局变量; ◆利用mov pc, r12指令跳转到kernel.dll的入口位置,即NKStartup函数中。 $(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\armstart.s 4、ARMInit函数: 在ARMInit之前,系统仍无法使用全局变量, 因为系统的全局还在ROM区域,对于 *** 作系统而言,出于安全考虑,只有XIP程序才有读取ROM区域数据的权利,对于大部分Windows CE *** 作系统,只有将数据拷贝到RAM区域后才能进行读写,ARMInit函数中通过调用KernelRelocate函数对pTOC全局变量重新定位,定位 之后,对内核启动所需要的KDataStruct结构体进行初始化,其中OEMInitGlobals便是交换oal.exe和kernel.dll之间 的全局指针,ARMInit函数返回kernel.dll的入口位置。并在KernelStart函数最后利用mov pc, r12指令跳转到kernel.dll的入口位置,即NKStartup函数中。 $(_PRIVATEROOT)WINCEOS\COREOS\NK\LDR\ARM\arminit.c 5、NKStartup函数: 硬件平台初始化完成后,oal.exe的启动任务基本完成,余下的启动工作由内核相关且独立于内核的OAL层实现体kernel.dll接管。kernel.dll主要作用: ◆从结构体参数KDataStruct * pKData提取内核启动时所必须的全局变量,同时初始化内核全局变量; ◆定位对Windows CE 6.0特有的OEMGLOBAL结构体的初始化函数OEMInitGlobals地址,该结构体构建了内核和OAL层之间进行通信的桥梁。在 OEMGLOBAL结构体定义了OAL层所必须的函数,该结构体在oemglobal.c文件中被初始化,并被编译在OEMMain.lib和 OEMMain_StaticKITL.lib两个库中,如果OAL链接这两个库,则必须要有该结构体中函数实现体; ◆通过调用ARMSetup设置物理地址和非缓冲的虚拟内存地址的映射、ARM中断向量以及内核模式所需要的堆栈。 ◆调用OEMInitDebugSerial函数初始化调试串口; ◆调用OEMInit进行平台初始化; 需要注意的时,NKStartup函数调用OEMInitDebugSerial和 OEMInit函数的过程与Windows CE 6.0之前的版本完全不同,这是因为在Windows CE 6.0以前的版本中,由于内核(kernel)、OAL和KITL编译在一个可执行的文件中,它们之间的共享变量只需简单利用extern关键字申明便可 相互之间进行访问,而在Windows CE 6.0中,由于内核(kernel)、OAL和KITL被编译成不同的可执行文件,变量之间的相互访问无法使用extern关键字实现共享,即内核无法使 用extern DWORD varX方法访问OAL层的变量varX,当然OAL层的实现体同样无法通过同样的方式访问内核变量。为实现内核和OAL访问共享信息,Windows CE 6.0定义了OEMGLOBAL和GLOBAL两个结构体。 在 Windows CE 6.0的内核启动时,OS找到OAL的入口位置,然后调用入口函数与全局块进行指针交换,这样内核才能使用OAL层中的信息,同样OAL层才能访问内核(kernel)导出的函数。 所以上述两个函数的调用实际上通过OEMGLOBAL结构体实现的。实际调用位置为$(_PRIVATEROOT)\winceos\coreos \nk\oemstub\oemstub.c中的OEMInitDebugSerial和OEMInit,这两个函数中通过OEMGLOBAL结构体指针 访问OAL层中的OEMInitDebugSerial和OEMInit。 首先看一下将WinCE6.0编译成诸如WinCE5.0所说的基本内核情况,即kern.exe。对于oal.exe源码位置比较容易找到,因为 oal.exe是启动代码与硬件相关的OAL层实现文件编译而成,所以只需在BSP的OAL目录中便能找到。而对于kernel.dll,在BSP目录结 构中,基本上无法找到kernel.dll的编译文件,所以必须从其他方面着手。 调用KernelFindMemory()函数分割RAM区域,在Windows CE *** 作系统中,RAM空间主要分为存储内存和程序内存,存储内存主要为文件的存储空间,包括内核文件和复制到系统中所有目标文件,程序内存为运行程序时所需要的存储空间。 ◆KernelStart ()启动内核。 $(_PRIVATEROOT)\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c void NKStartup (struct KDataStruct * pKData) { 。。。。 } 6、KernelSstart函数: 这里的KernelStart函数与前面的KernelStart函数的属于两个完全不 同的函数,NKStartup函数中调用的KernelStart函数为$(_PRIVATEROOT)\WINCEOS\COREOS\NK \KERNEL\ARM\armtrap.s文件中的KernelStart函数,主要完成调用内核初始化函数KernelInit,并跳转到 *** 作系统的 第一个启动的任务。 LEAF_ENTRY KernelStart ldr r4, =KData (r4) = ptr to KDataStruct ldr r0, =APIRet str r0, [r4, #pAPIReturn] set API return address mov r1, #SVC_MODE msr cpsr_c, r1 switch to Supervisor Mode w/IRQs enabled CALL KernelInit initialize scheduler, etc. mov r0, #0 no current thread mov r1, #ID_RESCHEDULE b FirstSchedule ENTRY_END 7、KernelInit函数: Windows CE 6.0的内核初始化函数同其他版本的内核初始化函数基本相近,主要完成在启动第一个线程前对内核进行初始化,主要包括API函数集初始化、堆的初始化、初始化内存池、进程初始化、线程初始化和文件映射初始化等 *** 作。 void KernelInit (void) 。。。{ } 8、FirstSchedule: FirstSchedule函数为Windows CE *** 作系统启动过程中最后无条件跳转的一个函数,windows CE进行第一个调度,实际为一个空闲线程,因为windows CE系统还没有完成启动,只有当windows CE完全启动并进入稳定状态,然后启动文件系统filesys.dll,设备管理device.dll,窗体图像子系统gews.dll和shell程序 explore.exe。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8282853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存