搜索

tag 标签: windows

相关帖子

版块 作者 回复/查看 最后发表
Windows赢得桌面,但Linux占据了世界! 信息发布 奋斗之路123 2017-2-21 0 505 奋斗之路123 2017-2-21 09:48
Github搭建自己的blog attach_img 【其他嵌入式操作系统】 michael_llh 2017-2-25 14 3202 michael_llh 2017-3-3 20:40
【尴尬】Mac下Kinetis FRDM-KL02Z开发板OpenSDA固件更新 attach_img 【NXP Kinetis MCU】 shinykongcn 2017-3-4 1 1376 strong161 2017-3-5 12:50
透明屏应用领域——商城服装店 信息发布 qwe28312041 2017-3-13 0 505 qwe28312041 2017-3-13 14:15
狠心换最好的thinkpad笔记本做开发了 attach_img 聊聊、笑笑、闹闹 stm32f103vct6 2017-3-18 19 2807 chengxl 2017-5-26 15:39
网管软件IT运维管理必懂的十大名词通俗解释 attach_img 信息发布 leeconstance 2017-3-19 0 1515 leeconstance 2017-3-19 16:21
史上最简单在Web网页上画动态网络拓扑图的软件 attach_img 信息发布 leeconstance 2017-3-19 0 1515 leeconstance 2017-3-19 16:30
宾馆用门锁 attach_img 信息发布 yitonggf 2017-3-21 0 606 yitonggf 2017-3-21 10:30
桌面式DAQ解决方案:PicoDigitizer 信息发布 hirainlily 2017-3-31 0 707 hirainlily 2017-3-31 11:15
Tektronix泰克DPO5204B混合信号示波器 attach_img 信息发布 xining123 2017-4-5 0 606 xining123 2017-4-5 11:23
EEWORLD博客支持Windows Live Writer离线写博客啦 attach_img 信息发布 Timson 2017-4-13 9 847 damiaa 2017-4-13 16:20
你眼中的Mac、Windows和Linux是这样的吗? attach_img 【其他嵌入式操作系统】 error_echo 2017-4-24 4 1955 辛昕 2017-4-30 15:47
【转帖】嵌入式开发学习步骤-4412开发板学习指引 嵌入式系统编程 mucheni 2017-4-28 2 808 mingyue3 2017-10-26 10:41
micropython 专用IDE uPyCraft发布 【MicroPython开源版块】 Chocho 2017-6-7 13 10314 Nan-a 2018-5-2 10:03
uPyCraft ----- micropython 专用IDE 【MicroPython开源版块】 秦皇岛岛主 2017-6-19 0 2929 秦皇岛岛主 2017-6-19 18:07
秋叶系统 Ghost XP SP3 装机版v2017.06 attach_img 信息发布 xiao810123 2017-6-20 0 707 xiao810123 2017-6-20 11:07
转帖:一步一步使用uPyCraft学习MicroPython之UDP点亮LED attachment 【MicroPython开源版块】 秦皇岛岛主 2017-6-22 1 5162 windou 2018-6-5 09:56
如何使用NI VeriStand 在Windows操作系统中配置和部署自定义设备 attachment 【测试/测量】 Stone_Mei 2018-1-22 0 404 Stone_Mei 2018-1-22 13:52
使用NI VeriStand 在Windows操作系统中配置和部署自定义设备时的常见问题说明 attachment 【测试/测量】 Stone_Mei 2018-1-22 2 1052 star_66666 2018-1-24 10:43

相关日志

分享 Linux学习日志(17)- 关于Makefile
懒猫爱飞 2017-3-30 17:56
Linux学习日志(17)- 关于Makefile
Makefile 是啥东东,如果在 windows 下开发单片机或其它程序用 IDE 用习惯了,可能对这个 makefile 是一头雾水。 Makefile 是一个文件,它定义了定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,在 windows 下 IDE 开发, IDE 中已隐藏了包含了 makefile 文件,但在 linux 下,我的地盘我做主,编写 makefile 是 linux 世界编程不可回避的话题。 Make 是 20 世纪 70 年代发明的编程项目编译的辅助工具, make 的编译思路很简单,如果源程序发生了改变,并需要重新构建程序或才其它输出文件时, make 会先查看时间截哪些改变了,并按照要求重新构建这些文件,而不会浪费时间重新构建其它文件。 GNU make 是 make 工具的 GNU 版本(关于 GNU 是什么,我觉得学习 linux 人都应该知道 ^_^ ),它已成为工业标准,它属于自由软件,目前非常流行。 小知识 ? GNU 计划,又称革奴计划,是由 Richard Stallman 在 1983 年 9 月 27 日公开发起的。它的目标是创建一套完全自由的操作系统。 Richard Stallman 最早是在 net.unix-wizards 新闻组上公布该消息,并附带《 GNU 宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证 GNU 软件可以自由地“使用、复制、修改和发布”,所有 GNU 软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款, GNU 通用公共许可证( GNU General Public License , GPL )。即“反版权”(或称 Copyleft )概念。 -- 来源 . 百度百科 在终端输入 make 命令就会调用 make 工具, make 会在当前目录按照文件名顺序寻找 makefile 文件,依次按照: GNUmakefile,makefile,Makefile 查找,如果找到其中的任何一个,就读取并按照其中的规则执行,否则报错。 小提示 ! 在网上流传一份《跟我一起写 Makefile 》,作者是:陈皓,很适合新新学习,下面这个网址也可以看看: http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D 打铁还要自身硬,想深入学习 linux 还是要学好基本功,好吧,现在跟着一个小程序,总结一下 makefile 。 1 .目标 写一个 hello.c, 使程序输出 hello,Ubuntu!, 创建 Makefile 文件,输入以下内容并保存。 all: gcc hello.c 注意 gcc hello.c 前面是 tab 键空出的缩进,不能用空格键代替。 然后执行命令: make ,生成以下文件: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 9 -rwxrwxrwx 1 root root 7344 3 月 30 12:47 a.out -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 18 3 月 30 12:47 Makefile 执行命令: ./a.out, 输出以下内容: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ./a.out Hello ubuntu! Makefile 的基本语法格式是: target : prerequisites command ? target 是编译目标,在编译的时候输入 make target 就可以执行 target 规则。 Target 既可以是上档文件,也可以是可执行文件,还可以是一个标签,如前面写的 Makefile 中的 all 。 ? prerequisites 是依赖关系文件,即生成 target 所需要的文件或目标。 ? command 是生成 target 所需要的命令 makefile 会根据时间戳来决定哪些文件需要重新编译,对于为个规则来说明一下,如果 prerequisites 中如果有一个以上的文件比 target 文件更新的话,则 command 所定义的命令就会被执行。 再回头看一下 hello.c 的 Makefile 文件内容: all: gcc hello.c 整个 Makefile 只定义了一个目标 all, 也没有任何依赖关系, all 目标对应的命令为 gcc hello.c, 这个目标 all 是一个标签,也是第一个目标,将第一个目标设置为 all 是一个习惯,当然可以改为任何一个标签。终端输入 make ,不指定任何编译目标,默认执行第一个标签的规则,也就是说输入 make 和 make all 实际上是赞同的。 2 .伪目标 假如一个目标名与当前目录下的某一个文件名相同,那么 make 的时候会出现什么情况?好吧,实践出真知,操作一下应知道了 ^_^ mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ cp a.out all mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 16 -rwxrwxrwx 1 root root 7344 3 月 30 13:09 all -rwxrwxrwx 1 root root 7344 3 月 30 12:47 a.out -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 18 3 月 30 12:47 Makefile mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ make make: 'all' is up to date. mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ 把刚才生成的 a.out, 复制一份,命名为 all, 然后再 make 。可以看到提示信息是“ all ”是最新的,根据 make 处理流程,“是最新的”意味着 all 目标对应的规则永远不会被执行,哪怕实际需要编译的文件已经修改过,也不会被重新编译。 如果程序在编写时 Makefile 的时候,一不小心出现这种问题,那么对程序的编译是致命的,针对这种情况, Makefile 有一个解决办法,引入了一个新的目标 — 伪目标。伪目标是一个标签,这个目标只执行命令,不创建目标,避免目标与工作目录下的实际文件名冲突。 伪目标的写法如下所示: .PHONY: 标签 对于前面这个例子,将 Makefile 文件稍微修改一下,在末尾增加一行: .PHONY:all 代码如下所示: all: gcc hello.c .PHONY:all 将 all 设置为伪目标后,尽管当前目录下有同名为 all 文件,但在终端输入 make 命令, all 的命令会被正确执行。 在实际应用中,通常会有一个 clean 目标,这个目标几乎都会被设置为伪目标,用于清除编译产生的中间文件和可执行文件。在进行源文码打包或才发布的时候,先通过 make clean 命令清除,可以得到干净的代码文件。 继续在 hello.c 的 Makefile 文件中增加一个伪目标 clean, 如下所示: .PHONY:clean -rm –v a.out( 注意前面用是的 tab 做的缩进 ) clean 对应的命令是 -rm –v a.out, 就是一个普通的删除命令,加 -v 参数是显示删除列表。完整的 Makefile 如下所示: .PHONY:all clean all: gcc hello.c clean: -rm -v a.out 如果一个 Makefile 文件有多个伪目标,则可以分多行单独声明,也可以将多个目标一并声明,各伪目标之间用空格隔开。 clean 伪目标的命令为 -rm ,如果在 rm 命令前加“ - ”,含义是如果这条命令执行失败, make 将忽略这个错误,继续往下执行;如果不加“ - ”,则 make 停止。一个工程连续两次 make clean 后,那么第二次 clean 的时候,由于相关文件已经不存在,在加了“ - ”的情况下, clean 会提示出错,但被忽略,而不加“ - ”则不忽略。“ - ”的含义不仅仅对 rm 命令有效,对 Makefile 中的所有命令都有效,安等于 make –i 命令。 3 .自定义变量 make 支持在 Makefile 文件中定义变量,合理使用变量,能增加 Makefile 文件的通用性,并简化 Makefile 文件编写。一般的 Makefile 文件编写中,通常会为源文件、可执行文件以及编译参数等分别定义一个变量,并予以赋值,在编译规则中直接引用这些变量。 变量的定义和赋值方法通常如下所示: VAR = value 在用到变量的地方,通过符号“ $ ”和“()”一起来完成变量引用,如 $(VAR) 。 对于 hello.c 的 Makefile 文件,如果定义源文件 SRC 和可执行文件 EXE 两个变量,对 Makefile 文件进行如下修改: # makefile for hello.c EXE = hello SRC = hello.c .PHONY:clean all all: gcc -o $(EXE) $(SRC) clean: -rm -v $(EXE) 使用了自定义变量后,只需要将 EXE 和 SRC 两个变量进行修改,即可将这个 Makefile 文件用于其它文件编译,增强了通用性与可移植性。 如果变量的赋值有多个值,可直接在等号 (=) 后面列出,如下所示: SRC = hello.c test.c tmp.c 赋值除了直接用 = 号外,可以使用追加符号“ += ”进行追加,例如: SRC = hello.c SRC += test.c tmp.c SRC += hello2.c 如果赋值很长可以用换行符号“ \ ”进行换行处理,例如: SRC = hello.c \ Test.c \ Temp.c 可以在 Makefile 中加注释,对文件或者其中一些变量、规则进行说明,有助于文件的阅读与理解,注释行以“ # ”号开始并顶格。 4 . Makefile 变量 Make 本身有一些特殊变量可以在 Makefile 中使用,能进一步简化 makefile 文件的编写。这些特殊变量包括环境变量、自动变量和预定义变量。 环境变量 就是系统的环境。 Makefile 中基本可以直接引用几乎所有的环境变量,比如代表当前登录用户的 USER ,系统外部命令搜索路径 PATH 等,这些变量可以直接以 $(VAR) 的方式引用。 但是 make 对环境变量的处理有一个例外,就是 shell,make 在默认情况下会指定 Shell 为“ /bin/sh ”,而不是使用用户指定的其它用于交互的 shell 。 另外还有一个可以直接引用但需要小心使用的环境变量 -PWD , PWD 的值是 make 开始运行时的路径。但是,它可能与 make 当前正在解释执行的 Makefile 文件所在的路径不一致,不能认为它一定就是 Makefile 所在的路径。 如果在 Makefile 中定义了一个与系统环境变量同名的自定义变量,则自定义会覆盖系统变量的值,这点一定要注意。 自动变量 不用定义,且会随着上下文的不同而发生改变。 Make 的自动变量都是一些比较难记信的符号,都以“ $ ”符号开头。使用了自动变量的 Makefile 文件读起来会显得抽象生涩一些。常用的 make 自动变量如下所示: ? $@ 规则的目标文件名 ? $ 规则的目标的第一个依赖文件名 ? $^ 规则的目标所对应的所有依赖文件的列表,以空格分隔 ? $? 规则的目标对应的依赖文件新于目标文件的文件列表,发空隔分开 ? $(@D) 规则的目标文件的目录部分(如果目标在子目录中) ? $(@F) 规则的目标文件的文件各部分 ( 如果目标在子目录中 ) 在前面例子的基础上增加一个源文件 hello1.c, 更改一下 Makefile 文件,添加一下自动变量, Makefile 文件修改如下所示: 1 # makefile for hello.c 2 EXE = main 3 OBJ = hello.o hello1.o 4 SRC = hello.c hello1.c 5 6 EXE:$(OBJ) 7 gcc -o $(EXE) $^ 8 9 .PHONY:clean 10 11 clean: 12 -rm -v $(EXE) 修改后的 Makefile 增加了以下几点内容: F 增加了目标和依赖关系 F 编译多个 C 文件,多个文件用空格隔开 F 使用了自动变量 第 6 行 EXE:$(OBJ) ,是说可执行文件依赖于目标文件,目标文件有更新,因此才会重新编译生成可执行文件。编译命令也用了自动变量 $^, 在这里对应所有生成的目标文件。可执行文件名不一定要和源文件相同或者有关系,可以任意取,在这个例子中将可执行文件名设置为 main 。这个 Makefile 的 make 结果如下所示: mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ make gcc -o main hello.o hello1.o mark@ubuntu:/mnt/hgfs/0_VMwareShare/c_learn/lesson001$ ls -l 总用量 20 -rwxrwxrwx 1 root root 7344 3 月 30 14:08 hello -rwxrwxrwx 1 root root 90 3 月 30 14:43 hello1.c -rwxrwxrwx 1 root root 1052 3 月 30 14:43 hello1.o -rwxrwxrwx 1 root root 82 3 月 30 12:46 hello.c -rwxrwxrwx 1 root root 1072 3 月 30 14:43 hello.o -rwxrwxrwx 1 root root 7396 3 月 30 15:33 main -rwxrwxrwx 1 root root 147 3 月 30 15:33 Makefile 自动变量 用于定义程序名称及传递给这些程序的参数和标志位等。常见的预定义变量和描述如下所示: ? AR 归档维护程序,默认值为 ar ? AS 汇编程序,默认值为 as ? CC C 语言编译程序,默认值为 cc ? CPP C 语言预处理程序,默认为 cpp ? RM 文件删除程序,默认值为 rm –f ? ARFLAGS 传递给 AR 程序的标志,默认值为 rv ? ASFLAGS 传递给 AS 程序的标志,默认值无 ? CFLAGS 传递给 CC 程序的标志,默认值无 ? CPPFLAGS 传递给 CPP 程序的标志,默认值无 ? LDFLAGS 传递给链接程序的标志,默认值无 利用自动变量,再次修改 Makefile 文件,如下所示: # makefile for hello.c EXE = main OBJ = hello.o hello1.o SRC = hello.c hello1.c CC = gcc CFLAGS = -o LDFLAGS = -L . -lFOO EXE:$(OBJ) # gcc -o $(EXE) $^ $(CC) $(CFLAGS) $(EXE) $^ .PHONY:clean clean: # -rm -v $(EXE) -$(RM) $(OBJ) $(EXE) 再次编译一下,结果如下所示: 由结果可以看出,能过预定义变量传递的参数全部生效了 ^_^ 5 .隐式规则和显式规则 前面修改的 Makefile 文件中 EXE:$(OBJ) , EXE 依赖于 OBJ ,但是整个 Makefile 只定义了 EXE 的生成规则,并没有给出 OBJ 的生成规则,但为什么编译却没有出错呢? 这是因为 make 有一些既定的目标生成规则,称之为隐式规则,例如对于一个 file.o 的文件, make 会优先寻找同名的 file.c 文件,并按照 gcc –c file.c –o file.o 的编译规则生成 file.o 文件。对于不同的编程语言,有不同的隐式规则,所以一般来说,不推荐用隐式规则。 显式规则是用户自定义的规则,在使用隐式规则有隐患的情况下,更应该使用显式规则,明确指定生成规则,例如前面提到的隐式规则,用显式规则来定义如下所示: OBJ:$(SRC) $(CC) –o $(OBJ) –c $^ 如果不用自定义变量,还可以这么写,为称为模式规则: %.o:%.c $(CC) –o $(OBJ) –c $@ 到现在为止,已经得到一个基本比较完整的 Makefile 文件。只要修改文件的头三个变量,就能用于其它工程编译,这也可以说是一个基本 Linux 应用程序 Makefile 文件的框架。 6 . make 命令 一个工程编写了 Makefile 文件后,通常只需要在当前目录下输入 make 命令即可完成编译。然而实际上 make 命令本身可以接受参数的,完整的用法如下所示: make 选项可以指定 make 的工作行为,宏定义可以指定执行 Makefile 的宏值,目标则是 Makefile 中的目标,包含伪目标,这些参数是可选的,各参数之间用空格隔开。 Make 常见参数如下所示: 选项 说明 -C dir 指定 make 开始运行之后的工作目录为 dir ,默认为当前目录 -d 打印除一般处理信息之外的调试信息,例如进行比较的文件的时间,尝试的规则等。 -e 不允许在 makefile 中对环境变量赋新值,即丢弃与环境变量同名的自定义变量 -f file 使用指定文件 file 为 makefile 文件 -i 忽略 makefile 运行时命令产生的错误,不退出 make -I dir 指定 makefile 运行时的包含目录,多个包含目录用空格分隔 -S 执行 makefile 时遇到错误即退出,这是 make 的默认工作方式,无需指定 -v 打印 make 版本号 Makefile 编写上是一个复杂的工作, Makefile 还有很多复杂和灵活的语法,这里不多总结了,以后用到了再记录吧。如果有空想深入了解,可以参看 GNU 的 makefile Manual^_^ 最后,再吼一下俺的口号: 每天进步一点点,开心多一点 ^_^ --2017年3月30日 17:56:27
个人分类: linux学习日志|1041 次阅读|0 个评论
分享 Unicode相关话题(windows)
lcofjp 2016-1-8 18:21
Unicode Functions Unicode Structures Unicode Macros
个人分类: c/c++|311 次阅读|0 个评论
分享 用C++遍历windows目录中的文件
lcofjp 2016-1-7 18:35
#include io.h #include string #include list #include cstring using namespace std; void dfsFolder(string folderPath, liststring lst) { _finddata_t FileInfo; string strfind = folderPath + "\\*"; long Handle = _findfirst(strfind.c_str(), FileInfo); if (Handle == -1L) { cerr "can not match the folder path" endl; exit(-1); } do { //判断是否有子目录 if (FileInfo.attrib _A_SUBDIR) { //这个语句很重要 if ((strcmp(FileInfo.name, ".") != 0) (strcmp(FileInfo.name, "..") != 0)) { string newPath = folderPath + "\\" + FileInfo.name; dfsFolder(newPath, lst); } } else { lst.push_back(folderPath + "\\" + FileInfo.name); } } while (_findnext(Handle, FileInfo) == 0); _findclose(Handle); }
个人分类: c/c++|547 次阅读|0 个评论
分享 嵌入式学习-第一步-linux和编译环境搭建
1135093386 2015-11-9 15:13
大四party,毕业工作,硬件方向,11月以后时间空挡期,学习 嵌入式 ,毕竟工资高。 买了ARM9SC2440,由于从未接触嵌入式,所以开始就很费劲,走弯路白折腾。 进入正题,拿回来板子,测试正常,win7的64位电脑,安装驱动,J-Link和串口工具安装没遇到啥大问题,安装USB device端口下载软件“dnw”时,光盘只提供xp的驱动,提供的win7的驱动不能用,于是百度找谷歌找,最后在一个嵌入式交流群里找到了win764位能用的驱动(链接:http://pan.baidu.com/s/1o6s1OSi 密码:cjhp),原理是用windows系统数字证书软件将dnw的驱动强制安装进去,只是这个驱动不被微软认可,因此按说明操作后电脑出于测试模式,并且不能退出测试模式,否则USB device设备又会被禁用。 下面安装Ubuntu系统了,因为要在里面完成编译,所以必须要安装,用VMware虚拟机在win7上进行安装,光盘里面提供的是Ubuntu9.10,版本较老了,因此我就下载了最新版本Ubuntu14.04,这里推荐用Ubuntu系统32位的,我第一次是用64位的,但是后面遇到了很多问题,主要是:后面要安装一些编译工具,而编译工具在网上有些是依赖于32位系统库的,而64位的系统这时要想安装工具,就要更新安装32位依赖库,我这样做了当时没问题,后面再安装其他的软件包时就出现问题了,软件包安装未完成,卸载时又卸载不掉,这时想把所有软件包卸载掉从新安装,可是软件已经都没办法卸载掉了,无奈之后将Ubuntu系统删掉(还好是在虚拟机上,不然就更折腾了),在官网下载Ubuntu14.04系统32位版本(http://www.ubuntu.org.cn/download/ubuntu-kylin-zh-CN),这是最新版系统,安装时拔掉网线,这个可以节省安装时间(因为这样可以避免在安装过程中的更新),安装好以后,开始安装需要的编译工具,安装工具时要插上网线,这样系统可以在需要资源时直接从网上服务器更新,服务器更新网址在系统/etc/apt/sources.list文件中,旧版本系统不推荐使用就是因为有些旧版本系统现在已经停止更新维护了(当你安装软件时有时需要在线更新依赖库,系统访问 /etc/apt/sources.list文件中对应的网址来下载,但是因为停止维护了,有些网址可能已经失效了,就可能造成安装失败 ),安装好以后,建议测试各个工具没问题后把系统备份拷贝一下,毕竟想想安装一次系统加上搭环境至少需要半天时间,这样以后系统出问题时可以直接取来用
个人分类: 嵌入式|600 次阅读|0 个评论
分享 HTTP错误 500.19 ---错误代码 0x80070032(成功解决)
bjwang 2015-4-8 14:20
系统:windows 2008 sp1 软件环境:IIS 7.0、.NetFrame 3.5 /4.5、ASP.NET、SQL Server 2008 -------------------故障描述----------------------------------------------------------------------- 错误摘要: HTTP错误500.19-InternalServerError 无法访问请求的页面,因为该页的相关配置数据无效。 详细错误信息: 模块 IISWebCore 通知 BeginRequest 处理程序 尚未确定 错误代码 0x80070032 配置错误 无法读取配置节“system.web.extensions”,因为它缺少节声明 配置文件\\?\C:\inetpub\wwwroot\web.config 请求的URLhttp://localhost:80/frist.aspx 物理路径 C:\inetpub\wwwroot\ 登录方法 尚未确定 登录用户 尚未确定 配置源: 678: !-- Do not edit these settings! -- 679: system.web.extension 680: scripting 链接和更多信息: 当读取Web服务器或Web应用程序的配置文件出现问题时,就会发生此错误。在某些情况下,事件日志会包含有关导致此错误的原因的更多信息。 -----------------------------------故障描述结束---------------------------- ----------------------------------故障截图----------------------------------- ----------------------------------截图结束----------------------------------- 按照网上说的一堆解决方法,安装了asp.net ajax,设置应用程序池等等,都无法解决问题。经过努力的搜索,终于找到了一个解决方法,以下内容是微软发的邮件: --------------------------------邮件内容------------------------------------- 重要信息 为方便起见,我们将您请求的修补程序放到了 HTTP 站点上。这样,您可以从此站点下载该修补程序,我们就不必向您发送电子邮件了。 警告 此修补程序尚未经过完全测试。因此请注意,在此电子邮件末尾有一个表,该表的“知识库文章编号”字段中列出了一篇或多篇 Microsoft 知识库文章,只有当系统或计算机遇到所列文章中描述的问题时,才应用此修补程序。如果不能确定某一具体的兼容性问题或安装问题是否与此修补程序相关,建议您等待下一个 Service Pack 发布,其中将包含此修补程序经过完全测试的版本。我们知道,确定任一兼容性问题或安装问题是否与修补程序相关都是很困难的。如果您希望确定此修补程序是否能够解决您的具体问题,或确定任一具体的兼容性问题或安装问题是否与此修补程序相关,客户支持服务部门的支持专家可为您提供帮助。有关如何联系支持部门的信息,请复制以下链接,然后将其粘贴到 Web 浏览器中: http://support.microsoft.com/contactus/ 有关其他支持选项,请复制以下链接,然后将其粘贴到 Web 浏览器中: http://support.microsoft.com/ 此修补程序的安装须知 ------------------------------ 如果确定要安装此修补程序,请注意下列事项: 要在生产环境中部署修补程序,必须先对该修补程序进行测试。 在安装修补程序之前,需要先备份将接收修补程序的系统或计算机。 其他修补程序信息 ----------------------------- 注意 为方便您下载,我们会将该修补程序的位置以超链接的形式发送给您。要连接到此修补程序位置,您可以从此电子邮件末尾的表中找到“位置”字段,单击其中的超链接,这样您的 Web 浏览器即可打开该位置。但是,电子邮件程序设置有时会禁用超链接。如果此电子邮件中的超链接已禁用,请复制“位置”字段中的超链接,然后将其粘贴到 Web 浏览器的地址栏中。请确保在 http:// 地址中包含与括号中内容完全相同的文本(无空格)。 程序包: ----------------------------------------------------------- ----------------------------------------------------------- 知识库文章编号:958854 语言:All (Global) 平台:x64 位置:( http://hotfixv4.microsoft.com/Windows%20Vista/sp2/Fix251798/6000/free/366832_intl_x64_zip.exe ) 注意 访问此修补程序位置时,请确保包含了“(”和“)”之间的所有文本。 -----------------------------邮件内容结束------------------------------------------- -----------------------------补充说明:32位补丁下载链接-------------------- http://hotfixv4.microsoft.com/Windows%20Vista/sp2/Fix251798/6000/free/366830_intl_i386_zip.exe -----------------------------补充说明结束------------------------------------------- 安装完补丁后,web访问正常。 转载自:http: // blog.163.com/wspjing@126/blog/static/11772053420131012112636284
个人分类: C++|52097 次阅读|0 个评论
分享 DialogFragment详解
huanghai381 2014-9-21 23:46
详解一: Android提供alert、prompt、pick-list,单选、多选,progress、time-picker和date-picker对话框,并提供自定义的dialog。在Android 3.0后,dialog基于fragment,并对之前版本提供兼容支持库,也就是说对于开发者而言,dialog是基于DialogFragment的,但此时需要在应用中加入相关的兼容库。 和Windows或者网页JS的Dialog不同,Android的dialog是异步的,而不是同步的。对于同步的dialog,显示dialog后,下一行代码会等到dialog结束,即下一行代码可以知道dialog的输入以及用户点击的button。而对于异步的dialog,dialog显示后,下一行代码继续执行,而不是等dialog消失,通过callback来处理dialog的事件。异步的dialog也意味着应用的代码也可以关闭dialog。 我们的小例子通过菜单触发分别触发告警框和自定义布局提示框,提示框中有三个button,其中一个Help按钮可以再触发一个帮助内容的对话框。 创建dialog fragment 对话框基于DialogFrame,告警框AlterDialogFrament类如下,如何通过newInstance()创建实例在Fragment的学习中已经学过,不再详述。newInstance()有两个参数,一是告警框的标题,一是告警框的内容。 public class AlterDialogFragment extends DialogFragment { /*【步骤1】:通过newInstance()创建实例,并返回,这里的处理和系统从save状态中re-create相同。 * 1、通过缺省构造函数创建对象 * 2、将传递的信息设置为fragment的参数 * 3、返回对象 * */ public static AlterDialogFragment newInstance(String title,String message){ AlterDialogFragment adf = new AlterDialogFragment(); Bundle bundle = new Bundle(); bundle.putString("alert-title", title); bundle.putString("alert-message", message); adf.setArguments(bundle); return adf; } ...... 略,见后文...... } 自定义布局提示框PromptDialogFragment同样是DialogFragment的继承。类似的,代码如下: public class PromptDialogFragment extends DialogFragment { public static PromptDialogFragment newInstance(String prompt){ PromptDialogFragment pdf = new PromptDialogFragment(); Bundle b = new Bundle(); b.putString("prompt-message", prompt); pdf.setArguments(b); return pdf; } ......略,见后文...... } Activity显示对话框 在MyActivity中,通过optionsMenu来分别触发告警框和提示框的显示,代码如下: public class MainActivity extends Activity{ //设置告警框、提示框和帮助框的dialog fragment的tag。 public final static String ALERT_DIALOG_TAG = "ALERT_DIALOG_TAG"; public final static String PROMPT_DIALOG_TAG = "PROMPT_DIALOG_TAG"; public final static String HELP_DIALOG_TAG = "HELP_DIALOG_TAG"; …... 略 : 设置UI和创建OptionsMenu ...... @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.alter_dialog: alterDialogTestCase(); break; case R.id.prompt_dialog: promptDialogTestCase(); default: break; } return false; } /* 触发告警框:通过dialogFragment.show()触发 * 我们注意对于FragmentTransaction ft,代码中没有执行ft.commit()。查看DialogFragment的show方法的源代码,如下 public void show(FragmentManager manager, String tag) { mDismissed = false; mShownByMe = true; FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commit(); } public int show(FragmentTransaction transaction, String tag) { mDismissed = false; mShownByMe = true; transaction.add(this, tag); mViewDestroyed = false; mBackStackId = transaction.commit(); return mBackStackId; } * 这里面的操作含有ft.add()和ft.commit(),故不需要在代码中重复commit,否则会异常。 add表示加入到activity,这里没有填容器的ID,即contianerViewID为0,表示不加载在具体容器内,对于dialog,container为null。 * 这本例中也可以通过adf.show(getFragmentManager(), ALERT_DIALOG_TAG)来实现。对于将fragment transaction作为参数的方式,在调用show()之前,可通过fragment transaction进行控制,如加入到back stack中,这将在按提示框的Help按钮弹帮助框中进行演示。在show()中,同时设置了fragment的tag,可用于索引,可在fragment中可以通过getTag()获取。 */ private void alterDialogTestCase(){ AlterDialogFragment adf = AlterDialogFragment.newInstance("Alert", "This is the Alter Message for test!"); FragmentTransaction ft = getFragmentManager().beginTransaction(); adf.show(ft, ALERT_DIALOG_TAG); } /* 弹出提示框 */ private void promptDialogTestCase(){ PromptDialogFragment pdf = PromptDialogFragment.newInstance("This is a Prompt Dialog!"); FragmentTransaction ft = getFragmentManager().beginTransaction(); pdf.show(ft, PROMPT_DIALOG_TAG); } /* 此为用户按对话框按键时被调用的方法,通过Toast显示相关信息。*/ public void onDialogDone(String tag, boolean cancelled, CharSequence message) { String s = tag + " responds with: " + message; if(cancelled) s = tag + " was cancelled by the user"; //Toast是没有button的信息框,在一定时间后消失,很适合用于debug。 Toast.makeText(this, s, Toast.LENGTH_LONG).show(); } } 通过fragment实现dialog的好处是:activity配置改变(例如转向)进行重构的情况下,fragment管理器能够自动重够,恢复原来的状态,无需人工干预。 详解二: DialogFragment的实例newInstance()已经在上一次学习笔记中实现。我们创建dialog的UI,可以通过重写DialogFragment的两个函数当中的一个来实现,这两个函数是onCreateView()和onCreateDialog(),前者返回view,后者返回dialog,如同通过AlertDialog.Builder构造一样。 重写onCreateView() 重写onCreateView()是fragment的传统方式,适合自定义的对话框,本例适合用于提示框,如下图所示。通过按菜单弹出提示框,提示框由一个TextView,一个EditText和三个Button组成UI。按不同的按钮触发不同的处理。小例子自作范例,按Save和Dismiss按钮,都会调用Activity的onDialogDone()函数,根据用户的实际操作,显示不同的信息。按Help按钮,则弹出一个帮助框。再弹框在稍后学习笔记中实现。 通过onCreateView()设置UI和按键反馈 利用Fragment的onCreateView()来实现对话框的UI和Fragment学习中没有差别,在本例中,我们增加了按钮点击的触发,代码如下: public class PromptDialogFragment extends DialogFragment implements OnClickListener { public static PromptDialogFragment newInstance(String prompt){ ...略... } @Override //通过重写Fragment的onCreateView()实现dialog的UI public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //1、通过inflate,根据layout XML定义,创建view View v = inflater.inflate(R.layout.prompt_dialog, container,false); TextView tv = (TextView)v.findViewById(R.id.prompt_message); tv.setText(getPrompt()); //2、注册三个button的按键监听listener Button dismissBtn = (Button)v.findViewById(R.id.button_dismiss); dismissBtn.setOnClickListener(this); Button saveBtn = (Button)v.findViewById(R.id.button_save); saveBtn.setOnClickListener(this); Button helpBtn = (Button)v.findViewById(R.id.button_help); helpBtn.setOnClickListener(this); return v; } private String getPrompt(){ Bundle b = getArguments(); return b.getString("prompt-message"); } @Override //在onCreate中设置对话框的风格、属性等 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //如果setCancelable()中参数为true,若点击dialog覆盖不到的activity的空白或者按返回键,则进行cancel,状态检测依次onCancel()和onDismiss()。如参数为false,则按空白处或返回键无反应。缺省为true setCancelable(true); //可以设置dialog的显示风格,如style为STYLE_NO_TITLE,将被显示title。遗憾的是,我没有在DialogFragment中找到设置title内容的方法。theme为0,表示由系统选择合适的theme。 int style = DialogFragment.STYLE_NO_NORMAL, theme = 0; setStyle(style,theme); } @Override //仅用于状态跟踪 public void onCancel(DialogInterface dialog) { showInfo("onCancel() is called"); super.onCancel(dialog); } @Override //仅用户状态跟踪 public void onDismiss(DialogInterface dialog) { showInfo("onDismiss() is called"); super.onDismiss(dialog); } @Override //Button按键触发的回调函数 public void onClick(View v) { MainActivity act = (MainActivity)getActivity(); switch(v.getId()){ case R.id.button_dismiss: act.onDialogDone(getTag(), true, null); //调用activity的onDialogDone(),通过Toast显示相关信息 dismiss(); //关闭对话框,并触发onDismiss()回调函数。 break; case R.id.button_help: … 略:以后实现 … break; case R.id.button_save: TextView tv = (TextView)getView().findViewById(R.id.input_text); act.onDialogDone(getTag(), false, " " + tv.getText()); //调用activity的onDialogDone(),通过Toast显示相关信息 dismiss(); //关闭对话框,并触发onDismiss()回调函数 break; default: break; } } private void showInfo(String s){ Log.d("PromptDialogFragment",s); } } 信息保存 如果用户在输入框中填入text,然后进行屏幕的横屏和竖屏切换,这涉及到填入内容的保存,可以通过onSaveInstanceState(),将之保存到fragment的Bundle savedInstanceState中,并在onCreateView()中将之恢复。但是在Android 4.2版本的测试中,系统已经能够自动保存和恢复,无需加入代码。当然,安全地我们仍建议进行以下处理。 public class PromptDialogFragment extends DialogFragment implements OnClickListener{ private EditText et = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ...... et = (EditText)v.findViewById(R.id.input_text); if(savedInstanceState != null){ CharSequence text = savedInstanceState.getCharSequence("input"); et.setText(text == null ? "" : text); } ...... } @Override public void onSaveInstanceState(Bundle outState) { outState.putCharSequence("input", et.getText()); super.onSaveInstanceState(outState); } } 重写onCreateDialog() 对于简单的对话框,可以通过AlterDialog.Builder直接创建对话框的UI,本例用于告警框,如下图。AlertDialog.Builder在Android 3.0版本之前的创建对话框方式,在之后的版本中,可用在DialogFragment中,适用于创建简单对话框。 代码如下。虽然都是OnClickListener接口,但提示框的是View.OnClickListener,这里是DialogInterface.OnClickListener。 public class AlterDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { /*【步骤1】:通过newInstance()创建实例并返回* */ public static AlterDialogFragment newInstance(String title,String message){ … 略 … } private String getTitle(){ return getArguments().getString("alert-title"); } private String getMessage(){ return getArguments().getString("alert-message"); } /* 【步骤2】创建view可以通过两个途径,一是fragment中的onCreateView(),二是DialogFragment中的onCreateDialog()。 * 前者适合对自定义的layout进行设置,具有更大的灵活性 * 而后者适合对简单dialog进行处理,可以利用Dialog.Builder直接返回Dialog对象 * 从生命周期的顺序而言,先执行onCreateDialog(),后执行oonCreateView(),我们不应同时使用两者。 * */ @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder b = new AlertDialog.Builder(getActivity()) .setTitle(getTitle()) .setMessage(getMessage()) .setPositiveButton("OK", this) //设置回调函数 .setNegativeButton("Cancel",this); //设置回调函数 return b.create(); } @Override //按键触发的回调函数 public void onClick(DialogInterface dialog, int which) { boolean isCancel = false; if(which == AlertDialog.BUTTON_NEGATIVE) { //判断用户所按何键 isCancel = true; } MyActivity act = (MyActivity) getActivity(); act.onDialogDone(getTag(), isCancel, "CLick OK, Alert dismissed"); } } 详解三: 提示框的按钮Help,将触发弹出新的帮助提示框。 帮助提示框的实现 帮助提示框的实现很简单,利用重写onCreateView( )的方式,点击按钮是执行dismiss(),关闭对话框即可。 代码不在此重复。dialog fragment的关闭有两种方式,一种是在dialog fragment中直接执行dismiss(),我们来看看DialogFragment的源代码片段: view plain copy /** * Dismiss the fragment and its dialog. If the fragment was added to the * back stack, all back stack state up to and including this entry will * be popped. Otherwise, a new transaction will be committed to remove * the fragment. */ public void dismiss() { dismissInternal( false ); } void dismissInternal( boolean allowStateLoss) { if (mDismissed) { return ; } mDismissed = true ; mShownByMe = false ; if (mDialog != null ) { mDialog.dismiss(); mDialog = null ; } mViewDestroyed = true ; if (mBackStackId = 0 ) { getFragmentManager().popBackStack(mBackStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE); mBackStackId = - 1 ; } else { FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.remove( this ); if (allowStateLoss) { ft.commitAllowingStateLoss(); } else { ft.commit(); } } } 如果back stack堆栈有该dialog,将其pop出来,否则ft.remove(this); ft.commit();。估计pop的操作也包含ft.remove()和ft.commit()。调用dismiss()会触发onDismiss()回调函数。跟踪状态,如下。 实现再弹框 在PromptDialogFragment中实现弹框的相关代码如下。这里采用另一种关闭dialog的方法,通过fragment transaction进行控制。 public void onClick(View v) { ... ... switch(v.getId()){ case R.id.button_help: FragmentTransaction ft = getFragmentManager().beginTransaction(); /* 如果不执行remove(),prompt dailog在下层,跟踪状态,系统即不会进入onDismiss()状态。主要考虑美观的问题,如果下面prompt对话框大于帮助框,视觉效果不好。下面左图为执行了remove()的效果,右图为不执行remove()的效果。 对于Dialog,container为0或者null。 */ ft.remove(this); /* 将当前的PromptDialogFragment加入到回退堆栈,当用户按返回键,或者通过按帮助框的Close按钮dismiss帮助框是,重新显示提示框。 对于back stack的处理,系统具有一定的智能。例如:执行两次addToStackStack(),实际不会重复压栈。 有例如:注释掉remove()语句,即提示框不消失,而是在帮助框的下面,如右图,由于提示框存在,我们并不需要将提示框键入到back stack,但是在实验中发现是否有addToBackStack()都不会结果有影响,系统能够分析到对象存在,不需要压栈。没有去查源代码,猜测通过mBackStackId比对来进行智能处理。 */ ft.addToBackStack(null); HelpDialogFragment hdf = HelpDialogFragment.newInstance(R.string.help_message); /* 对fragment的处理是通过fragment transaction,与在activity弹框一样,通过show()方式实现。 在此之前,我们已经通过transaction将当前的fragment加入到back stack中。*/ hdf.show(ft,MainActivity.HELP_DIALOG_TAG); break; ... ... } } 通过remove()和addToBackStack()使得fragment从UI中消失,当仍可以通过fragment管理器和回退堆栈获取。 再谈fragment管理器 通过fragment管理器或者fragment transaction,我们可以对dialog fragment进行具体地控制。show()就是在管理器中加入fragment,dismiss()就是从管理器中去掉fragment。我们不能先进行add(),然后在进行show(),因此一个fragment对象只能加入管理器一次。如果fragment被dismiss(),将从管理器中删除,我们不能再通过管理器获取该fragment的信息。因此,如果我们想保留被dismiss的dialog的一些状态或信息,需要在dialog外进行保存,例如利用activity。 总结: 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone()来显示Toast等信息。在真正项目中,fragment的编写并不需要了解activity的各类方法,好的编程风格是将fragment所涉及的方法以接口的方式封装起来,如下: public interface OnMyDialogClickListener { public void onDialogDone(String tag, boolean cancelled, CharSequence message); } 在activity中,增加接口的实现,如下: public class MainActivity extends Activity implements OnMyDialogClickListener { ...... public void onDialogDone(String tag, boolean cancelled, CharSequence message) { String s = tag + " responds with: " + message; if(cancelled) s = tag + " was cancelled by the user"; Toast.makeText(this, s, Toast.LENGTH_LONG).show(); showInfo(s); } } 相应地,在fragment中,对该方法的调用,可以写为: OnMyDialogClickListener act = (OnMyDialogClickListener)getActivity(); act.onDialogDone(……); 对于一些大型项目,如果我们无法确定activity是否真的实现了接口,可以在fragment的早期,即刚关联activity的阶段进行检测,如下: @Override public void onAttach(Activity activity) { //onAttach()是合适的早期阶段进行检查MyActivity是否真的实现了接口。 //采用接口的方式,dialog无需详细了解MyActivity,只需了解其所需的接口函数,这是真正项目中应采用的方式。 try{ OnMyDialogClickListener act = (OnMyDialogClickListener)activity; }catch(ClassCastException e){ …... activity并不真正支持接口的异常处理...... } super.onAttach(activity); } fragment和activity以其他fragment之间的通信 小例子演示了通过getActivity()获取接口对象或者直接获取activity的对象,实现两者之间的通信。此外fragment也可以通过fragment管理器,通过tag,获取其他fragment实例,从而进行fragment之间的通信。当然从编程思想的角度看,fragment之间的过多进行交叉调用,不利于程序的管控。
个人分类: 安卓开发|12134 次阅读|0 个评论
分享 虚拟机上的linux和主机上ip能够相互ping通,但在windows下却无法访问linux ip服务问题 ...
eviltomato 2014-8-30 17:53
虚拟机上的linux和主机上ip能够相互ping通,但在windows下却无法访问linux ip服务问题 ...
想要使用samba使linux和windows进行文件共享,所以先配置samba服务,配置好后,发现虚拟机上的linux和主机上ip能够相互ping通,而且在linux上能够上的了网,但是在windows下却无法访问linux的ip。 主机的ip:172.21.202.21 linux的IP为192.168.91.21 互相ping通的截图; 但是在windows下却无法访问linux的ip服务。 问题解决:setup进入 setup 关闭防火墙 Firewall Configuration - Security Level - Disable - SELinux - Disable 然后再重新运行“\\192.168.91.21”成功进入samba服务。
个人分类: 嵌入式Linux笔记|1235 次阅读|0 个评论
分享 句柄
白丁 2014-8-7 21:52
在 程序设计 中, 句柄 ( handle )是一种特殊的 智能指针 。当一个 应用程序 要引用其他系统(如 数据库 、 操作系统 )所管理的 内存 块或 对象 时,就要使用句柄。 句柄与普通 指针 的区别在于,指针包含的是引用 对象 的 内存地址 ,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个 内存地址 上。这种间接访问 对象 的模式增强了系统对引用 对象 的控制。(参见 封装 )。通俗的说就是我们调用句柄就是调用句柄所提供的服务,即句柄已经把它能做的操作都设定好了,我们只能在句柄所提供的操作范围内进行操作,但是普通指针的操作却多种多样,不受限制。 在上世纪80年代的操作系统(如 Mac OS 和 Windows )的 内存管理 中,句柄被广泛应用。 Unix 系统的 文件描述符 基本上也属于句柄。和其它 桌面环境 一样, Windows API 大量使用句柄来标识系统中的 对象 ,并创建操作系统与 用户空间 之间的通信渠道。例如,桌面上的一个窗体由一个 HWND 类型的句柄来标识。 如今, 内存 容量的增大和 虚拟内存 算法使得更简单的 指针 愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多 操作系统 仍然把指向私有 对象 的指针以及 进程 传递给 客户端 的内部 数组 下标称为句柄。
个人分类: 虚拟内存管理|280 次阅读|0 个评论

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-14 16:41 , Processed in 0.062297 second(s), 14 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部