VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 20313|回复: 31

[分享] VB6的Unicode文件名支持

  [复制链接]
 楼主| 发表于 2012-4-18 22:05:23 | 显示全部楼层 |阅读模式
如题,给Dir,FileLen等函数加了Unicode版本,另外通过API钩子实现Open语句支持Unicode文件名



补充内容 (2012-4-22 13:24):
发现一个问题,Name xx As xx语句没有Unicode化……

补充内容 (2012-4-25 13:11):
还有另一个函数不支持Unicode:Shell

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

Name xx As xx 用 MoveFileW StrPtr(是Unicode), StrPtr(非Unicode) 代替:Private Declare Function MoveFileW Lib "kernel32.dll" (ByVal lpExistingFileName As Long, ByVal lpNewFileName As Long) As Long   发表于 2014-8-16 19:07
回楼下,我用喜欢在VB6里面用空格,在C/C++里面才用Tab  发表于 2012-7-8 22:34
你写代码为什么不喜欢用步进?  发表于 2012-7-8 18:34
回楼下,可以的,你看我截图里面就有一个韩文  发表于 2012-4-19 22:34
这个能支持韩文吗...看样子貌似可以哦  发表于 2012-4-19 19:57

评分

参与人数 16威望 +123 人气 +33 收起 理由
xmchen + 2 + 1 赞一个
Apple_0 + 15 + 3 好!
eaaca1234 + 8 太牛了……
h907308901 + 10 + 2 赞一个!
lppop + 8 + 1 很给力!
dolphins + 16 + 3 淡定
19900603 + 7 + 3 很给力!
阳光宝宝 + 1 赞一个!
admin6677 + 4 + 3 赞一个!
youhm + 16 + 3 赞一个!
红色狂想 + 1 赞一个!
戒禁之魂 + 11 + 3 赞一个!
JuncoJet + 4 + 3 淡定
lekj + 16 + 3 很给力!
Jen + 4 + 2 Hook API,稳定吗?
garyng + 2 + 1 很给力!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2012-4-18 22:05:24 | 显示全部楼层
O(∩_∩)O哈哈~,沙发是我的啦
JuncoJet 于 2012-4-19 04:20 使用 抢沙发 抢夺本帖沙发
回复 支持 反对

使用道具 举报

发表于 2012-4-18 22:19:54 | 显示全部楼层
沙发是我的~~~

强得顶!
下载试试
回复 支持 反对

使用道具 举报

发表于 2012-4-18 22:22:52 | 显示全部楼层
用VC定义一个UNICODE条件编译就支持了...

点评

你那不是废话么,wfopen就搞定了,不过似乎Linux下面没有这个函数  发表于 2012-4-18 22:34
回复 支持 反对

使用道具 举报

发表于 2012-4-18 22:53:40 | 显示全部楼层
本帖最后由 Jen 于 2012-4-18 22:58 编辑

我常用:
  1. Public Function FileExists(FileName As String, Optional ByVal useUnicode As Boolean) As Boolean

  2. ' test to see if a file exists

  3. Const INVALID_HANDLE_VALUE = -1&
  4. Dim bISNT As Boolean

  5.     bISNT = IsWinNt
  6.     If bISNT = False Then bISNT = (Not (IsWindowUnicode(GetDesktopWindow) = 0&))
  7.     If bISNT Then
  8.         FileExists = Not (GetFileAttributesW(StrPtr(FileName)) = INVALID_HANDLE_VALUE)
  9.     Else
  10.         FileExists = Not (GetFileAttributesA(FileName) = INVALID_HANDLE_VALUE)
  11.     End If

  12. End Function

  13. Private Function OpenFileW(FileName As String)

  14. ' Function uses APIs to read file name with unicode characters

  15. Const GENERIC_READ As Long = &H80000000
  16. Const GENERIC_WRITE = &H40000000
  17. Const OPEN_EXISTING = &H3
  18. Const FILE_SHARE_READ = &H1
  19. Const FILE_SHARE_WRITE = &H2
  20. Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20
  21. Const FILE_ATTRIBUTE_HIDDEN As Long = &H2
  22. Const FILE_ATTRIBUTE_READONLY As Long = &H1
  23. Const FILE_ATTRIBUTE_SYSTEM As Long = &H4
  24. Const FILE_ATTRIBUTE_NORMAL = &H80&

  25. Dim Flags As Long, Access As Long
  26. Dim Disposition As Long, Share As Long
  27. Dim hFile As Long

  28.     Access = GENERIC_READ
  29.     Share = FILE_SHARE_READ
  30.     Disposition = OPEN_EXISTING
  31.     Flags = FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_NORMAL _
  32.             Or FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_SYSTEM

  33.     hFile = CreateFileW(StrPtr(FileName), Access, Share, 0&, Disposition, Flags, 0&)
  34.     If hFile = 0 Then
  35.         If isStringANSI(FileName) Then
  36.             ' hFile should never be zero. It should be -1 (error) or a valid handle
  37.             ' when hFile is zero, most likely API was called on a Win9x system
  38.             ' so we will call the ANSI version and see if that returns a handle
  39.             hFile = CreateFileA(FileName, Access, Share, 0&, Disposition, Flags, 0&)
  40.         End If
  41.     End If

  42.     If Not hFile = -1 Then OpenFileW = hFile

  43. End Function

  44. Public Function isStringANSI(inText As String) As Boolean

  45. ' simple test to determine if passed string is ANSI-like or not.
  46. ' In other words, does it contain unicode characters.

  47. Dim tArray() As Byte
  48. Dim x As Long

  49.     If inText = vbNullString Then

  50.         isStringANSI = True

  51.     Else

  52.         tArray = inText
  53.         For x = LBound(tArray) + 1 To UBound(tArray) Step 2
  54.             If Not tArray(x) = 0 Then Exit For
  55.         Next x

  56.         isStringANSI = (x > UBound(tArray))

  57.     End If

  58. End Function
复制代码

点评

Jen
代价太大了。VB的Open(ANSI)完全可以用W-API代替嘛。  发表于 2012-4-18 23:46
这样做的缺点就是文件打开之后只能用API读写,不能用方便的VB6内置语句读写了  发表于 2012-4-18 23:34
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2012-4-18 23:03:40 | 显示全部楼层
我倒真没想过要加这些函数..........

点评

还是很有用的嘛!!!!  发表于 2012-4-18 23:03
回复 支持 反对

使用道具 举报

发表于 2012-4-18 23:23:10 | 显示全部楼层
HOOK? 这东西不用说  250 肯定报毒....

点评

呃 还真没报...话说我编译成dll 干啥都报......  发表于 2012-4-18 23:39
恭喜你,在我这里250没有报毒……话说我这个是在当前进程挂钩,除非250过敏,否则不会报毒的(编译成exe尚未测试)  发表于 2012-4-18 23:32
回复 支持 反对

使用道具 举报

发表于 2012-4-19 04:22:10 | 显示全部楼层
菜鸟学飞 发表于 2012-4-18 23:23
HOOK? 这东西不用说  250 肯定报毒....

inline Hook自己,估计不会报的
回复 支持 反对

使用道具 举报

发表于 2012-4-19 04:23:19 | 显示全部楼层
论坛 点评 和回复 标签位置是不是交换过了?为什么一直按错的说…………
每次想点评 都按成回复
回复 支持 反对

使用道具 举报

发表于 2012-4-19 07:52:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-3 17:09

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表