标题:[求助]无法连接字符串
只看楼主
freeshadow
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-8-23
 问题点数:0 回复次数:9 
[求助]无法连接字符串

下面是我写的读"G:\copy\boot.ini"的程序:(rootvalue(2)As string数组是我在模块里定义的,所有相关的api也声明过)
Private Sub Command3_Click()
Dim s As String, ret As Long
s = Space(1024)
ret = GetPrivateProfileString("boot loader", "default", "", s, 1024, "G:\copy\boot.ini")
If Dir("G:\copy\boot.ini") = "" Then
MsgBox "boot.ini文件不存在或已更改路径!", vbOKOnly + vbCritical, "提示"
ElseIf ret = 0 Then
MsgBox "default键值为零,读取文件出错!", vbOKOnly + vbCritical, "提示"
Else: rootvalue(0) = s
End If
s = Space(1024)
ret = GetPrivateProfileString("operating systems", rootvalue1, "", s, 1024, "G:\copy\boot.ini")
If ret = 0 Then
MsgBox "operating systems键值为零,读取文件出错!", vbOKOnly + vbCritical, "提示"
Else: rootvalue(1) = s
End If
rootvalue(1)=rootvalue(1) & "abcde"
text1.text=rootvalue(1)
End Sub
程序运行后,text1只显示"Microsoft Windows XP Professional" /execute /fastdetect并没有加上"abcde"
字符串连接应该没有错吧,具体是哪里的问题?各位帮个忙!

搜索更多相关主题的帖子: quot boot 字符 ini ret 
2007-08-24 10:40
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
得分:0 
步进一下

rootvalue(1)=rootvalue(1) & "abcde"这行之前加入Msgbox rootvalue(1),在之后也加入同样的Msgbox,可以很简单地得知这行有没有问题

按理说不应该连接出错……你的Textbox是不是太短了不够显示?
2007-08-24 11:27
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
得分:0 
我倒是觉得GetPrivateProfileString的用法有问题,本来规定用来读取的字符串s必须有个缓冲空间,可是LZ直接用变长字符串来读取,虽然全部读取时结果倒是正确,但不知道会不会影响下面的程序。。。

偶学编程,也许本身就是一个错。。。
2007-08-24 11:30
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
得分:0 
以下是引用coachard在2007-8-24 11:30:34的发言:
我倒是觉得GetPrivateProfileString的用法有问题,本来规定用来读取的字符串s必须有个缓冲空间,可是LZ直接用变长字符串来读取,虽然全部读取时结果倒是正确,但不知道会不会影响下面的程序。。。

总之这个错有点奇怪……建议LZ设置一下缓冲

2007-08-24 11:35
slore
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1108
专家分:0
注 册:2005-7-1
得分:0 

s = Space(1024)

它用了这个……

但是最后一位还是存在Vbnullchar (就是Chr(0),文本显示不了这个符号,而且会断开=.=)

Option Explicit

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Sub
Command1_Click()
Dim rootvalue(2) As String
Dim
s As String, ret As Long
s = Space(1024)
ret = GetPrivateProfileString("boot loader", "default", "", s, 1024, "G:\copy\boot.ini")
If Dir("G:\copy\boot.ini") = "" Then
MsgBox
"boot.ini文件不存在或已更改路径!", vbOKOnly + vbCritical, "提示"
ElseIf ret = 0 Then
MsgBox
"default键值为零,读取文件出错!", vbOKOnly + vbCritical, "提示"
Else: rootvalue(0) = s
End If
s = Space(1024) '这里应该用rootvalue(0)吧?
ret = GetPrivateProfileString("operating systems", rootvalue1, "", s, 1024, "G:\copy\boot.ini")
If ret = 0 Then
MsgBox
"operating systems键值为零,读取文件出错!", vbOKOnly + vbCritical, "提示"
Else: rootvalue(1) = s
End If
rootvalue(1) = Left(rootvalue(1), InStr(rootvalue(1), vbNullChar) - 1)
rootvalue(1) = rootvalue(1) & "abcde"
Text1 = rootvalue(1)
End Sub


快上课了……
2007-08-24 12:36
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
得分:0 
那就 rootvalue(1)=replace(rootvalue(1),chr(0),"")
2007-08-24 12:37
slore
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:1108
专家分:0
注 册:2005-7-1
得分:0 
以下是引用multiple1902在2007-8-24 12:37:00的发言:
那就 rootvalue(1)=replace(rootvalue(1),chr(0),"")

预置了1024个字符长度,你那样处理就多了N多空格……

chr(0)?为什么不直接用常量~汗


快上课了……
2007-08-24 13:11
freeshadow
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-8-23
得分:0 

再一次谢谢slore版主!你太强了!问题又解决了!

不过能帮我解释一下:
rootvalue(1) = Left(rootvalue(1), InStr(rootvalue(1), vbNullChar) - 1)
rootvalue(1) = rootvalue(1) & "abcde"
是怎么回事吗?

2007-08-24 13:50
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
得分:0 
我只能说你自己粗心,你昨天发的那个帖里我就说明了你如果对字符串的正确性要求较高的话就得对返回的字符进行截取。

VB QQ群:47715789
2007-08-24 14:41
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
得分:0 
回复:(freeshadow)再一次谢谢slore版主!你太强了!...
以下是引用freeshadow在2007-8-23 11:45:38的发言:
请看下面一段代码:
Private Sub Command3_Click()
Dim str1 As String
str1=String(256,0)
GetPrivateProfileString "boot loader", "default", "", str, 256, "G:\copy\boot.ini"
if instr(str1,chr(0)) then str1=left(str1,instr(str1,chr(0))-1) '如果你对字符串的准确性要求比较高的话最好加上这一条。
Text1.Text = str1
End Sub
G:\copy\boot.ini是我复制的C:\boot.ini,先拿它联系以免损坏系统文件
(函数已经声明过)
当我运行程序并按下Command3时,出现如下提示:
"0x7c832b26"指令引用"0x00000000"内存,该内存不能为"written"(别的api函数使用时都没有这个问题!!!)
着该如何解决!!!
各位大虾帮帮忙!!

自已注意看第二条加色的代码


VB QQ群:47715789
2007-08-24 14:44



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-165062-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.236340 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved