├── PSP开发简明教程(1) ├── README.md └── image │ ├── 01.jpg │ ├── 02.jpg │ └── 04.jpg ├── PSP开发简明教程(2) ├── README.md ├── image │ ├── 01.jpg │ ├── 02.jpg │ ├── 03.jpg │ ├── 04.jpg │ ├── 05.jpg │ ├── 06.jpg │ ├── 07.jpg │ ├── 08.jpg │ ├── 09.jpg │ ├── 10.jpg │ ├── 11.jpg │ └── 12.jpg └── src │ └── Controler │ ├── Makefile │ └── main.c ├── PSP开发简明教程(3) ├── README.md ├── image │ ├── 01.jpg │ ├── 02.jpg │ └── 03.jpg └── src │ └── Hello World │ ├── Makefile │ └── main.c ├── README.md ├── Template ├── README.md └── image │ └── 01.jpg ├── 如何使用C++读取配置文件(ini) ├── README.md └── src │ ├── IpConfig.ini │ └── src.cpp └── 如何使用Python3读取配置文件(ini) ├── readme.md └── src ├── IpConfig.ini └── src.py /PSP开发简明教程(1)/README.md: -------------------------------------------------------------------------------- 1 | #PSP开发简明教程(1) 2 | 3 | ##**PSP游戏机** 4 | 5 | PSP,即PlayStation Portable。是索尼于2004年12月12日发售的掌上型游戏机。 6 | 7 | 它采用4.3寸16:9比例、背光全透式的夏普ASV超广可视角液晶屏幕,屏幕分辨率达到480*272像素,而且色彩鲜艳亮丽,显示效果一流。同时拥有介于PS1和PS2之间的3D多边形绘图性能。 8 | 9 | 除此之外,它还可以播放视频和音乐文件。所以PSP不单单是一台掌上游戏机,更像是一部掌上多媒体娱乐终端设备。 10 | 11 | ![PSP][1] 12 | 13 | (PSP掌上游戏机) 14 | 15 | ##**PSP破解** 16 | 17 | 因为PSP不支持自制软件,并且游戏售价高昂(400人民币左右),所以就有有人开始研究如何在PSP运行自制软件。(或者免费玩儿游戏?) 18 | 19 | 高手在民间。 20 | 21 | 仅在PSP发售的半年后,国外黑客组织就破解了PSP系统,并在一个月后发布了自制的“Hello World”程序(意味着大家可以写自制程序了)。随着日后破解的不断完善,PSP也进入了一个新的时代。(一个破解游戏镜像和自制程序满天飞的时代……) 22 | 23 | ![Dark_AleX][2] 24 | 25 | (PSP破解领域的王者Dark_AleX) 26 | 27 | 为什么说是新时代呢?因为个人感觉PSP的大热绝对和自制软件的盛行有着很大的关系。(起码在国内是这个样子) 28 | 29 | 自制软件出现后,人们不光可以用PSP玩游戏,还可以看小说,听音乐(比官方支持的格式更多),看视频(支持字幕和更多的格式),更有甚者把PSP的功能发挥到了极致,比如说利用线控口接收GPS模块的信号([链接在这里][3]),以取代昂贵的官方GPS模块,或者利用自带的WIFI进行无线入侵等等。 30 | 31 | 而且还能够免费玩游戏。(这才是重点吧……) 32 | 33 | 可以说自制软件的出现让PSP从一款掌上多媒体娱乐终端设备一跃成为一部掌上电脑,功能得到了极大地扩充,所以说PSP因此进入新的时代,也不为过吧………^_^ 34 | 35 | ##**PSP软件开发** 36 | 37 | 其实PSP已经是一个快过时的设备了,这里的PSP特指PSP1000-3000和PSP GO。而最新的PSV(PlayStation Vita)虽然性能更加强大,功能也多了不少(背板触摸,蓝牙等),但因为Sony防破解技术的升级,到目前为止,还没有破解的方法。 38 | 39 | ![PS Vita][4] 40 | 41 | (Sony最新的次时代掌机PS Vita) 42 | 43 | 有关的资料也少之又少。(SDK已经停止更新,开发论坛也基本上没有人了) 44 | 45 | 不过我还是想写一篇简明教程。一是在置顶博客中提到的,对自己学到的东西进行总结。另一个就是或许能够给他人打来启发。老设备新用的例子还是有的。最后还有一个原因就是,自己从高一有PSP开始,就非常希望能够自己编写PSP自制软件,高中和大学期间断断续续的研究了好几次,而现在总算是能够凭借自己所学到的知识参透些许东西了,所以想写点东西,给自己的当年的愿望一个交代。 46 | 47 | 废话多了些貌似……那就下一篇开始正经将PSP开发吧! 48 | 49 | **本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。** 50 | 51 | >Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) 52 | 53 | 54 | 55 | 56 | [1]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%881%EF%BC%89/image/01.jpg 57 | [2]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%881%EF%BC%89/image/02.jpg 58 | [3]:http://www.cnetnews.com.cn/2008/0611/920398.shtml 59 | [4]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%881%EF%BC%89/image/04.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(1)/image/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(1)/image/01.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(1)/image/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(1)/image/02.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(1)/image/04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(1)/image/04.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/README.md: -------------------------------------------------------------------------------- 1 | #PSP开发简明教程(2) 2 | 3 | ##**开头** 4 | 5 | 接着上文,这篇文章将具体说明如何搭建PSP开发环境。因为我是刚开始写教程类文章,加上对这一类型的程序开发不是很了解,所以文章可能有说的不明白,甚至错误的地方。还望大家能够指正。见谅! 6 | 7 | ##**使用的软件和教程** 8 | 9 | 为了编写PSP自制程序,我们需要如下软件: 10 | 11 | **MinPSPW(Minimalist PSPSDK)**:[链接在这里][1] 12 | 13 | **Eclipse IDE for C/C++ Developers**:[链接在这里][2] 14 | 15 | 其中MinPSPW也可以用DevKitPSP代替([链接在这里][3]),不过因为现在最新固件(6.60)的破解程序([PROCFW][4])是用MinPSPW编译的,为防止出什么稀奇古怪的问题,我就选择了和它一样的环境。 16 | 17 | 选择MinPSPW的另一个原因是,它有一个比较好的官方教程,名字叫**PSP Development with Eclipse**。教程详细的说明了如何搭建开发环境和编译自制程序,本文也是依据这个写的。所以,如果英语比较好,完全可以看这官方给出的教程,肯定比我写的好。[教程在这里][5] 18 | 19 | ##**软件的安装** 20 | 21 | MinPSPW的安装没什么好说的,在项目网站选择最新的程序,一路默认选项安装就是。安装完成后,它会在系统环境变量中添加自己的运行目录。 22 | 23 | ![MinPSPW的环境变量][6] 24 | 25 | **(MinPSPW的环境变量)** 26 | 27 | Eclipse我们选择C/C++ Developers版本,因为软件是绿色版本的,所以也没有安装一说。不过需要注意的是,Eclipse是基于Java编写的,所以需要电脑具有Java运行环境([没有的可以从这里安装][7])。 28 | 29 | 至此安装工作就算完成了。 30 | 31 | ##**环境配置** 32 | 33 | 之前说过,MinPSPW会在安装后自动在环境变量中添加运行目录,所以我们只需要检查一下它是否可用就可以。命令提示符中执行`psp-gcc --version`,应该会出现psp-gcc相关的版本信息。 34 | 35 | ![psp-gcc版本信息][8] 36 | 37 | **(psp-gcc版本信息)** 38 | 39 | 接着说Eclipse,它在第一次执行的时候应该会让你设置工作空间,这里本人建议最好能够新建一个文件夹,比如WorkSpace,来存放所有用Eclpise开发的软件文件夹,因为它会在你指定的目录里面生成一些其它的文件。 40 | 41 | ![Eclipse弹窗][9] 42 | 43 | **(第一次使用Eclipse时的弹窗)** 44 | 45 | 至此整个环境就基本可用了。 46 | 47 | 其实官方教程里面还对Eclipse做了其他设置,比如PSP的USB调试功能。这里就不细讲了,如果确实想了解的同学可以翻阅官方文档。 48 | 49 | ##**工程编译** 50 | 51 | PSP的自制程序使用Makfile进行构建。这里我们以一个SDK中自带的例子来说明如何构建程序。 52 | 53 | 首先,我们在Eclipse中的`Project explorer`中单击右键,选择`Import`,导入工程 54 | 55 | ![Import][10] 56 | 57 | **(导入工程)** 58 | 59 | 在弹出的`Import`窗口中,选择`C/C++ -> Existing file as Makefile project`,从既有文件导入Makefile工程。 60 | 61 | ![导入Makefile][11] 62 | 63 | **(从既有文件导入Makefile工程)** 64 | 65 | 进入下一步,在第二个框中填入我们要加入的示例文件的文件夹。这里我们选择PSPSDK中一个关于按键操作的示例进行演示。(位置在:(MinPSPW安装位置)\psp\sdk\samples\controller\basic) 66 | 67 | 建议将示例程序另复制一份,以免破坏了原有的示例程序。 68 | 69 | ![目录设置][12] 70 | 71 | **(目录设置)** 72 | 73 | 点击`Finish`,工程导入完成了。在Eclipse的左侧,可以看到我们导入的程序代码(main.c)和Makefile。 74 | 75 | ![工程目录结构][13] 76 | 77 | **(工程目录结构)** 78 | 79 | 然后我们就可以进行编译了。在Eclipse的菜单栏的Project菜单中,选择`Build Project` 80 | 81 | 就完成编译了。 82 | 83 | ![编译][14] 84 | 85 | **(编译)** 86 | 87 | 大家在查看main.c时,可能会发现满篇的红色波浪线,各种头文件无法找到。 88 | 89 | ![头文件错误][15] 90 | 91 | **(头文件错误)** 92 | 93 | 虽然显得很乱,但其实并不影响程序的构建,因为Makefile中对头文件目录进行了设置。 94 | 95 | 所以这里会显示头文件无法找到,仅仅只是Eclipse无法找到而已。不信的话,可以把最下侧的对话框切换到`Console`,就可以看出来构 建没有任何问题。 96 | 97 | ![Console对话框][16] 98 | 99 | **(Console对话框)** 100 | 101 | 如果觉得波浪线碍眼,我们可以在工程设置里面`C/C++ General -> Paths and Symbols`的`Includes`里面,添加目录`(MinPSPW安装位置)\psp\sdk\include`进去,记得勾选`Add to all languages`。这样,就没有碍眼的错误提示了。 102 | 103 | ![Include设置][17] 104 | 105 | **(Include设置)** 106 | 107 | 其实这样更重要的是,我们可以直接在编写代码的时候看到每个函数的描述信息。 108 | 109 | ![函数描述信息][18] 110 | 111 | **(函数描述信息)** 112 | 113 | 以上就是整个PSP软件开发环境的配置过程。 114 | 115 | ##**自制软件的运行** 116 | 117 | 在编译之后,我们可以在源文件目录下找到一个叫`EBOOT.PBP`的文件。熟悉PSP自制软件的读者应该知道,这是PSP上类似于Windows下*.exe的东西。我们只要把它拷贝到PSP上面,就可以运行它了。 118 | 119 | 我们把它拷贝到PSP记忆棒目录下`PSP\GAME\Controler\`文件夹中。完后在PSP上面运行它(就像运行游戏一样)。 120 | 121 | Controler basic程序的功能是将所有你按下的按键显示在屏幕上。 122 | 123 | *PSP莫名其妙的连不上电脑了。。。等我修好了上这张图(┬_┬)* 124 | 125 | **(Controler运行界面)** 126 | 127 | ##**总结** 128 | 129 | 以上就是PSP开发环境配置全过程。 130 | 131 | 当然官方教程中给出的功能可不止这些,它还说明了如何USB进行自制程序的在线调试。并给出了使用Bullet进行3D游戏开发的配制方法,这里就不一一说明了。有兴趣的可以参照官方教程自行配置使用。 132 | 133 | 下一篇文章将简单的说明一下Makfile和源代码的结构(网上既有的资料 + 个人比较浅显的理解)。并将自己所做过的些探索一一列出来,使读者们少走些弯路。 134 | 135 | 这篇文章就写到这里了。 136 | 137 | **本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。** 138 | 139 | >Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) 140 | 141 | 142 | 143 | 144 | [1]:http://sourceforge.net/projects/minpspw/ 145 | [2]:https://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/keplersr2 146 | [3]:http://sourceforge.net/projects/devkitpro/files/devkitPSP/ 147 | [4]:https://code.google.com/p/procfw/ 148 | [5]:http://sourceforge.net/projects/minpspw/files/book/PSP%20Dev%20with%20Eclipse/ 149 | [6]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/01.jpg 150 | [7]:http://www.java.com/zh_CN/ 151 | [8]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/02.jpg 152 | [9]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/03.jpg 153 | [10]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/04.jpg 154 | [11]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/05.jpg 155 | [12]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/06.jpg 156 | [13]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/07.jpg 157 | [14]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/08.jpg 158 | [15]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/09.jpg 159 | [16]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/10.jpg 160 | [17]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/11.jpg 161 | [18]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/12.jpg 162 | [19]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%882%EF%BC%89/image/13.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/01.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/02.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/03.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/04.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/05.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/06.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/07.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/08.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/09.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/10.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/11.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/image/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(2)/image/12.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(2)/src/Controler/Makefile: -------------------------------------------------------------------------------- 1 | TARGET = controller_basic 2 | OBJS = main.o 3 | 4 | INCDIR = 5 | CFLAGS = -O2 -G0 -Wall 6 | CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti 7 | ASFLAGS = $(CFLAGS) 8 | 9 | LIBDIR = 10 | LDFLAGS = 11 | 12 | EXTRA_TARGETS = EBOOT.PBP 13 | PSP_EBOOT_TITLE = Basic controller sample 14 | 15 | PSPSDK=$(shell psp-config --pspsdk-path) 16 | include $(PSPSDK)/lib/build.mak 17 | -------------------------------------------------------------------------------- /PSP开发简明教程(2)/src/Controler/main.c: -------------------------------------------------------------------------------- 1 | /* 2 | * PSP Software Development Kit - http://www.pspdev.org 3 | * ----------------------------------------------------------------------- 4 | * Licensed under the BSD license, see LICENSE in PSPSDK root for details. 5 | * 6 | * main.c - Basic Input demo -- reads from control pad and indicates button 7 | * presses. 8 | * 9 | * Copyright (c) 2005 Marcus R. Brown 10 | * Copyright (c) 2005 James Forshaw 11 | * Copyright (c) 2005 John Kelley 12 | * Copyright (c) 2005 Donour Sizemore 13 | * 14 | * $Id: main.c 1095 2005-09-27 21:02:16Z jim $ 15 | */ 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | 22 | /* Define the module info section */ 23 | PSP_MODULE_INFO("CONTROLTEST", 0, 1, 1); 24 | 25 | /* Define the main thread's attribute value (optional) */ 26 | PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU); 27 | 28 | /* Define printf, just to make typing easier */ 29 | #define printf pspDebugScreenPrintf 30 | 31 | void dump_threadstatus(void); 32 | 33 | int done = 0; 34 | 35 | /* Exit callback */ 36 | int exit_callback(int arg1, int arg2, void *common) 37 | { 38 | done = 1; 39 | return 0; 40 | } 41 | 42 | /* Callback thread */ 43 | int CallbackThread(SceSize args, void *argp) 44 | { 45 | int cbid; 46 | 47 | cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL); 48 | sceKernelRegisterExitCallback(cbid); 49 | sceKernelSleepThreadCB(); 50 | return 0; 51 | } 52 | 53 | /* Sets up the callback thread and returns its thread id */ 54 | int SetupCallbacks(void) 55 | { 56 | int thid = 0; 57 | 58 | thid = sceKernelCreateThread("update_thread", CallbackThread, 59 | 0x11, 0xFA0, 0, 0); 60 | if(thid >= 0) 61 | { 62 | sceKernelStartThread(thid, 0, 0); 63 | } 64 | 65 | return thid; 66 | } 67 | 68 | int main(void) 69 | { 70 | SceCtrlData pad; 71 | 72 | pspDebugScreenInit(); 73 | SetupCallbacks(); 74 | 75 | sceCtrlSetSamplingCycle(0); 76 | sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG); 77 | 78 | while(!done){ 79 | pspDebugScreenSetXY(0, 2); 80 | 81 | sceCtrlReadBufferPositive(&pad, 1); 82 | 83 | printf("Analog X = %d ", pad.Lx); 84 | printf("Analog Y = %d \n", pad.Ly); 85 | 86 | if (pad.Buttons != 0){ 87 | if (pad.Buttons & PSP_CTRL_SQUARE){ 88 | printf("Square pressed \n"); 89 | } 90 | if (pad.Buttons & PSP_CTRL_TRIANGLE){ 91 | printf("Triangle pressed \n"); 92 | } 93 | if (pad.Buttons & PSP_CTRL_CIRCLE){ 94 | printf("Circle pressed \n"); 95 | } 96 | if (pad.Buttons & PSP_CTRL_CROSS){ 97 | printf("Cross pressed \n"); 98 | } 99 | 100 | if (pad.Buttons & PSP_CTRL_UP){ 101 | printf("Up pressed \n"); 102 | } 103 | if (pad.Buttons & PSP_CTRL_DOWN){ 104 | printf("Down pressed \n"); 105 | } 106 | if (pad.Buttons & PSP_CTRL_LEFT){ 107 | printf("Left pressed \n"); 108 | } 109 | if (pad.Buttons & PSP_CTRL_RIGHT){ 110 | printf("Right pressed \n"); 111 | } 112 | 113 | if (pad.Buttons & PSP_CTRL_START){ 114 | printf("Start pressed \n"); 115 | } 116 | if (pad.Buttons & PSP_CTRL_SELECT){ 117 | printf("Select pressed \n"); 118 | } 119 | if (pad.Buttons & PSP_CTRL_LTRIGGER){ 120 | printf("L-trigger pressed \n"); 121 | } 122 | if (pad.Buttons & PSP_CTRL_RTRIGGER){ 123 | printf("R-trigger pressed \n"); 124 | } 125 | } 126 | } 127 | 128 | sceKernelExitGame(); 129 | return 0; 130 | } 131 | -------------------------------------------------------------------------------- /PSP开发简明教程(3)/README.md: -------------------------------------------------------------------------------- 1 | #PSP开发简明教程(3) 2 | 3 | ##**开头** 4 | 5 | 上一篇文章说明了如何搭建PSP软件的开发环境,这一篇将大概讲一下关于程序开发的问题。主要会讲到Makefile中各项参数的含义,并说明一下代码的框架。 6 | 7 | 其实这部分内容我也是看别人的文章学来的(参考文献在文章末尾),并没有研究的太深,所以如果有说的不大明白的地方,还请见谅! 8 | 9 | ##**Makefile** 10 | 11 | 之前说过,PSP自制软件使用Makefile进行构建,所以这里对Makefile中的各项做个简单的说明。 12 | 13 | 下面就给出一个Makefile的示例 14 | 15 | #目标文件 16 | TARGET = hello_world 17 | 18 | OBJS = main.o 19 | 20 | INCDIR = 21 | CFLAGS = -G0 -Wall -O2 22 | CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti 23 | ASFLAGS = $(CFLAGS) 24 | 25 | LIBDIR = 26 | LDFLAGS = 27 | 28 | #是否构建PRX 29 | BUILD_PRX = 1 30 | 31 | #生成文件名(不可改动) 32 | EXTRA_TARGETS = EBOOT.PBP 33 | 34 | #软件名称 35 | PSP_EBOOT_TITLE = Hello World 36 | #软件图标(144*80) 37 | PSP_EBOOT_ICON= ICON0.png 38 | #软件背景(480*272) 39 | PSP_EBOOT_PIC1= PIC1.png 40 | #软件背景音乐(AT3格式) 41 | PSP_EBOOT_SND0= SND0.at3 42 | 43 | #PSPSDK路径 44 | PSPSDK=$(shell psp-config --pspsdk-path) 45 | include $(PSPSDK)/lib/build.mak 46 | 47 | 可以看出来Makefile还能够为我们的自制程序添加背景,图标和背景音乐等功能。 48 | 49 | 需要注意的是,`BUILD_PRX=1`最好不要省略,如果省略的话,会只生成静态可执行文件。按照其它教程的说法,这样做的话,程序的兼容性不大好。 50 | 51 | 还有一点要注意的就是,PRX其实有两种解释,一种解释是PRX类似于后台程序,金手指就算这种类型的程序。他不能够直接运行,需要依赖系统或者其他可执行程序才可以用。通常被放在记忆棒的seplugins目录下。 52 | 53 | 另一种就是我们上面说的,有点类似于内部链接库的东西,程序在执行时需要调用它。 54 | 55 | ##**样例程序** 56 | 57 | #include 58 | #include 59 | 60 | //程序相关的信息,依次是程序名称、运行模式、主版本号,次版本号 61 | PSP_MODULE_INFO("Hello World", PSP_MODULE_USER, 1, 0); 62 | 63 | //定义主线程的属性 64 | PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER); 65 | PSP_HEAP_SIZE_MAX(); 66 | 67 | //为了使用方便,将pspDebugScreenPrintf定义为printf,用法也和printf一样。 68 | #define printf pspDebugScreenPrintf 69 | 70 | int done = 0; 71 | 72 | /////////////////////////////////////////////////////////////// 73 | 74 | /* Exit callback */ 75 | int exit_callback(int arg1, int arg2, void *common) 76 | { 77 | done = 1; 78 | return 0; 79 | } 80 | 81 | /* Callback thread */ 82 | int CallbackThread(SceSize args, void *argp) 83 | { 84 | int cbid; 85 | 86 | cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL); 87 | sceKernelRegisterExitCallback(cbid); 88 | sceKernelSleepThreadCB(); 89 | return 0; 90 | } 91 | 92 | /* Sets up the callback thread and returns its thread id */ 93 | int SetupCallbacks(void) 94 | { 95 | int thid = 0; 96 | 97 | thid = sceKernelCreateThread("update_thread", CallbackThread, 98 | 0x11, 0xFA0, 0, 0); 99 | if(thid >= 0) 100 | { 101 | sceKernelStartThread(thid, 0, 0); 102 | } 103 | 104 | return thid; 105 | } 106 | 107 | /////////////////////////////////////////////////////////////// 108 | 109 | int main(void) 110 | { 111 | //初始化DebugScreen,这样就可以在屏幕上显示了 112 | pspDebugScreenInit(); 113 | 114 | //创建线程监听用户行为,为了能够退出程序 115 | SetupCallbacks(); 116 | 117 | //主循环体,用户退出时,done会变为1,循环退出 118 | while(!done) 119 | { 120 | pspDebugScreenSetXY(0, 0); 121 | printf("Hello World!\n"); 122 | printf("Test by Max"); 123 | sceDisplayWaitVblankStart(); 124 | } 125 | 126 | //彻底退出 127 | sceKernelExitGame(); 128 | 129 | return 0; 130 | } 131 | 132 | 这里给出一个简单的Hello World程序做代码框架解释。乍看挺乱的,但逻辑上并不复杂。 133 | 134 | 被斜杠框住的一大堆函数,实现的功能就是我们按下`Home`键的时候,能够退出程序。如果看不懂的话(比如说我=_=),可以暂时略过。其它的程序里面按照这个写也没有大的问题。 135 | 136 | 主函数一目了然,先初始化显示,创建线程监听用户操作,然后进入主循环体循环。 137 | 138 | 整个程序的结构大致就是这样。 139 | 140 | 大家可以尝试按照上一篇文章所讲的方法,构建出Hello World程序。 141 | 142 | 不过要注意的是,因为我们在Makefile里面定义了图标,背景等,所以需要在工程文件夹下面放置符合要求的图片和音乐文件,才能保证编译通过。如果实在懒得弄,也可以直接删掉这几行命令。 143 | 144 | 运行效果(使用CMF截图): 145 | 146 | ![小图标][1] 147 | 148 | **(小图标)** 149 | 150 | ![背景图片][2] 151 | 152 | **(背景图片)** 153 | 154 | ![运行效果][3] 155 | 156 | **(运行效果)** 157 | 158 | 对于程序的说明就到这里吧。个人水平实在是有限。 159 | 160 | 如果想要写一些真正能用的东西,下面这些资料可以做参考。 161 | 162 | ##**参考文档、论坛** 163 | 164 | 我找了半天也没找到官方出的开发文档。但是在MINPSPW文件夹下发现了官方的编程参考手册。 165 | 166 | >**PSP编程参考手册(由Doxygen生成)** 167 | > 168 | >(MinPSPW安装位置)\doc\pspsdk\index.html 169 | 170 | 这个手册是SDK作者用Doxygen生成的,是网页版本的。 171 | 172 | 里面有对函数的说明,和函数参数的格式等等,不过说的不是很细。光看这个我感觉还是不清楚每个模块该如何使用。 173 | 174 | 但是我在其它地方发现了两个PSP开发的入门教程、wiki,我的文章也参照这两份教程。 175 | 176 | >**[PSP Programming(WIKIBOOKS)][4]** 177 | > 178 | >**[linuxgraphics psp专栏(刘鹏)][5]** 179 | > 180 | >第二个博客里面讲的PSP破解史比我说的详细的多,推荐大家看看 181 | 182 | 这两份教程讲的都比较浅,和我说的差不了多少。 183 | 184 | 这里有一篇博客文章,是讲程序结构的,说的比我详细些,我的说明也参考了它。 185 | 186 | >**[我也玩PSP开发!(2)—— PSPSDK示例 源码分析][6]** 187 | 188 | 最后是ps2dev论坛,准确的说应该是论坛镜像,因为ps2dev已经不在了。这个镜像里面保存了论坛到2010年的所有帖子。我大概翻过一些,还是有些有意义的东西的。大家如果想深入开发的话,建议多翻翻这里的旧帖子。 189 | 190 | **[http://lukasz.dk/mirror/forums.ps2dev.org][7]** 191 | 192 | 其实在谷歌里还能搜索到其它的PSP教程,不过质量参差不齐。这里就不再多推荐了。 193 | 194 | ##**关于示例程序** 195 | 196 | 虽然没有好的教程可供学习,但是官方的示例程序还是有的。在minpspw中有很多示例程序可供参考,种类繁多。从usb、红外(这个2000系列之后没有了)、MP3播放,到wifi,adhoc等网络相关的示例程序都有。 197 | 198 | 但问题是这些示例程序不少已经不能使用了。因为它们大部分都是在06-08年间写的,都是1.50固件时代的东西。不少程序在最新的6.60版本固件上基本上没法运行,甚至在M33的固件上都不能。 199 | 200 | 我一共尝试过三个示例,一个是按键检测示例(就是在上篇教程里使用的那个),一个是MP3播放,还有一个就是wlan_scan。这三个程序,第一个可以正常运行,第二个如果MP3文件的ID3信息中不包含中文,则可以运行。至于第三个程序,则完全运行不了,至于原因,有两个可能,一个就是因为它是1.50固件时代的产物,已经无法在新版本固件上使用了;还有一种可就是,我对程序的理解有问题。例程所需的一些文件(比如说PRX)没有提供。我在上面说的那个论坛镜像上找到了两篇关于网络编程的讨论,但是看不大懂。这里我把链接给大家,看博客的人肯定比有我知识经验丰富的,或许可以明白问题究竟出在哪里=。= 201 | 202 | >**[wlan "simple" sample for 3.xx (simple_prx)][8]** 203 | > 204 | >**[Wi-Fi in User Mode][9]** 205 | 206 | ##**总结** 207 | 208 | 至此,整个PSP开发简明教程就完结了。 209 | 210 | 我写这个也不是想说,PSP其实还大有可为。虽然PSP的功能很强大,但是个人开发十分的困难,而且没有官方的支持(我真的很佩服当年搞PSP破解和自制软件开发的人)。 211 | 212 | 加上现在有了手机这种比PSP适用范围更广,更便宜,而且开发还简单的东西,PSP实际上已经可以入住博物馆了…… 213 | 214 | 所以我只是想让大家多了解下它,毕竟PSP的破解很有代表性,研究它或许对我们以后从事类似的工作有一定的帮助。 215 | 216 | **本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。** 217 | 218 | >Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) 219 | 220 | 221 | 222 | 223 | [1]:./image/01.jpg 224 | [2]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%883%EF%BC%89/image/02.jpg 225 | [3]:https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/PSP%E5%BC%80%E5%8F%91%E7%AE%80%E6%98%8E%E6%95%99%E7%A8%8B%EF%BC%883%EF%BC%89/image/03.jpg 226 | [4]:http://en.wikibooks.org/wiki/PSP_Programming 227 | [5]:http://www.linuxgraphics.cn/psp/index.html 228 | [6]:http://blog.csdn.net/soulxu/article/details/2053793 229 | [7]:http://lukasz.dk/mirror/forums.ps2dev.org 230 | [8]:http://lukasz.dk/mirror/forums.ps2dev.org/viewtopica9f5.html?t=10372 231 | [9]:http://lukasz.dk/mirror/forums.ps2dev.org/viewtopic55eb.html?t=7032 -------------------------------------------------------------------------------- /PSP开发简明教程(3)/image/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(3)/image/01.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(3)/image/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(3)/image/02.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(3)/image/03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(3)/image/03.jpg -------------------------------------------------------------------------------- /PSP开发简明教程(3)/src/Hello World/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(3)/src/Hello World/Makefile -------------------------------------------------------------------------------- /PSP开发简明教程(3)/src/Hello World/main.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/PSP开发简明教程(3)/src/Hello World/main.c -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | OSChina_Blog 2 | ============ 3 | 4 | 这里保存的是个人在开源中国博客上面写的博客文档。 5 | 6 | 每个文件夹是一篇文章,其内部有文章中用到的图片,源代码和博客原文(md格式)。 7 | 8 | Template文件夹是模板。 9 | -------------------------------------------------------------------------------- /Template/README.md: -------------------------------------------------------------------------------- 1 | #标题1 2 | 3 | ##**标题2** 4 | 5 | **本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。** 6 | 7 | >Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) 8 | 9 | ![在此输入图片描述][1] 10 | [在此输入链接描述][2] 11 | 12 | 13 | 14 | 15 | [1]: https://raw.githubusercontent.com/flymaxty/OSChina_Blog/master/Template/image/01.jpg 16 | [2]: http://www.baidu.com -------------------------------------------------------------------------------- /Template/image/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flymaxty/MyBlog/561a3b26aae04ddad61b7e7aeac7474261970a12/Template/image/01.jpg -------------------------------------------------------------------------------- /如何使用C++读取配置文件(ini)/README.md: -------------------------------------------------------------------------------- 1 | #如何使用C++读取配置文件(ini) 2 | 3 | ##**ini文件简介** 4 | 5 | ini是我们常见到的配置文件格式之一。 6 | 7 | >ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 8 | 9 | >INI是英文“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 10 | > 11 | >[百度百科](http://baike.baidu.com/view/1296365.htm) 12 | 13 | 通过它,可以将经常需要改变的参数保存起来(而且还可读),使程序更加的灵活。 14 | 15 | 这里有一个ini文件的示例。 16 | 17 | [School] 18 | ip = 10.15.40.123 19 | mask = 255.255.255.0 20 | gateway = 10.15.40.1 21 | dns = 211.82.96.1 22 | 23 | [Match] 24 | ip = 172.17.29.120 25 | mask = 255.255.255.0 26 | gateway = 172.17.29.1 27 | dns = 0.0.0.0 28 | 29 | 30 | 文件中保存的是不同场合下的IP设置参数。 31 | 32 | 在此之前,我曾介绍过如何用Python3读取ini配置,下面我将说明如何使用C++进行配置文件的生成和读取。 33 | 34 | ##**C++读取方法** 35 | 36 | 首先,C++读取ini配置需要用到`Windows.h`头文件。 37 | 38 | #include "Windows.h" 39 | 40 | 之后我们需要给出配置文件的路径。 41 | 42 | //配置文件的路径 43 | LPTSTR lpPath = new char[MAX_PATH]; 44 | strcpy(lpPath, ".\\IpConfig.ini"); 45 | 46 | 接下来,我们可以使用`WritePrivateProfileString()`向配置文件中添加内容。 47 | 48 | WritePrivateProfileString("Hotel", "IP", "10.15.40.123", lpPath); 49 | WritePrivateProfileString("Hotel", "Mask", "255.255.255.0", lpPath); 50 | WritePrivateProfileString("Hotel", "Gateway", "10.15.40.1", lpPath); 51 | WritePrivateProfileString("Hotel", "DNS", "211.82.96.1", lpPath); 52 | 53 | 与Python相比,C++的写入工作在调用`WritePrivateProfileString()`时已经完成,所以不需要额外的代码。 54 | 55 | 以上就是写入配置文件的过程。 56 | 57 | 接下来我们使用`GetPrivateProfileString()`来读取刚才写入配置文件中的参数。 58 | 59 | LPTSTR Ip=new char[16]; 60 | LPTSTR Mask=new char[16]; 61 | LPTSTR Gateway=new char[16]; 62 | LPTSTR DNS=new char[16]; 63 | 64 | GetPrivateProfileString("Match","Ip","NULL",Ip,100,lpPath); 65 | GetPrivateProfileString("Match","Mask","NULL",Mask,100,lpPath); 66 | GetPrivateProfileString("Match","Gateway","NULL",Gateway,100,lpPath); 67 | GetPrivateProfileString("Match","DNS","NULL",DNS,100,lpPath); 68 | 69 | cout< 83 | 84 | using namespace std; 85 | 86 | int main() 87 | { 88 | LPTSTR lpPath = new char[MAX_PATH]; 89 | 90 | strcpy(lpPath, ".\\IpConfig.ini"); 91 | 92 | WritePrivateProfileString("Hotel", "IP", "10.15.40.123", lpPath); 93 | WritePrivateProfileString("Hotel", "Mask", "255.255.255.0", lpPath); 94 | WritePrivateProfileString("Hotel", "Gateway", "10.15.40.1", lpPath); 95 | WritePrivateProfileString("Hotel", "DNS", "211.82.96.1", lpPath); 96 | 97 | WritePrivateProfileString("Match", "IP", "172.17.29.120", lpPath); 98 | WritePrivateProfileString("Match", "Mask", "255.255.255.0", lpPath); 99 | WritePrivateProfileString("Match", "Gateway", "172.17.29.1", lpPath); 100 | WritePrivateProfileString("Match", "DNS", "0.0.0.0", lpPath); 101 | 102 | 103 | LPTSTR Ip=new char[16]; 104 | LPTSTR Mask=new char[16]; 105 | LPTSTR Gateway=new char[16]; 106 | LPTSTR DNS=new char[16]; 107 | 108 | GetPrivateProfileString("Match","Ip","NULL",Ip,100,lpPath); 109 | GetPrivateProfileString("Match","Mask","NULL",Mask,100,lpPath); 110 | GetPrivateProfileString("Match","Gateway","NULL",Gateway,100,lpPath); 111 | GetPrivateProfileString("Match","DNS","NULL",DNS,100,lpPath); 112 | 113 | cout<Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) -------------------------------------------------------------------------------- /如何使用C++读取配置文件(ini)/src/IpConfig.ini: -------------------------------------------------------------------------------- 1 | [School] 2 | ip = 10.15.40.123 3 | mask = 255.255.255.0 4 | gateway = 10.15.40.1 5 | dns = 211.82.96.1 6 | 7 | [Match] 8 | ip = 172.17.29.120 9 | mask = 255.255.255.0 10 | gateway = 172.17.29.1 11 | dns = 0.0.0.0 -------------------------------------------------------------------------------- /如何使用C++读取配置文件(ini)/src/src.cpp: -------------------------------------------------------------------------------- 1 | #include "iostream.h" 2 | #include "Windows.h" 3 | #include 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | LPTSTR lpPath = new char[MAX_PATH]; 10 | 11 | strcpy(lpPath, ".\\IpConfig.ini"); 12 | 13 | WritePrivateProfileString("Hotel", "IP", "10.15.40.123", lpPath); 14 | WritePrivateProfileString("Hotel", "Mask", "255.255.255.0", lpPath); 15 | WritePrivateProfileString("Hotel", "Gateway", "10.15.40.1", lpPath); 16 | WritePrivateProfileString("Hotel", "DNS", "211.82.96.1", lpPath); 17 | 18 | WritePrivateProfileString("Match", "IP", "172.17.29.120", lpPath); 19 | WritePrivateProfileString("Match", "Mask", "255.255.255.0", lpPath); 20 | WritePrivateProfileString("Match", "Gateway", "172.17.29.1", lpPath); 21 | WritePrivateProfileString("Match", "DNS", "0.0.0.0", lpPath); 22 | 23 | 24 | LPTSTR Ip=new char[16]; 25 | LPTSTR Mask=new char[16]; 26 | LPTSTR Gateway=new char[16]; 27 | LPTSTR DNS=new char[16]; 28 | 29 | GetPrivateProfileString("Match","Ip","NULL",Ip,100,lpPath); 30 | GetPrivateProfileString("Match","Mask","NULL",Mask,100,lpPath); 31 | GetPrivateProfileString("Match","Gateway","NULL",Gateway,100,lpPath); 32 | GetPrivateProfileString("Match","DNS","NULL",DNS,100,lpPath); 33 | 34 | cout<ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 10 | 11 | >INI是英文“初始化(Initial)”的缩写。正如该术语所表示的,INI文件被用来对操作系统或特定程序初始化或进行参数设置。 12 | > 13 | >[百度百科](http://baike.baidu.com/view/1296365.htm) 14 | 15 | 通过它,可以将经常需要改变的参数保存起来(而且还可读),使程序更加的灵活。 16 | 17 | 我先给出一个ini文件的示例。 18 | 19 | ```ini 20 | [School] 21 | ip = 10.15.40.123 22 | mask = 255.255.255.0 23 | gateway = 10.15.40.1 24 | dns = 211.82.96.1 25 | 26 | [Match] 27 | ip = 172.17.29.120 28 | mask = 255.255.255.0 29 | gateway = 172.17.29.1 30 | dns = 0.0.0.0 31 | ``` 32 | 33 | 这个配置文件中保存的是不同场合下的IP设置参数。 34 | 35 | 下面将以生成和读取这个配置文件为例,进行讲解。 36 | 37 | ##**Python(v3)读取方法** 38 | 39 | 首先,Python读取ini配置需要用到`ConfigParser`包,所以要先加载它。 40 | 41 | ```python 42 | import configparser 43 | ``` 44 | 45 | 之后我们需要载入配置文件。 46 | 47 | ```python 48 | config=configparser.ConfigParser() 49 | 50 | #IpConfig.ini可以是一个不存在的文件,意味着准备新建配置文件。 51 | config.read("IpConfig.ini") 52 | ``` 53 | 54 | 接下来,我们可以使用`configparser.add_section()`向配置文件中添加一个`Section`。 55 | 56 | ```python 57 | #添加节School 58 | config.add_section("School") 59 | ``` 60 | 61 | *注意:如果文件中已经存在相应的项目,则不能再增加同名的节。* 62 | 63 | 然后可以使用`configparser.set()`在节`School`中增加新的**参数**。 64 | 65 | ```python 66 | #添加新的IP地址参数 67 | config.set("School","IP","192.168.1.120") 68 | config.set("School","Mask","255.255.255.0") 69 | config.set("School","Gateway","192.168.1.1") 70 | config.set("School","DNS","211.82.96.1") 71 | ``` 72 | 73 | 你可以以同样的方式增加其它几项。 74 | 75 | ```python 76 | #由于ini文件中可能有同名项,所以做了异常处理 77 | try: 78 | config.add_section("Match") 79 | config.set("Match","IP","172.17.29.120") 80 | config.set("Match","Mask","255.255.255.0") 81 | config.set("Match","Gateway","172.17.29.1") 82 | config.set("Match","DNS","0.0.0.0") 83 | except configparser.DuplicateSectionError: 84 | print("Section 'Match' already exists") 85 | ``` 86 | 87 | 增加完所有需要的项目后,要记得使用`configparser.write()`进行写入操作。 88 | 89 | ```python 90 | config.write(open("IpConfig.ini", "w")) 91 | ``` 92 | 以上就是写入配置文件的过程。 93 | 94 | 接下来我们使用`configparser.get()`读取刚才写入配置文件中的参数。读取之前要记得读取ini文件。 95 | 96 | ```python 97 | ip=config.get("School","IP") 98 | mask=config.get("School","mask") 99 | gateway=config.get("School","Gateway") 100 | dns=config.get("School","DNS") 101 | 102 | print((ip,mask+"\n"+gateway,dns)) 103 | ``` 104 | ##**完整示例** 105 | 106 | 下面是一个完整的示例程序,他将生成一个`IpConfig.ini`的配置文件,再读取文件中的数据,输出到屏幕上。 107 | 108 | ```python 109 | # -*- coding: utf-8 -*- 110 | 111 | import configparser 112 | 113 | #读取配置文件 114 | config=configparser.ConfigParser() 115 | config.read("IpConfig.ini") 116 | 117 | #写入宿舍配置文件 118 | try: 119 | config.add_section("School") 120 | config.set("School","IP","10.15.40.123") 121 | config.set("School","Mask","255.255.255.0") 122 | config.set("School","Gateway","10.15.40.1") 123 | config.set("School","DNS","211.82.96.1") 124 | except configparser.DuplicateSectionError: 125 | print("Section 'School' already exists") 126 | 127 | #写入比赛配置文件 128 | try: 129 | config.add_section("Match") 130 | config.set("Match","IP","172.17.29.120") 131 | config.set("Match","Mask","255.255.255.0") 132 | config.set("Match","Gateway","172.17.29.1") 133 | config.set("Match","DNS","0.0.0.0") 134 | except configparser.DuplicateSectionError: 135 | print("Section 'Match' already exists") 136 | 137 | #写入配置文件 138 | config.write(open("IpConfig.ini", "w")) 139 | 140 | ip=config.get("School","IP") 141 | mask=config.get("School","mask") 142 | gateway=config.get("School","Gateway") 143 | dns=config.get("School","DNS") 144 | 145 | print((ip,mask+"\n"+gateway,dns)) 146 | ``` 147 | 148 | ##**总结** 149 | 150 | Python读取ini文件还是十分简单的,这里我给出的只是一些简单的使用方法,如果想用更高级的功能,比如和注释有关的功能。可以参考Pyhton官方文档 151 | 152 | >Python3官方参考文档 153 | > 154 | >[14.2. configparser — Configuration file parser](https://docs.python.org/3/library/configparser.html) 155 | 156 | **本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。** 157 | 158 | >Github地址:[https://github.com/flymaxty/OSChina_Blog](https://github.com/flymaxty/OSChina_Blog) -------------------------------------------------------------------------------- /如何使用Python3读取配置文件(ini)/src/IpConfig.ini: -------------------------------------------------------------------------------- 1 | [School] 2 | ip = 10.15.40.123 3 | mask = 255.255.255.0 4 | gateway = 10.15.40.1 5 | dns = 211.82.96.1 6 | 7 | [Match] 8 | ip = 172.17.29.120 9 | mask = 255.255.255.0 10 | gateway = 172.17.29.1 11 | dns = 0.0.0.0 -------------------------------------------------------------------------------- /如何使用Python3读取配置文件(ini)/src/src.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import configparser 4 | 5 | #读取配置文件 6 | config=configparser.ConfigParser() 7 | config.read("IpConfig.ini") 8 | 9 | #写入宿舍配置文件 10 | try: 11 | config.add_section("School") 12 | config.set("School","IP","10.15.40.123") 13 | config.set("School","Mask","255.255.255.0") 14 | config.set("School","Gateway","10.15.40.1") 15 | config.set("School","DNS","211.82.96.1") 16 | except configparser.DuplicateSectionError: 17 | print("Section 'School' already exists") 18 | 19 | #写入比赛配置文件 20 | try: 21 | config.add_section("Match") 22 | config.set("Match","IP","172.17.29.120") 23 | config.set("Match","Mask","255.255.255.0") 24 | config.set("Match","Gateway","172.17.29.1") 25 | config.set("Match","DNS","0.0.0.0") 26 | except configparser.DuplicateSectionError: 27 | print("Section 'Match' already exists") 28 | 29 | #写入配置文件 30 | config.write(open("IpConfig.ini", "w")) 31 | 32 | ip=config.get("School","IP") 33 | mask=config.get("School","mask") 34 | gateway=config.get("School","Gateway") 35 | dns=config.get("School","DNS") 36 | 37 | print((ip,mask+"\n"+gateway,dns)) --------------------------------------------------------------------------------