郁闷,又一个常用软件在Vista下不能正常运行了

前一段,在进行工具安装的时候,发现手头的《金山词霸2006》是iso的,于是去下载了一个Daemon Tools ,安装后重启变蓝屏,使用最后一次正常的系统记录恢复后,系统提示Daemon Tools 与Vista不兼容,于是想了其他办法,装好《金山词霸2006》 打开,告诉我 他也不被兼容= =,话说之前的金山快译丝毫没有问题。
辅助更新还好,昨天装了零售版的《天网防火墙2007》,系统就挂掉了,最后用了系统修复光盘才恢复,今天留意了一下,天网尽然不支持Vista,而且Vista下的版本还正在开发中。。。。。。。。。。安全软件没有怎么吃饭呀,难道还要用Vista自带的脆弱的防火墙,还好装了卡巴,不过只是KAV而不是KIS。。。。不过先凑合避免病毒再说了,只能说等待这天网。。。。。。又开始怀念之前因为一个功能影响网络而被我换装到台式机上的麦咖啡了。。。。。。好说他只要关闭一个本来就不必要的功能就能在Vista正常使用了。。。
看来Vista的普及还需要时间那。。。。。。。。。。。。。

[常用API]一个不含在通用对话框控件中的常用对话框

选择文件夹对话框,在安装程序和软件设置中经常用到,但是神奇的是,如此常用的对话框,却不包含在VB的通用对话框控件中,这也导致了很多人手工设计这个对话框。今天在翻看别人程序的时候,发现他们用到了这个API,于是就写出来分享。
此API在Vista下也测试成功,所以可以正常使用。
API如下:
程序代码 程序代码
Private Declare Function SHBrowseForFolder Lib “shell32.dll” Alias “SHBrowseForFolderA” (lpBrowseInfo As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib “shell32.dll” Alias “SHGetPathFromIDListA” (ByVal pidl As Long, ByVal pszPath As String) As Long
相关的测试程序代码,贴在附件中。
下载文件

总想写点什么,于是写写最近OI的情况吧

7月底到龙岩的训练,朱全民老师教会了我们许多,当然由于小朋友来了很多,一些难的知识点没有提到,也感到有些遗憾。
在龙岩这段期间,不愉快的事情也有,校舍条件差到没有水(貌似有发现含有那啥钙镁化合物之类的硬水,于是撤离= =)没电灯,没风扇,熄灯不熄灯已经不重要了,最后只要4个人去住宾馆的2室一厅的房间。在晚上上机时龙岩一中的某些人故意限制网路啦,关闭交换机啦,导致局域网都不能有正常的连接,不过还好,他们那的U盘能够正常使用,于是将就着用来交换数据了。也有几天,索性就没有呆在机房了,于是,很多讲义里面的题目需要等到回到福州以后慢慢完成了(话说在那里也没有心情完成了)。
昨天去参加了Stupid的模拟赛,也顺带测验了一下最近的成果,还好,前两题都没有问题,不得不佩服五角星大牛了,后面两题也完成了,虽然说测试当初的程序不佳,但今天改善完成后出现了350分的好程序。我还一直看着 200分(恩,能够没错完成两题。。。。还不错啦)。。。。。
今天主要还是把昨天模拟赛的题目完成了。最近有些昏昏成成的,不过还是有些成果出来,也算对自己的安慰啦。

2007/08/01 数码兽诞生10周年 !

2007年08月01日 与台场纪念日 ,数码兽诞生10周年!
多么激动人心的时刻,回想起DA时,那蝴蝶的翩翩起舞,那惊险刺激的冒险。
10年了,Digimon!
Butter-Fly 振翅高飞!
想要化作快乐的蝴蝶 乘着发亮的风振翅高飞
现在只想马上和你相会
最好把不愉快的事全都忘记
似乎什么 wow wow~会在晴空下出现
但 wow wow~ 我甚至不了解未来的打算
在无限延伸的梦想后面 穿越虚无的世界
就算会失去被爱的梦想
甚至以这些不能依赖的羽翼 隐藏在那易停留的画面中
我仍希冀着爱的飞翔
想要化作幸福的蝴蝶 乘着热忱的风振翅高飞
没有多余的时间可以浪费
似乎什么 wow wow~会在晴空下出现
但 wow wow~ 我甚至不了解未来的打算
在无限延伸的梦想后面 穿越虚无的世界
就算会失去被爱的梦想
甚至以这些不能依赖的羽翼 隐藏在那易停留的画面中
我仍希冀着爱的飞翔
想要化作幸福的蝴蝶 乘着热忱的风振翅高飞
无论何地都想飞到你的身边
不明的话语出奇地简单
听到激动的乐声时 我会大声喊出
似乎什么 wow wow~想象回音响彻小城
但 wow wow~ 不可能预见这一切
在无限延伸的梦想后面 停留在这苦痛的世界
是啊 也许判断并不总是错的
甚至以这些笨拙的羽翼 浸染在那易停留的画面中
我仍希冀着爱的飞翔
在无限延伸的梦想后面 穿越虚无的世界
就算会失去被爱的梦想
甚至以这些不能依赖的羽翼 隐藏在那易停留的画面中
我仍希冀着飞翔 Oh Yeah
在无限延伸的梦想后面 停留在这苦痛的世界
是啊 也许判断并不总是错的
甚至以这些笨拙的羽翼 浸染在那易停留的画面中
我仍希冀着爱的飞翔
==========================================
DM07年台场纪念作《僕らのデジタルワールド》
MU地址:http://www.megaupload.com/?d=U3CM541V
==========================================
全新的专辑诞生,在数码兽诞生10周年的日子里献给所有热爱数码兽的粉丝们。
在数码兽纪念日[8/1台场纪念日],由历代登场角色、歌手的梦一般的竞演终于实现了!!
被Digimon Fans无法忘怀的8月1日纪念日。 今年,数码兽作为手机游戏诞生之后纪念恰好10年,历代五系列的歌手和登场角色梦一般的协作实现。 从数码兽大冒险到数码兽拯救者,这个才是Digimon Fans心愿的1张。
Digimon10周年特别企划CD专辑“デジモン 10th ANNIVERSARY[/b]”曲目判明!

収録曲:
01.永久に続け!! 
   作詞:亜美 作曲·編曲:真崎 修
   歌:八神太一(CV:藤田淑子)
02.明日
   作詞·作曲·編曲:宮崎 歩
   歌:本宮大輔(CV:木内レイコ)
03.キセキの宝物   
   作詞:亜美 作曲·編曲:宮崎 歩
   歌:松田啓人(CV:津村まこと)
04.Secret Rendezvous
   作詞·作曲·編曲:福士健太郎
   歌:神原拓也(CV:竹内順子)
05.夢のカケラ
   作詞:白井裕紀 作曲·編曲:真崎 修
   歌:大門 大(CV:保志総一朗)
06.TRY AGAIN!!
   作詞·作曲·編曲:IKUO
   歌:IKUO
07.想い出の向こう
   作詞·作曲·編曲:宮崎 歩、シライシ紗トリ、鈴木雅也
   歌:宮崎 歩
08.小さなかけら
   作詞·作曲:ai 編曲:守尾 崇
   歌:AiM
09.誇り~限りなき力の証明~
   作詞·作曲:和田光司 編曲:島田 充
   歌:和田光司', '

UTF-8的一些处理

由于一些平台对UTF-8的支持不够,导致程序开发上的一些困难,于是查到一些资料,还是很有意义的。发出来参考一下
支持常见的ANSI、UTF-8、UTF-16LE、UTF-16BE这几种编码文本

Option Explicit
'mTextUTF.bas
'模块:UTF文本文件访问
'作者:zyl910
'版本:1.0
'日期:2006-1-23
'== 说明 ===================================================
'支持Unicode编码的文本文件读写。暂时支持ANSI、UTF-8、UTF-16LE、UTF-16BE这几种编码文本
'== 更新记录 ===============================================
'[V1.0] 2006-1-23
'1.支持最常见的ANSI、UTF-8、UTF-16LE、UTF-16BE这几种编码文本
'## 编译预处理常数 #########################################
'== 全局常数 ===============================================
'IncludeAPILib:引用了API库,此时不需要手动写API声明
'## API ####################################################
#If IncludeAPILib = 0 Then
'== File ===================================================
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Const INVALID_HANDLE_VALUE = -1
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const Create_NEW = 1
Private Const Create_ALWAYS = 2
Private Const OPEN_EXISTING = 3
Private Const OPEN_ALWAYS = 4
Private Const TRUNCATE_EXISTING = 5
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const FILE_BEGIN = 0
Private Const FILE_CURRENT = 1
Private Const FILE_END = 2
'== Unicode ================================================
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByRef lpWideCharStr As Any, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpWideCharStr As Any, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByRef lpDefaultChar As Any, ByVal lpUsedDefaultChar As Long) As Long
Private Const CP_UTF8 As Long = 65001
#End If
'###########################################################
'Unicode编码格式
Public Enum UnicodeEncodeFormat
UEF_ANSI = 0 'ANSI+DBCS
UEF_UTF8 'UTF-8
UEF_UTF16LE 'UTF-16LE
UEF_UTF16BE 'UTF-16BE
UEF_UTF32LE 'UTF-32LE
UEF_UTF32BE 'UTF-32BE
UEF_Auto = -1 '自动识别编码
'隐藏项目
[_UEF_Min] = UEF_ANSI
[_UEF_Max] = UEF_UTF32BE
End Enum
'ANSI+DBCS方式的文本所使用的代码页。默认为0,表示使用系统当前代码页。可以利用该参数实现读取其他代码编码的文本,比如想在 简体中文平台下 读取 繁体中文平台生成的txt,就将它设为950
Public UEFCodePage As Long
'判断BOM
'返回值:BOM所占字节
'dwFirst:[in]文件最开始的4个字节
'fmt:[out]返回编码类型
Public Function UEFCheckBOM(ByVal dwFirst As Long, ByRef fmt As UnicodeEncodeFormat) As Long
If dwFirst = &HFEFF& Then
fmt = UEF_UTF32LE
UEFCheckBOM = 4
ElseIf dwFirst = &HFFFE0000 Then
fmt = UEF_UTF32BE
UEFCheckBOM = 4
ElseIf (dwFirst And &HFFFF&) = &HFEFF& Then
fmt = UEF_UTF16LE
UEFCheckBOM = 2
ElseIf (dwFirst And &HFFFF&) = &HFFFE& Then
fmt = UEF_UTF16BE
UEFCheckBOM = 2
ElseIf (dwFirst And &HFFFFFF) = &HBFBBEF Then
fmt = UEF_UTF8
UEFCheckBOM = 3
Else
fmt = UEF_ANSI
UEFCheckBOM = 0
End If
End Function
'生成BOM
'返回值:BOM所占字节
'fmt:[in]编码类型
'dwFirst:[out]文件最开始的4个字节
Public Function UEFMakeBOM(ByVal fmt As UnicodeEncodeFormat, ByRef dwFirst As Long) As Long
Select Case fmt
Case UEF_UTF8
dwFirst = &HBFBBEF
UEFMakeBOM = 3
Case UEF_UTF16LE
dwFirst = &HFEFF&
UEFMakeBOM = 2
Case UEF_UTF16BE
dwFirst = &HFFFE&
UEFMakeBOM = 2
Case UEF_UTF32LE
dwFirst = &HFEFF&
UEFMakeBOM = 4
Case UEF_UTF32BE
dwFirst = &HFFFE0000
UEFMakeBOM = 4
Case Else
dwFirst = 0
UEFMakeBOM = 0
End Select
End Function
'判断文本文件的编码类型
'返回值:编码类型。文件无法打开时,返回UEF_Auto
'FileName:文件名
Public Function UEFCheckTextFileFormat(ByVal FileName As String) As UnicodeEncodeFormat
Dim hFile As Long
Dim dwFirst As Long
Dim nNumRead As Long
'打开文件
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, ByVal 0&)
If INVALID_HANDLE_VALUE = hFile Then '文件无法打开
UEFCheckTextFileFormat = UEF_Auto
Exit Function
End If
'判断BOM
dwFirst = 0
Call ReadFile(hFile, dwFirst, 4, nNumRead, ByVal 0&)
nNumRead = UEFCheckBOM(dwFirst, UEFCheckTextFileFormat)
'Debug.Print nNumRead
'关闭文件
Call CloseHandle(hFile)
End Function
'读取文本文件
'返回值:读取的文本。返回vbNullString表示文件无法打开
'FileName:[in]文件名
'fmt:[in,out]使用何种文本编码格式来读取文本。为UEF_Auto时表示自动判断,且在fmt参数返回文本所用编码格式
Public Function UEFLoadTextFile(ByVal FileName As String, Optional ByRef fmt As UnicodeEncodeFormat = UEF_Auto) As String
Dim hFile As Long
Dim nFileSize As Long
Dim nNumRead As Long
Dim dwFirst As Long
Dim CurFmt As UnicodeEncodeFormat
Dim cbBOM As Long
Dim cbTextData As Long
Dim CurCP As Long
Dim byBuf() As Byte
Dim cchStr As Long
Dim I As Long
Dim byTemp As Byte
'判断fmt范围
If fmt <> UEF_Auto Then
If fmt < &#91;_UEF_Min&#93; o&#114; fmt > [_UEF_Max] Then
GoTo FunEnd
End If
End If
&#39;打开文件
hFile = Cr&#101;ateFile(FileName, GENERIC_READ, FILE_SHARE_READ o&#114; FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, ByVal 0&)
If INVALID_HANDLE_VALUE = hFile Then &#39;文件无法打开
GoTo FunEnd
End If
&#39;判断文件大小
nFileSize = GetFileSize(hFile, nNumRead)
If nNumRead <> 0 Then &#39;超过4GB
GoTo FreeHandle
End If
If nFileSize < 0 Then &#\n39;超过2GB
GoTo FreeHandle
End If
&#39;判断BOM
dwFirst = 0
Call ReadFile(hFile, dwFirst, 4, nNumRead, ByVal 0&)
cbBOM = UEFCheckBOM(dwFirst, CurFmt)
&#39;恢复文件指针
If fmt = UEF_Auto Then &#39;自动判断
fmt = CurFmt
&#39;cbBOM = cbBOM
Else &#39;手动设置编码
If fmt = CurFmt Then &#39;若编码相同,则忽略BOM标记
&#39;cbBOM = cbBOM
Else &#39;编码不同,那么都是数据
cbBOM = 0
End If
End If
Call SetFilePointer(hFile, cbBOM, ByVal 0&, FILE_BEGIN)
cbTextData = nFileSize - cbBOM
&#39;读取数据
UEFLoadTextFile = ""
Sel&#101;ct Case fmt
Case UEF_ANSI, UEF_UTF8
&#39;判断应使用的CodePage
CurCP = IIf(fmt = UEF_UTF8, CP_UTF8, UEFCodePage)
&#39;分配缓冲区
On Error GoTo FreeHandle
ReDim byBuf(0 To cbTextData - 1)
On Error GoTo 0
&#39;读取数据
nNumRead = 0
Call ReadFile(hFile, byBuf(0), cbTextData, nNumRead, ByVal 0&)
&#39;取得Unicode文本长度
cchStr = MultiByteToWideChar(CurCP, 0, byBuf(0), nNumRead, ByVal 0&, ByVal 0&)
If cchStr > 0 Then
&#39;分配字符串空间
On Error GoTo FreeHandle
UEFLoadTextFile = String$(cchStr, 0)
On Error GoTo 0
&#39;取得文本
cchStr = MultiByteToWideChar(CurCP, 0, byBuf(0), nNumRead, ByVal StrPtr(UEFLoadTextFile), cchStr + 1)
End If
Case UEF_UTF16LE
cchStr = (cbTextData + 1) \\ 2
&#39;分配字符串空间
On Error GoTo FreeHandle
UEFLoadTextFile = String$(cchStr, 0)
On Error GoTo 0
&#39;取得文本
nNumRead = 0
Call ReadFile(hFile, ByVal StrPtr(UEFLoadTextFile), cbTextData, nNumRead, ByVal 0&)
&#39;修正文本长度
cchStr = (nNumRead + 1) \\ 2
If cchStr > 0 Then
If Len(UEFLoadTextFile) > cchStr Then
UEFLoadTextFile = Left$(UEFLoadTextFile, cchStr)
End If
Else
UEFLoadTextFile = ""
End If
Case UEF_UTF16BE
&#39;分配缓冲区
On Error GoTo FreeHandle
ReDim byBuf(0 To cbTextData - 1)
On Error GoTo 0
&#39;读取数据
nNumRead = 0
Call ReadFile(hFile, byBuf(0), cbTextData, nNumRead, ByVal 0&)
If nNumRead > 0 Then
&#39;隔两字节翻转相邻字节
For I = 0 To nNumRead - 1 - 1 Step 2 &#39;再-1是为了避免最后多出的那个字节
byTemp = byBuf(I)
byBuf(I) = byBuf(I + 1)
byBuf(I + 1) = byTemp
Next I
&#39;取得文本
UEFLoadTextFile = byBuf &#39;VB允许String中的字符串数据与Byte数组直接转换
End If
Case UEF_UTF32LE
UEFLoadTextFile = vbNullString &#39;暂时不支持
Case UEF_UTF32BE
UEFLoadTextFile = vbNullString &#39;暂时不支持
Case Else
Debug.Assert False
End Sel&#101;ct
FreeHandle:
&#39;关闭文件
Call CloseHandle(hFile)
FunEnd:
End Function
&#39;保存文本文件
&#39;返回值:是否成功
&#39;FileName:[in]文件名
&#39;sText:[in]欲输出的文本
&#39;IsAppend:[in]是否是添加方式
&#39;fmt:[in,out]使用何种文本编码格式来存储文本。当IsAppend=True时允许UEF_Auto自动判断,且在fmt参数返回文本所用编码格式
&#39;DefFmt:[in]当使用添加模式时,若文件不存在且fmt = UEF_Auto时应使用的编码格式
Public Function UEFSaveTextFile(ByVal FileName As String, _
ByRef sText As String, Optional ByVal IsAppend As Boolean = False, _
Optional ByRef fmt As UnicodeEncodeFormat = UEF_Auto, Optional ByVal DefFmt As UnicodeEncodeFormat = UEF_ANSI) As Boolean
Dim hFile As Long
Dim nFileSize As Long
Dim nNumRead As Long
Dim dwFirst As Long
Dim cbBOM As Long
Dim CurCP As Long
Dim byBuf() As Byte
Dim cbBuf As Long
Dim I As Long
Dim byTemp As Byte
&#39;判断fmt范围
If IsAppend And (fmt = UEF_Auto) Then
Else
If fmt < &#91;_UEF_Min&#93; o&#114; fmt > [_UEF_Max] Then
GoTo FunEnd
End If
End If
&#39;打开文件
hFile = Cr&#101;ateFile(FileName, GENERIC_READ o&#114; GENERIC_WRITE, FILE_SHARE_READ o&#114; FILE_SHARE_WRITE, ByVal 0&, IIf(IsAppend, OPEN_ALWAYS, Cr&#101;ate_ALWAYS), FILE_ATTRIBUTE_NORMAL, ByVal 0&)
If INVALID_HANDLE_VALUE = hFile Then &#39;文件无法打开
GoTo FunEnd
End If
&#39;判断文件大小
nFileSize = GetFileSize(hFile, nNumRead)
If nFileSize = 0 And nNumRead = 0 Then &#39;文件大小为0字节
IsAppend = False &#39;此时需要写BOM标志
If fmt = UEF_Auto Then fmt = DefFmt
End If
&#39;判断BOM
If IsAppend And (fmt = UEF_Auto) Then
dwFirst = 0
Call ReadFile(hFile, dwFirst, 4, nNumRead, ByVal 0&)
cbBOM = UEFCheckBOM(dwFirst, fmt)
ElseIf IsAppend = False Then
cbBOM = UEFMakeBOM(fmt, dwFirst)
End If
&#39;文件指针定位
Call SetFilePointer(hFile, 0, ByVal 0&, IIf(IsAppend, FILE_END, FILE_BEGIN))
&#39;写BOM
If IsAppend = False Then
If cbBOM > 0 Then
Call WriteFile(hFile, dwFirst, cbBOM, nNumRead, ByVal 0&)
End If
End If
&#39;写文本数据
If Len(sText) > 0 Then
Sel&#101;ct Case fmt
Case UEF_ANSI, UEF_UTF8
&#39;判断应使用的CodePage
CurCP = IIf(fmt = UEF_UTF8, CP_UTF8, UEFCodePage)
&#39;取得缓冲区大小
cbBuf = WideCharToMultiByte(CurCP, 0, ByVal StrPtr(sText), Len(sText), ByVal 0&, 0, ByVal 0&, ByVal 0&)
If cbBuf > 0 Then
&#39;分配缓冲区
On Error GoTo FreeHandle
ReDim byBuf(0 To cbBuf)
On Error GoTo 0
&#39;转换文本
cbBuf = WideCharToMultiByte(CurCP, 0, ByVal StrPtr(sText), Len(sText), byBuf(0), cbBuf + 1, ByVal 0&, ByVal 0&)
&#39;写文件
Call WriteFile(hFile, byBuf(0), cbBuf, nNumRead, ByVal 0&)
UEFSaveTextFile = True
End If
Case UEF_UTF16LE
&#39;写文件
Call WriteFile(hFile, ByVal StrPtr(sText), LenB(sText), nNumRead, ByVal 0&)
UEFSaveTextFile = True
Case UEF_UTF16BE
&#39;将字符串中的数据复制到byBuf
On Error GoTo FreeHandle
byBuf = sText
On Error GoTo 0
cbBuf = UBound(byBuf) - LBound(byBuf) + 1
&#39;隔两字节翻转相邻字节
For I = 0 To cbBuf - 1 - 1 Step 2 &#39;再-1是为了避免最后多出的那个字节
byTemp = byBuf(I)
byBuf(I) = byBuf(I + 1)
byBuf(I + 1) = byTemp
Next I
&#39;写文件
Call WriteFile(hFile, byBuf(0), cbBuf, nNumRead, ByVal 0&)
UEFSaveTextFile = True
Case UEF_UTF32LE
UEFSaveTextFile = False &#39;暂时不支持
Case UEF_UTF32BE
UEFSaveTextFile = False &#39;暂时不支持
Case Else
Debug.Assert False
End Sel&#101;ct
Else
UEFSaveTextFile = True
End If
FreeHandle:
&#39;关闭文件
Call CloseHandle(hFile)
FunEnd:
End Function