标题:在vb环境中,执行我的程序,写入ini文件后,用记事本打开发现是黑方块,但是编 ...
只看楼主
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
结帖率:86.25%
已结贴  问题点数:20 回复次数:7 
在vb环境中,执行我的程序,写入ini文件后,用记事本打开发现是黑方块,但是编译为exe后,却没有这个现象?
在vb环境中,执行我的程序,写入ini文件后,用记事本打开发现是黑方块,但是编译为exe后,却没有这个现象?
-------------------------------
有一个文本框,让用户输入搜索关键字,用户每次输入完毕打回车,进行搜索,同时将关键字保存到ini文件中.
我发现写入INI文件时,如果是英文字符没问题,如果有汉字,则会出现黑色方块.有时再次输入汉字,刚才有方块又变成正常的汉字了,另外,就算是方块,用我的vb程序取出来,也是正常的字符(即可以将方块识别为正确的汉字),

这个现象在VB编程环境中存在,但是如果编译成EXE文件,就没有这个现象了,
我非常怪,这是为什么呢?
(我曾以为是字符串中有回车符的原因,但是我不打回车,也会这样,好象与有没有回车符没有关系)
为什么字符会变成方块呢?
而且这个方块,VB也能正常的识别出正确的汉字.
搜索更多相关主题的帖子: ini 方块 exe 记事本 环境 
2009-07-13 17:08
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
得分:0 
不仅是记事本打开是方块,是实心的.
用editplus打开也是方块,不过是白方块,是虚心的.

2009-07-13 17:20
不说也罢
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:39
帖 子:1481
专家分:4989
注 册:2007-10-7
得分:0 
描述的再多估计也没人回答
代码说话

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2009-07-13 17:24
wdeast
Rank: 2
等 级:论坛游民
帖 子:14
专家分:74
注 册:2009-7-13
得分:0 
把代码贴上来。
2009-07-13 19:35
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
查看 INI 文件的十六进制数据才能知道是什么问题。
你的描述没有任何可供参考的关键数据。

授人于鱼,不如授人于渔
早已停用QQ了
2009-07-14 12:03
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:5 
你试试。

打开一个记事本,输入  联通  二个中文字。简体,不要再改别的,保存。
然后再用记事本打开,是不是还是 联通 二个中文字,你是不是也是这种的情况造成的?

授人于鱼,不如授人于渔
早已停用QQ了
2009-07-14 12:06
ggyy66
Rank: 1
等 级:新手上路
帖 子:427
专家分:0
注 册:2007-8-14
得分:0 
以下是操作 ini 文件的类代码,
如果写入
[text]
1=学业

就会乱码,再多存几个汉字,又能正常显示了.
我试了几个论坛上其他网友的程序,也存在这个问题,大家可以试试.
只存两个汉字:学业,
有的汉字也不出问题.


Option Explicit

'the path of our ini file

Private strINI As String        'ini文件的路径

'Windows API Declares

Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _
    (ByVal lpApplicationName As String, _
    ByVal lpKeyName As Any, _
    ByVal lpString As Any, _
    ByVal lpFileName As String) As Long
   
   
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 Function MakePath(ByVal strDrv As String, ByVal strDir As String) As String

    ' Makes an INI file: Guarantees a sub dir
    Do While Right$(strDrv, 1) = "\"
        strDrv = Left$(strDrv, Len(strDrv) - 1)
    Loop
   
    Do While Left$(strDir, 1) = "\"
        strDir = Mid$(strDir, 2)
    Loop
   
    ' Return the path
    MakePath = strDrv & "\" & strDir

End Function


Private Sub CreateIni(strDrv As String, strDir As String)

    ' Make a new ini file
    strINI = MakePath(strDrv, strDir)

End Sub


'--------------------------
'功能:写入ini文件
'创建:2007/8/7
'更新:2007/8/7 9:07
'--------------------------
Public Function WriteIniKey(ByVal strSection As String, ByVal strKey As String, ByVal strValue As String) As Boolean

    On Error GoTo errhandle
    ' Write to strINI
    WriteIniKey = CBool(WritePrivateProfileString(strSection, strKey, strValue, strINI))
    Exit Function
errhandle:
    MsgBox Err.Description
    Err.Clear
End Function


'---------------------------
'功能:从ini文件中获取信息
'创建:2007/8/7
'更新:2007/8/7 8:55
'---------------------------
Public Function GetIniKey(strSection As String, strKey As String) As String
    On Error GoTo errhandle
    Dim strResult  As String * 255          '固定255长度
    Dim lngRet  As Long
   
    '先将strResult定义成1024个字符的长度,保证一定能装下返回的字串
    'strResult = String$(1024, Chr(32))
    'strResult = String$(1024, 0)
    'strResult = Space(255)
   
    'lpApplicationName String,欲在其中查找条目的小节名称。这个字串不区分大小写。如设为vbNullString,就在lpReturnedString缓冲区内装载这个ini文件所有小节的列表
    'lpKeyName String,欲获取的项名或条目名。这个字串不区分大小写。如设为vbNullString,就在lpReturnedString缓冲区内装载指定小节所有项的列表
    'lpDefault String,指定的条目没有找到时返回的默认值。可设为空("")
    'lpReturnedString String,指定一个字串缓冲区,长度至少为nSize,返回的字符串
    'nSize Long,指定装载到lpReturnedString缓冲区的最大字符数量,返回字符串的长度
    'lpFileName String,初始化文件的名字。如没有指定一个完整路径名,windows就在Windows目录中查找文件

   
    lngRet = GetPrivateProfileString(strSection, strKey, "", strResult, Len(strResult), strINI)
    'strResult现在已经是返回的字串了,所以要进行截尾处理,chr(0)为空操作符,代表字符串的结束
    GetIniKey = Left(strResult, InStr(strResult, Chr(0)) - 1)

    Exit Function
errhandle:
    GetIniKey = ""

End Function


Public Property Let INIFileName(ByVal New_IniPath As String)

    ' Sets the new ini path
    strINI = New_IniPath

End Property

Public Property Get INIFileName() As String

    ' Returns the current ini path
    INIFileName = strINI

End Property


'-----------------------------
'功能:清除KeyWord"键"
'创建:2007/8/7
'更新:2007/8/7 9:19
'-----------------------------
Public Function DelIniKey(ByVal SectionName As String, ByVal KeyWord As String)

    Dim RetVal As Integer
    'RetVal = WritePrivateProfileString(SectionName, KeyWord, 0&, strINI)
    RetVal = WritePrivateProfileString(SectionName, KeyWord, vbNullString, strINI)

End Function


'如果是清除section就少写一个Key多一个""。
'-----------------------------
'功能:清除 Section"段"
'创建:2007/8/7
'更新:2007/8/7 9:19
'-----------------------------
Public Function DelIniSec(ByVal SectionName As String) '清除section

    Dim RetVal As Integer
    'RetVal = WritePrivateProfileString(SectionName, 0&, "", strINI)        '也可以实现
    RetVal = WritePrivateProfileString(SectionName, vbNullString, vbNullString, strINI)

End Function

2009-07-14 15:44
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
得分:15 
看看吧?

example_cIni.zip (3.64 KB) 例子?

2009-07-15 01:11



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




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

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