挑战vb高手(字符串方面)vc做得到的vb能做到么?---问题再加100分

hualahuala 2003-08-19 10:30:30
http://expert.csdn.net/Expert/topic/2160/2160806.xml?temp=.487179
分数不够,可以再加
我一直用vc但vb没用过现在要在vb下解决这个问题,请多多帮助
有一个unicode文件,里面有一些西欧字符
现在要把读出来,用对话框显示
我用了下面一段程序,但是出问题,很多字符不能正常显示
请大家帮忙
Dim TempFile As Long
Dim LoadBytes() As Byte


TempFile = FreeFile
Open "d:\codeTEST.txt" For Binary As #TempFile
ReDim LoadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , LoadBytes
Close TempFile

's 01 = StrConv(LoadBytes, vbFromUnicode)

MsgBox (LoadBytes)
其中关闭掉的那一行也不起什么作用,显示的字符还没有关闭后显示得多
请问应该怎么设置,是否loadbytes不对,应当设置为双子节的数据类型
vc中能够解决,可是vb中怎么解决呢?
我把文件发到这个邮箱,你们动手看一下,和你们想象的不一样的
sun_programmer@etang.com
pwd:sun_programmer
etang的免费用户
...全文
38 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2003-08-20
  • 打赏
  • 举报
回复
Edit是Windows系统提供的控件
MFC只是把它封装成了类
(VB封装成了TextBox,只不过只封装了ANSI版的)
Greaitm 2003-08-20
  • 打赏
  • 举报
回复
给我具体例子吧,Edit控件是不是MFC的?不能用在VB
zyl910 2003-08-20
  • 打赏
  • 举报
回复
写好了
http://www.fantasiasoft.net/Zyl910/SDK_Edit.zip
tanyx 2003-08-20
  • 打赏
  • 举报
回复
挑战初学者吧?
iiboy 2003-08-20
  • 打赏
  • 举报
回复
RichTextbox.LoadFile("FileName")
iiboy 2003-08-20
  • 打赏
  • 举报
回复
利用RichTextBox控件吧
Greaitm 2003-08-19
  • 打赏
  • 举报
回复
如果阁下能够用VC搞定的话,以下这个的功能是跟VC一样的;我自己的测试也是成功的:
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Sub Form_Load()
Dim TempFile As Long
Dim LoadBytes() As Byte


TempFile = FreeFile
Open "c:\xvidcore.ini" For Binary As #TempFile
ReDim LoadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , LoadBytes
Close TempFile
' MsgBox (StrConv(LoadBytes, vbUnicode))
MessageBox 0, VarPtr(LoadBytes(1)), "", 0
End Sub
现在还是人类 2003-08-19
  • 打赏
  • 举报
回复
To hualahuala (qq)
==================================
看过我的文章了吗?应该可以实现的,你试一下。
hualahuala 2003-08-19
  • 打赏
  • 举报
回复
我现在用的是代理上网;无法开ftp;
把信箱或者可以上传的ftp给我一个;我来发给你
hxy2003 2003-08-19
  • 打赏
  • 举报
回复
UP
Greaitm 2003-08-19
  • 打赏
  • 举报
回复
而我自己用来测试的文本内容如下:
[class]

[cbr options]
reaction_delay_factor = 16 ;延时
averagin_period = 100 ;周期
buffer = 100 ;平滑度

[global]
halfpel = 0 ;使用Mpeg4半像素插值,能使图像清晰,motion_search 为4以上时,自动置位
motion_search = 4 ;可设值为0-6 数值越高 图像质量越高 码流越低 占cpu越高。
quant_type = 0 ;0 H263 1 MPEG 2 MPEG_CUSTOM
max_key_interval = 50 ;关键帧最大间隔
min_key_interval = 1 ;关键帧最小间隔
lum_masking = 0 ;使用亮度蒙版,即DX50中的心理亮度,对质量影响不大,码流反而增大,CBR慎用,
interlacing = 0 ;隔行画面处理 对pal无用
greyscale = 0 ;灰度

[quantization]
max_pquant = 31 ;最大量化
min_pquant = 2 ;最小量化


;Set By Greatim Xvid0.91

显示的内容中一个问号都没有出现过。
zyl910 2003-08-19
  • 打赏
  • 举报
回复
对于文本框:


去学SDK编程
用CreateWindowExW创建Edit控件
再发消息控制
Greaitm 2003-08-19
  • 打赏
  • 举报
回复
不是我们不肯试,实在是你的文本根本无法下载,只能在Ie里直接打开,但我们看到的也是只有一个字符的文本!
现在还是人类 2003-08-19
  • 打赏
  • 举报
回复
给你一个我以前做的函数吧,因该可以解决你的问题


Public Function 合并字节数组为文本(字节数组() As Byte) As String
Dim X As Variant, 字符值 As Variant, 运算数字1 As Variant, 运算数字2 As Variant, 已处理字节数 As Variant
已处理字节数 = LBound(字节数组)
For X = LBound(字节数组) To UBound(字节数组)
If 字节数组(X) >= 176 And 字节数组(X + 1) >= 160 Then
运算数字1 = 字节数组(X)
运算数字2 = 字节数组(X + 1)
字符值 = 运算数字1 * 256 + 运算数字2
If 字符值 >= 32768 Then
字符值 = -(65536 - 字符值)
Else
字符值 = 字符值
End If
合并字节数组为文本 = 合并字节数组为文本 & Chr(字符值)
X = X + 1
已处理字节数 = 已处理字节数 + 2
Else
字符值 = 字节数组(X)
合并字节数组为文本 = 合并字节数组为文本 & Chr(字符值)
已处理字节数 = 已处理字节数 + 1
End If
If 已处理字节数 >= UBound(字节数组) Then
Exit For
End If
Next X
End Function


使用方法:
dim 显示的文本 as String,LoadBytes() as Byte
ReDim LoadBytes(1 To Filelen("d:\codeTEST.txt"))
TempFile = FreeFile
Open "d:\codeTEST.txt" For Binary As #TempFile
Get #TempFile,1, LoadBytes
Close TempFile

显示的文本=合并字节数组为文本(LoadBytes)
msgbox 显示的文本,64,"文本内容"
Greaitm 2003-08-19
  • 打赏
  • 举报
回复
以上例子我试过是可以的,还要注意的地方是,你如果是在Win2000下,还有其他格式的文本(打开记事本就可以知道),以上代码就不成立了。
还有,这个转换在中文底下只支持中文转换成Unicode,如果是日文或其它就必须修改一下:
Strconv(loadBytes,vbUnicode,代码页)'代码页: 简体中文是&h0804,台湾中文是&h0404,...(其它我就不知道了,要自己查)。
hualahuala 2003-08-19
  • 打赏
  • 举报
回复
由于文件比较特殊,请大家最好动手做一下在发言,如果出来完整的字符串,并且中间没有问号,您再将您的程序贴上;非常感谢!
楼上的这位,您的方法和我已经试过的一样;都不行的,用这种方法,只能显示一个字符!
无论如何,还是很感谢您!
谢谢!
Greaitm 2003-08-19
  • 打赏
  • 举报
回复
Dim TempFile As Long
Dim LoadBytes() As Byte


TempFile = FreeFile
Open "c:\xvidcore.ini" For Binary As #TempFile
ReDim LoadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , LoadBytes
Close TempFile
MsgBox (StrConv(LoadBytes, vbUnicode))

因为使用字节数组而获得的字符都是DBCS+SBCS,而vb的字符串是Unicode所以要转换一下
hualahuala 2003-08-19
  • 打赏
  • 举报
回复
大家不要用OUTLOOK下载,会删除文件的,其他人就看不到了
hualahuala 2003-08-19
  • 打赏
  • 举报
回复
大家动手做一下吧,感觉你们说得我都是过了
danielinbiti 2003-08-19
  • 打赏
  • 举报
回复
01 = StrConv(LoadBytes, vbFromUnicode)

改为
01 = StrConv(LoadBytes, vbUnicode)

vbFromUnicode是DBCS+SBCS字符串,
VBUnicode 是双字节,byte数组用vbFromUnicode只能取到一半。
加载更多回复(31)
VB一些常用控件集,以及一些方法模块,编辑框.ctl、进度条、全局热键钩子、网站服务器、托盘控件、WinSock.ctl、曲线图.ctl、压缩算法-升级版.cls、数组加解密.cls、打开文件属性面板.bas等,其中一个模块的部代码摘录如下:   ------------------------------------------------------------------------------------------    ‘遍历进程,查找notepad.exe    MyRemoteProcessId = OpenProcess(PROCESS_CREATE_THREAD PROCESS_VM_OPERATION PROCESS_VM_WRITE PROCESS_VM_READ, False, ProcessInfo.th32ProcessID)    ‘打开进程获得notepad的句柄供后面的操作使用    DllFileName = "C:Vblegend.dll"    MyDllFileLength = Len(DllFileName) 1    ‘学过C语言的朋友应该知道字符串最后要一个ASCII 0标志结尾,所以要加1    MyDllFileBuffer = VirtualAllocEx(MyRemoteProcessId, 0, MyDllFileLength, MEM_COMMIT, PAGE_READWRITE)    ‘在指定进程里申请一块内存区域出来供我们存放字符串“c: est.dll“    ‘传string给api时,byval byref有区别,应该使用byval,这样会传给api一个标准的C字符指针,不能byref,否则函数调用没问题    ‘但是起不到预期效果,VirtualAllocEx返回的是申请到的内存地址值.    MyReturn = WriteProcessMemory(MyRemoteProcessId, MyDllFileBuffer, DllFileName, MyDllFileLength, temp)    ‘向刚才申请的内存中写入dll文件路径字符串    ‘顺便说一下,很多api浏览器上的api声明都是错的,包括VB6自带的也不例外,writeprocessmemory第二个参数要的是    ‘lpBaseAddress 但是这个值不能传址得到,如果你按byref传址,实际上传的是MyDllFileBuffer变量的地址,而不是它里面存放的那个数字    ‘上面说了MyDllFileBuffer的数值才是WriteProcessMemory要的地址,所以声明API的时候一定要byval,大家知道空着不写就是默认byref    ‘下面还有几处不该传址的参数,只要搞清楚API函数要的到底是什么值才可以确定到底传值还是传址,API浏览器仅能供参考,还是要仔细阅读MSDN    MyStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")    ‘获取loadlibrary函数的地址,这个函数可以载入指定的dll文件,那他的参数呢?就是我们刚才在notepad.exe进程里写入的“c: est.dll“    ‘不过还得让CreateRemoteThread告诉他.另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序    ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存区域的特权    ‘而且每个应用程序的内存区域都映射到系统内存区域里,也就是说在这里GetProcAddress得到VB程序里LoadLibraryA函数的入口地址和    ‘notepad程序里的LoadLibraryA函数地址是一致的(映射的作用),所以不必担心.另外在VB写的程序里    ‘要使用LoadLibraryA,notepad不是用vc写的吗?要注意根notepad没关系,我们现在是在自己的VB程序里面找LoadLibraryA函数的入口.    ‘还有要注意函数大小写,api函数和vb不一样的。    MyResult = CreateRemoteThread(MyRemoteProcessId, 0, 0, MyStartAddr, MyDllFileBuffer, 0, temp)    ‘好了,现在该让LoadLibrary载入“c: est.dll“吧,现在CreateRemoteThread的就是在notepad进程中把控制权转到LoadLibrar

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧