说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

求救?????????????

编辑:说三道四文库 发布时间:2017-10-19 08:58
HTML文档下载 WORD文档下载 PDF文档下载



     怎样在VB中学好,并怎样在VB中使用INI文件,还有注册表。
为了方便用户使用和使系统具有灵活性,大多数Win-dows应用程序将用户所做的选择以及各种变化的系统信息记录在初始化(INI)文件中。因此,当系统的环境发生变化时,可以直接修改INI文件,而无需修改程序。由此可见,INI文件对系统功能是至关重要的。本文将介绍采用VisualBasicforWindows(下称VB)开发Windows应用程序时如何读写INI文件。 

INI文件是文本文件,由若干部分(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,每个关键词会控制应用程序某个功能的工作方式,等号右边的值(value)指定关键词的操作方式。其一般形式如下:

[section1]
keyword1=valuel
keyword2=value2
……
[section2]
keyword1=value1
keyword2=value2
……


其中,如果等号右边无任何内容(即value为空),那就表示Windows应用程序已为该关键词指定了缺省值,如果在整个文件中找不到某个关键词(或整个一部分),那同样表示为它们指定了缺省值。各个部分所出现的顺序是无关紧要的,在每一个部分里,各个关键词的顺序同样也无关紧要。

读写INI文件通常有两种方式:一是在Windows中用“记事本”(Notepad)对其进行编辑,比较简单,无需赘述;二是由Windows应用程序读写INI文件,通常是应用程序运行时读取INI文件中的信息,退出应用程序时保存用户对运行环境的某些修改。

关键词的值的类型多为字符串或整数型,应分两种情况读写。为了使程序具有可维护性和可移植性,最好把对INI文件的读写封装在一个模块(RWINI.BAS)中,在RWI-NI.BAS中构造GetIniS和GetIniN函数以及SetIniS和Se-tIniN过程,在这些函数和过程中需要使用WindowsAPI的“GetPrivateprofileString”、“GetPrivateProfileInt”和“WritePrivateProfileString”函数。

RWINI.BAS模块的程序代码如下:

在General-Declearation部分中声明使用到的WindowsAPI函数:


DeclareFunctionGetprivateprofileStringLib“Ker-nel”(ByVallpAppNameAsString,
ByVallpKeyNameAsString,ByVallpDefaultAsString,ByVallpRetrm-StringAs
String,ByValcbReturnStringAsInteger,ByValFilenameAsString)AsInteger
DeclareFunctionGetPrivatePfileIntLib“Kernel”(ByVallpAppNameAsString,
ByVallpKeyNameAsString,ByVallpDefaultAsInteger,ByValFilenameAsString)As
Integer
DeclareFuncitonWritePrivateprofileStringLib“Kernel”(ByVallpApplicationName
AsString,ByVallpKeyNameAsString,ByVallpStringAsString,ByVallplFileName
AsString)AsInteger
FunctionGetIniS(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefString
AsString)AsString
DimResultStringAsString*144,TempAsInteger
DimsAsString,iAsInteger
Temp%=GetPrivateProfileString(SectionName,KeyWord,“”,ResultString,144,AppProfileName())
‘检索关键词的值
IfTemp%>0Then‘关键词的值不为空
s=“”
Fori=1To144
IfAsc(Mid$(ResultString,I,1))=0Then
ExitFor
Else
s=s&Mid$(ResultString,I,1)
EndIf
Next
Else
Temp%=WritePrivateProfilesString(sectionname,KeyWord,DefString,ppProfileName())
‘将缺省值写入INI文件
s=DefString
EndIf
GetIniS=s
EndFunction
FunctionGetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefValue
AsIneger)AsInteger
DimdAsLong,sAsString
d=DefValue
GetIniN=GetPrivateProfileInt(SectionName,
KeyWord,DefValue,ppProfileName())
Ifd<>DefValueThen
s=“”&d
d=WritePrivateProfileString(SectionName,
KeyWord,s,AppProfileName())
EndIf
EndFunction
SubSetIniS(ByValSectionNameAsString,BtVaKeyWordAsString,ByValValStr
AsString)
Dimres%
res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName())
EndSub
SubSetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValValInt
AsInteger)
Dimres%,s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName())
EndSub

SectionName为每一部分的标题,KeyWord为关键词,GetIniS和GetIniN中的DefValue为关键词的缺省值,SetIniS和SetIniN的ValStr和ValInt为要写入INI文件的关键词的值。为了能更好地说明如何使用以上函数和过程,下面举两个实例。

实例1:

开发应用程序通常要使用数据库和其它一些文件,这些文件的目录(包括路径和文件名)不应在程序中固定,而是保存在INI文件中,程序运行时由INI文件中读入。读入数据库文件的代码如下:


DimDatabasenameAsString
Databasename=GetIniS(“数据库”,“职工”,“”)
IfDatabaseName=“”ThenDatabaseName=InputBox(“请输入数据库《职工》的目录”),
App.Title)’也可通过“文件对话框”进行选择
OnErrorResumeNext
Setdb=OpenDatabas(DatabaseName)
IfErr<>0Then
MsgBox“打开数据库失败!”,MB-
ICONSTOP,App.Title:GotoErrorProcessing
Else
SetIniS“数据库”,“职工”,DatabaseName
EndIf
OnErrorGoTo0
……


实例2:

为了方便用户操作,有时需要保存用户界面的某些信息,例如窗口的高度和宽度等。装载窗体时,从INI文件中读入窗体高度和宽度,卸载窗体时将窗体当前高度和宽度存入INI文件,代码如下:


Sub Form1_Load()
……
Forml.Height=GetIniN(“窗体1”,“高度”,6000)
Form1.Width=GetIniN(“窗体1”,“高度”,4500)
EndSub
……
Sub Form1_Unload()
……
SetIniN“窗体1”,“高度”,Me.Height
SetIniN“窗体1,”宽度“,Me.Width
……
End Sub 


 
还是问详细点吧!这个问题太大了:)
ini文件操作

Public 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
Public Declare Function GetPrivateProfileInt Lib "kernel32" _
      Alias "GetPrivateProfileIntA" _
      (ByVal lpApplicationName As String, ByVal lpKeyName As String, _
      ByVal nDefault As Long, ByVal lpFileName As String) As Long
Public 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
在VB中使用INI文件 注册表,要用api函数
Form_Load中:
    strServerName = GetIni("Options", "SERVER", strTemp)
    strPWD = GetIni("Options", "PWD", strTemp)

函数:
Public Function GetIni(lpSection As String, lpEntry As String, lpFilename As String) As String
'获得指定INI文件中项目的字符串
    On Error GoTo GetIni_Err:

    Const BUFSIZE = 255
    Dim lpDefault As String, S As String
    Dim GotInfo  As Integer, L As Long
    Dim lpReturnVal As String * 255

    lpDefault = ""
    GotInfo = GetPrivateProfileString(lpSection, ByVal lpEntry, lpDefault, lpReturnVal, BUFSIZE, lpFilename)
    S = lpReturnVal
    L = Len(S)
    Do While Asc(Right$(S, 1)) = 0 And L > 0
        S = Left$(S, L)
        L = L - 1
    Loop
    GetIni = S


API函数:
Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer, ByVal lpFilename As String) As Integer

为了方便用户使用和使系统具有灵活性,大多数Win-dows应用程序将用户所做的选择以及各种变化的系统信息记录在初始化(INI)文件中。因此,当系统的环境发生变化时,可以直接修改INI文件,而无需修改程序。由此可见,INI文件对系统功能是至关重要的。本文将介绍采用VisualBasicforWindows(下称VB)开发Windows应用程序时如何读写INI文件。 

INI文件是文本文件,由若干部分(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,每个关键词会控制应用程序某个功能的工作方式,等号右边的值(value)指定关键词的操作方式。其一般形式如下:

[section1]
keyword1=valuel
keyword2=value2
……
[section2]
keyword1=value1
keyword2=value2
……


其中,如果等号右边无任何内容(即value为空),那就表示Windows应用程序已为该关键词指定了缺省值,如果在整个文件中找不到某个关键词(或整个一部分),那同样表示为它们指定了缺省值。各个部分所出现的顺序是无关紧要的,在每一个部分里,各个关键词的顺序同样也无关紧要。

读写INI文件通常有两种方式:一是在Windows中用“记事本”(Notepad)对其进行编辑,比较简单,无需赘述;二是由Windows应用程序读写INI文件,通常是应用程序运行时读取INI文件中的信息,退出应用程序时保存用户对运行环境的某些修改。

关键词的值的类型多为字符串或整数型,应分两种情况读写。为了使程序具有可维护性和可移植性,最好把对INI文件的读写封装在一个模块(RWINI.BAS)中,在RWI-NI.BAS中构造GetIniS和GetIniN函数以及SetIniS和Se-tIniN过程,在这些函数和过程中需要使用WindowsAPI的“GetPrivateprofileString”、“GetPrivateProfileInt”和“WritePrivateProfileString”函数。

RWINI.BAS模块的程序代码如下:

在General-Declearation部分中声明使用到的WindowsAPI函数:


DeclareFunctionGetprivateprofileStringLib“Ker-nel”(ByVallpAppNameAsString,
ByVallpKeyNameAsString,ByVallpDefaultAsString,ByVallpRetrm-StringAs
String,ByValcbReturnStringAsInteger,ByValFilenameAsString)AsInteger
DeclareFunctionGetPrivatePfileIntLib“Kernel”(ByVallpAppNameAsString,
ByVallpKeyNameAsString,ByVallpDefaultAsInteger,ByValFilenameAsString)As
Integer
DeclareFuncitonWritePrivateprofileStringLib“Kernel”(ByVallpApplicationName
AsString,ByVallpKeyNameAsString,ByVallpStringAsString,ByVallplFileName
AsString)AsInteger
FunctionGetIniS(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefString
AsString)AsString
DimResultStringAsString*144,TempAsInteger
DimsAsString,iAsInteger
Temp%=GetPrivateProfileString(SectionName,KeyWord,“”,ResultString,144,AppProfileName())
‘检索关键词的值
IfTemp%>0Then‘关键词的值不为空
s=“”
Fori=1To144
IfAsc(Mid$(ResultString,I,1))=0Then
ExitFor
Else
s=s&Mid$(ResultString,I,1)
EndIf
Next
Else
Temp%=WritePrivateProfilesString(sectionname,KeyWord,DefString,ppProfileName())
‘将缺省值写入INI文件
s=DefString
EndIf
GetIniS=s
EndFunction
FunctionGetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValDefValue
AsIneger)AsInteger
DimdAsLong,sAsString
d=DefValue
GetIniN=GetPrivateProfileInt(SectionName,
KeyWord,DefValue,ppProfileName())
Ifd<>DefValueThen
s=“”&d
d=WritePrivateProfileString(SectionName,
KeyWord,s,AppProfileName())
EndIf
EndFunction
SubSetIniS(ByValSectionNameAsString,BtVaKeyWordAsString,ByValValStr
AsString)
Dimres%
res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName())
EndSub
SubSetIniN(ByValSectionNameAsString,ByValKeyWordAsString,ByValValInt
AsInteger)
Dimres%,s$
s$=Str$(ValInt)
res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName())
EndSub

SectionName为每一部分的标题,KeyWord为关键词,GetIniS和GetIniN中的DefValue为关键词的缺省值,SetIniS和SetIniN的ValStr和ValInt为要写入INI文件的关键词的值。为了能更好地说明如何使用以上函数和过程,下面举两个实例。

实例1:

开发应用程序通常要使用数据库和其它一些文件,这些文件的目录(包括路径和文件名)不应在程序中固定,而是保存在INI文件中,程序运行时由INI文件中读入。读入数据库文件的代码如下:


DimDatabasenameAsString
Databasename=GetIniS(“数据库”,“职工”,“”)
IfDatabaseName=“”ThenDatabaseName=InputBox(“请输入数据库《职工》的目录”),
App.Title)’也可通过“文件对话框”进行选择
OnErrorResumeNext
Setdb=OpenDatabas(DatabaseName)
IfErr<>0Then
MsgBox“打开数据库失败!”,MB-
ICONSTOP,App.Title:GotoErrorProcessing
Else
SetIniS“数据库”,“职工”,DatabaseName
EndIf
OnErrorGoTo0
……


实例2:

为了方便用户操作,有时需要保存用户界面的某些信息,例如窗口的高度和宽度等。装载窗体时,从INI文件中读入窗体高度和宽度,卸载窗体时将窗体当前高度和宽度存入INI文件,代码如下:


Sub Form1_Load()
……
Forml.Height=GetIniN(“窗体1”,“高度”,6000)
Form1.Width=GetIniN(“窗体1”,“高度”,4500)
EndSub
……
Sub Form1_Unload()
……
SetIniN“窗体1”,“高度”,Me.Height
SetIniN“窗体1,”宽度“,Me.Width
……
End Sub 


 
存取Registry必须先指明Key.Key在Regedit.exe中看到的是一长串的字符串,例如: "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows",
但在Windows内部,每个Key都对应一个Key Handle(等于一个长整数值,程序中通常以hKey表示),Windows之所以要用hkey来代表Key是为了让Registry的存取更有效率,因为整数的操作功能优于字符串,所以我们的首要任务就是取得Key的Key Handle(hKey)

取得最上层的hKey 
首先是位于最上层的Key,这些Key的hKey是固定不变的,其值如下表所示。

Key hKey(Key Handle) 
HKEY_CLASSES_ROOT &H80000000 
HKEY_CURRENT_USER &H80000001 
HKEY_LOCAL_MACHINE &H80000002 
HKEY_USERS &H80000003 
HKEY_CURRENT_CONFIG &H80000005 
HKEY_DYN_DATA &H80000006 

如果想取得上述几个Key的SubKey Handle,可以调用RegOpenKey这个API函数。其详细描述如下:

VB声明 Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" 
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 
参数类型及说明:
hKey:Key Handle
lpSubKey:SubKey名称或路径
phkResult:若RegOpenKey执行成功,则这一参数返回Subkey的hKey.

返回值: =0,表示成功;≠0,表示失败。[注意这一点与别的API函数不太一样]

调用例:
Dim ret As Long, hKey As Long, hKey2 As Long 
'取得"HKEY_LOCAL_MACHINE"底下的"SOFTWARE\Microsoft"这个SubKey Handle.
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey) 
If ret = 0 Then 'If Success
MsgBox "HKLM\SOFTWARE\Microsoft = " & hKey 
End If 

'继续以刚才所取得的"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft"hKey为参数,再取得它的'SubKey"Windows\CurrentVersion"的handle。

ret = RegOpenKey(hKey, "Windows\CurrentVersion", hKey2) 
If ret = 0 Then 
MsgBox "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion = " & hKey2 
End If

相关的两个API函数是:RegCreateKey[建立SubKey]和RegClose[关闭SubKey]
详细说明:
RegCreateKey函数:
VB声明 Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" 
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
它的参数用法与RegOpenKey一样。所不同的是RegOpenKey只能打开已经有的SubKey,而RegCreateKey则可以建立SubKey,比较特别的是,如果调用RegCreateKey所建立的SubKey是一个已经存在的SubKey,则它的功能和RegOpenKey相同。由于RegCreateKey的这种特性,有的程序员干脆不用RegOpenKey,而用RegCreateKey来统一代替RegOpenKey。
RegClose函数:
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 
当我们不再存取Registry时,将打开或建立的SubKey关闭是一个比较好的习惯,就正如我们在使用C语言的文件打开函数后必须要关闭一样。

一个完整的例子:

Option Explicit 
Public Const HKEY_CLASSES_ROOT = &H80000000 
Public Const HKEY_CURRENT_USER = &H80000001 
Public Const HKEY_LOCAL_MACHINE = &H80000002 
Public Const HKEY_USERS = &H80000003 
Public Const HKEY_PERFORMANCE_DATA = &H80000004 
Public Const HKEY_CURRENT_CONFIG = &H80000005 
Public Const HKEY_DYN_DATA = &H80000006 

Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" 
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long 

Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long 

Sub Main() 
Dim ret As Long, hKey As Long, hKey2 As Long 
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft", hKey) 
If ret = 0 Then 
MsgBox "HKLM\SOFTWARE\Microsoft = " & hKey 
End If 

ret = RegOpenKey(hKey, "Windows\CurrentVersion", hKey2) 
If ret = 0 Then 
MsgBox "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion = " & hKey2 
End If 


'Use RegCreateKey function to create subkey "HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt"
ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
If Not ret Then 
MsgBox "Create HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt SubKey Success" 
Else
MsgBox "Create Subkey Operation Fail" 
End If 

RegCloseKey hKey 
RegCloseKey hKey2 
End Sub

  

再罗嗦一句,上面的函数声明在vb中必须写在一行内.

    VB中如何实现注册表的读写 
 
  

---- “API”中专门提供了处理注册表的函数,不用说也知道,它们肯定功能强大(因为它们是API),但是它们的难度也是不小的。如果你是一个入门者的话,这大概会令你头痛一阵子。不过VB本身还提供了几个函数,专门用来处理注册表,相对来说它们就简单多了,所以我只对它们做一下说明: 

SaveSetting appname, section, key, value
---- 这句话的作用是将应用程序的信息存入注册表中。其中四个参数都是必要的,其含义分别为:应用程序名,区段,键,值。比如我们要为我们的程序(名为“测试”)的主窗体的位置进行存储,就可以写成: 

SaveSetting “测试”,”main”,”
    top”,frmMain.Top
SaveSetting “测试”,”main”,”
    Left”,frmMain.Left
SaveSetting “测试”,”main”,”
    Width”,frmMain.Width
SaveSetting “测试”,”main”,”
    Height”,frmMain.Height
---- 这样,就把当前的主窗体的位置进行了记录,在下次打开这个窗体的时候,我们就可以在把这些值取出来。那么如何才能把我们所存储的值取出来呢?这就要用到另一个函数:GetSetting,它的语法是: 

GetSetting(appname, section, key[, default])
---- 该函数的各部分的意义均和上面的函数的意义相同,所不同的是多了一个default而少了一个value。这个函数最后返回的结果即value值,而default指的是如果所指定的键不存在时,则以default指定的值为返回结果。如果没指定default,则default的默认值是””,即0长度的字符串。接上例,在程序刚开始的时候,我们应该取出上一次所存储的主窗体的位置,可以写成: 

frmMain.Top = GetSetting
    (“测试”,”main”,”top”)
frmMain.Left = GetSetting
    (“测试”,”main”,”Left”)
frmMain.Height = GetSetting
   (“测试”,”main”,”Height”)
frmMain.Width = GetSetting
    (“测试”,”main”,”Width”)
---- 好了,到此为止,可以暂且告一段落,让我们打开注册表,看一看我们把信息是记录在什么地方了。按照下面的路径打开: HKEY_CURRENT_USER\Software\VB And VBA Program Settings 你会看到你的“测试”就在里边放着。 

---- 当你的应用程序最终被卸载时,你应该考虑(而且你应该这样做)把你写入注册表中的内容清除掉,因为离开了你的应用程序,它们无疑就是一推垃圾而已。要想将它们删掉,我们可以用函数:DeleteSetting,它的语法如下:DeleteSetting appname, [section[, key]] 在几个参数中,只有appname是必须地,其它两项均可选。比如我们要删除窗体的“高”这键,则可以写成:DeleteSetting “测试”,”main”,”Height”如果我们要将”main”这个段整个去掉,则可以写成DeleteSetting “测试”,”main” 如果我们再彻底一些,想将整个应用程序去掉的话,就干脆直接写成: 

DeleteSetting  “测试”
---- 这种方法的不足之处是只能把信息记录在指定的位置,即 

HKEY_CURRENT_USER\Software\VB
    And VBA Program Settings
---- 如果要写入到别的地方,就要借助于API了。 

 
   
 
  
 

    VB修改注册表一特例
 
 

我们知道,在VB中调用Windows的API函数能比较方便的修改系统注目表,然而笔者近来在一次应用中偶然发现这样一个特殊的问题:若在注目表HKEY_LOCAL_MACHINE\Mircrosoft\Windows \CurrentVersion\Setup下有一双字节型串值SetupOnce为"0x7cf70b"现要通过VB把其改为"0xffffffff"(十进制为4294967295)。是不是直接定义长整型变量Updata,并赋值Updata=4294967295,然后调用API函数RegSetValueEx
("HKEY_LOCAL_MACHINE", "Software\Mircrosoft \Windows\CurrentVersion\Setup","SetupOnce",0,4,Updata,4)就能达到目的呢?实际非也!这样操作,将会出错,出错报告为"实时错误6,溢出"。问题出在那里呢?笔者经过思考,发现十六进制0xffffffff化为十进制4294967295共十位数,显然把变量Updata在定义为长整型时存在错误。知道了问题所在,我们把Updata变量重新定义为双精度型,接下来的问题是Updata到底应赋予何值?我们可以采用反推法,即先在注册表中先令SetupOnce为"0xffffffff",在VB中定义变量Updata(double型),调用API中注册表查询库函数RegQueryValueEx("HKEY_LOCAL_MACHINE","Software\Mircrosoft\Windows \CurrentVersion \Setup","SetupOnce",0,4,Updata,4)在VB中一调试,结果出来了,Up!data的值为2.12199579047121E-314(这个数字真有点吓人)。知道了Updata的取值我们就可以用RegSetValueEx函数修改原来
SetupOnce的值了。下面给出以上所述过程的一个例程,希望对您有所启发。
  新建一工程,在此工程声明段声明常量及API库函数:
PrivateDeclareFunction RegCloseKey Lib "advapi32.dll" (ByVal hKey AsLong)As Long
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey AsString, ByVal ulOptions As Long, ByVal samDesired As Long,phkresult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long,ByVal lpValueNameAs String, ByVal lpReserved As Long,lpType As Long, lpDataAs Any, lpcbData As Long) As Long

'Note that if you declarethe lpData parameter as String, youmust pass it By Value.

Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long,lpDataAs Any, ByVal cbData As Long) As Long

'Note that ifyou declarethe lpData parameter as String, you must pass itBy Value.

Const HKEY_LOCAL_MACHINE = &H80000002 Const REG_DWORD =4 Const ERROR_SUCCESS = 0& Const KEY_ALL_ACCESS = &H3F ConstA = 2.12199579047121E-314 Const reg1 = "software \microsoft\windows \currentversion\setup"Public phkresult As Long

在Form的Click事件中添加以下代码:
Private Sub Form_Click() Dim back As Long Dim Updata As Double back = RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg1, 0&,KEY_ALL_ACCESS,phkresult) back = RegQueryValueEx(phkresult,"SetupOnce", 0,REG_DWORD, Updata, 4)

'如果要用RegQueryValueEx()读出某一值,函数调用前必须以KEY_QUERY_VALUE参数形式打开,实例中以KEY_ALL_ACCESS参数打开,实际上已包含了KEY_QUERY_VALUE。

If back = ERROR_SUCCESS Then If Updata <> A Then Updata = A back = RegSetValueEx (phkresult, "SetupOnce", 0&,REG_DWORD,Updata, 4) If back = ERROR_SUCCESS Then
MsgBox "标记成功!"Else MsgBox "标记不成功!"
Exit Sub
End If
Else MsgBox "要标记的项已是所需" RegCloseKey(phkresult)
Exit Sub
End If
Else Msgbox "注册表中无所需修改的项" End If RegCloseKey(phkresult)
End Sub
其实,以上例程完全可以用做加密技术。国内某个带"霸"字的软件亦采用了类似的加密技术,当然,只是在加密的表现结果上表现而已。 


 
   
 
  
 
建立与读取.ini文件 
 
 

  '请於form中放3个TextBox,一个CommandBox
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 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 Sub Command1_Click()
Dim success As Long
success = WritePrivateProfileString("MyApp", "text1", Text1.Text, "c:\aa.ini")
'叁数一 Section Name
'叁数二 於.ini中的项目
'叁数三 项目的内容
'叁数四 .ini文件的名称
success = WritePrivateProfileString("MyApp", "text2", Text2.Text, "c:\aa.ini")
success = WritePrivateProfileString("MyApp2", "text3", Text3.Text, "c:\aa.ini")
End Sub

Private Sub Form_load()
Dim ret As Long
Dim buff As String
buff = String(255, 0)
ret = GetPrivateProfileString("Myapp", "text1", "text1", buff, 256, "c:\aa.ini")
'若.ini MyApp中无text1,则采用叁数三的值
Text1.Text = buff
buff = String(255, 0)
ret = GetPrivateProfileString("Myapp", "text2", "text2", buff, 256, "c:\aa.ini")
Text2.Text = buff
buff = String(255, 0)
ret = GetPrivateProfileString("Myapp2", "text3", "text3", buff, 256, "c:\aa.ini")
Text3.Text = buff
End Sub
先记下,留以后用
Google收购Firebase 帮助程序员快速开发出移动App和Web App 微信支付开发关键点技术解析 游戏任玩!开源虚拟现实头戴式设备Open DoVision MDCC大会召开倒数10天 看Twitter、Facebook和国内“BAT”三大巨头最新动态 《近匠》Wijmo 5 CTO:从Web到移动,我的25年编程生涯 重复充电、防丢失!多功能智能行李箱Bluesmart 【设计经验传承】图标设计初阶要先型 “光年”光纤路由 支持千兆网络的家居中心 MDCC 2014移动开发技术与平台峰会:知名应用技术大牛传授实战经验 Unity生态圈将变?EA前总裁接替创始人任新CEO 第九届中国Linux内核开发者大会在京举办 《近匠》爱拍SDK:手游录像分享 爱拍才会赢 Mark走起!iOS开发最常用的第三方库 【CTO俱乐部读书会】《人件》译者肖然:软件工程是社会学 错过就要等一年 深圳微信开发者大会不容错过的十大理由 【干货】国外程序员整理的 C++ 资源大全 一周消息树:被投资人“送”入看守所,创业人汪洁有罪还是无罪? 聚焦五大主题 Atlassian Summit 2014精华PPT下载 2014中国移动开发者大调查第四期获奖名单曝光 【问底】许鹏:使用Spark+Cassandra打造高性能数据分析平台(一) 【特惠倒计时两天】参加深圳微信开发者大会赠书及全套讲师讲义 《英雄联盟》支撑最高750万同时在线用户的聊天服务打造 深圳云软技术副总黄榕振:招行信用卡微信公众号开发高级篇 来自未来的你,MDCC 2014新奇智能硬件揭秘 Twitter开源云环境时间序列数据断层检测工具BreakoutDetection 浅析Facebook软件架构:Tao和BLOB的实现原理 【图文实录】CTO俱乐部:走近Keen Team,走近智能设备Hack 2014聚合开发者大会(JDDC)在京召开 专访腾讯反病毒实验室:揭秘TAV引擎,哈勃分析系统两大利器 Cocos Studio v2.0 Beta0正式发布!多维升级,合三为一 环信即时通讯云获3000万融资 用于研发运维 考CCNA的朋友可以进来看看! oracle 8.1.7安装界面的中文无法显示,请各位帮忙! 谁有上传图片及上传信息连在一块的程序,重谢,急! 请问PPT格式的文件用什么阅读~? 谢谢 Excel的密码忘了怎么办???? 哪里有samba下载,要可以在RedHat7.2上安装的 about站点连接问题 一动鼠标,程序死掉,这是怎么回事 (转贴)有关中国J-XX的准确信息全文翻译 #100分#,关于将汉字转为语音? 如何获取NAT转换表 急急急急急急急急急急急急急急急急急 websnap如何控制数据表或查询的打开或关闭 索求中英译文,毕业论文急用! 哪里有samba下载,要可以在RedHat7.2上安装的 请教 ? 关于ado连接的问题。。。急啊~~~ Datalist里的Lebel怎样动态改变Text的值? Windows98底下的UNIX仿真软件 紧急求助(调用winrar的dll或ocx的问题?)!!!!!!!] 再回首 象jbuilder那样的集成开发环境中,对可视话控件的托拽式(所见即所得)的操作是如何做的 关于WSAD开发工具(up有分) 我是flash超级菜鸟 一个api的问题,急急急,在线等待。完成后即给分。关于api继承宏的问题。 求你们了,给非处一条活路吧…… 郁闷! 语句性能分析的问题,请教高手! 有没有人装过微软的petstore?我安装的时候遇到安全性错误 *****伊茗的问题:如何让程序运行时先显示的是Form2而不是Form1 如何保存控件里的内容? 怎样生成随机数 谁有<<数据库系统开发实例导航—vb6>>电子版 有没有替代DATAGRID控件的表格控件? 动态改变iframe的src值和大小,如何做? 显示器图像抖晃,请各位大侠帮忙! 请用实例说明this怎么用。。。。谢谢。。。 vb开发的程序怎样用 Setup Factory 6.0 打包(给出具体的步骤)20分 fragroute之浅显研究(1) 紧急求助!(文本文档在网页中的对齐) 求救:请问网上发传真可以省掉恐怖的传真费吗? 急急急急急急急急急急急急急!!!!!! 关于VC中使用ADO进行事务处理BeginTrans()的问题,很奇怪。(内有代码,非常疑惑!求助) 电影快下呀 请问如何将文件删除到回收站? 傻傻猫是男的女的?长得怎样啊? fragroute之浅显研究(2) 如何做成下面图示的样子呢? 请问如何让UDP的SOCKET监听? win2000 Teminal 注册表里面的内容怎么更改之后重新启动又恢复原样了???? 英语统考练习题All flights __ because of the snowstorm,we could do nothing but __ the train.A.had been cancelled/to take B.have been cancelled/take C.were cancelled/to take D.having been cancelled/take 英语翻译不要任何用翻译机搞出来的!这个是ROOT教程,求英语厉害的大神翻译一下里面的操作步骤!跪谢! 灰色人生的灰色是什么意思 有关机械能的选择题质量不同的两物体从同一高度同时自由下落(不计空气阻力),以地面为参考平面,则落地前( )A.同一时刻,质量大者动能一定大 B.同一时刻,质量大者重力势能一定大C.同 电气图中WLM是什么意思? 我国为什么要坚持劳动者自主择业市场调理就业政府促进就业的方针 有一变质的na2so3样品 经测定还含有盐酸300ml,产生的气体经干燥后体积为2464ml(标准状况)试求na2so3的质量分数 请将intel celeron willamette processor翻译成中文 怎么计算的. 如图1-49所示,在方向水平的匀强电场中,一不可伸长的不导电细线的一端连着一个质量为m,带电量为q小球,另一端固定于O点,把小球拉起直至细线与场强平行,然后无初速由A点释放,已知细线转过6 翻成中文怎么翻 填写修饰语(珍珠鸟、斑羚、华南虎的噢~!)珍珠鸟:( )的小红嘴 ( )的绒毛 斑羚: ( )的毛色 ( )的角 ( )的长腿 ( )的跳跃技艺 华南虎:( )的面孔 ( )的眼睛 ( )的尾 人喝的水导电的好,是不导电好 草木皆兵和风声鹤唳两个成语的来历 、 英语翻译When a set of results has a range that is greater than the random uncertainty in the readings,then the error can be estimated to be ± half the spread of the averaged values.This value will take the place of the random uncertainty of the "卤"字拼音是什么? 怎么证明三角形外接圆圆心到三个顶点距离和最短 列出具体计算步骤 卤字粤语怎么读.最好是有谐音,比如说跟某某字读音一样! 英文商标名叫folding,中文名叫什么好?音译 消防电图纸里面的-T-跟-B-分别都是什么啊消防电的图纸里面有图标 -T- 和 -B- 这两个分别都是什么啊 正三角形的外接圆圆心为o,半径为R,求△ABc的边长,周长p,边心距r,面际s 为什么选D不选B呢, 求解释、大一高数.新生 我去年买了了表, 初四题 填空 边长为a的三角形外接圆半径( ),圆心到边的距离为( ). 大一的高等数学都学哪些内容?比如我大一学一年高数,是不是不进反退啊.是学一年高数后回过头考高中数学会怎样。 关于物理电势的问题 高二奥赛如下图.边长为a的正方形由四根均匀带电但彼此绝缘的带电棒构成.若他们在正方形中心O点产生的电势为U1,在P点(P点与O点关于CD对称)产生的电势为U2.若撤去AB, 2,输入5个不同的单词,将其存放在二维字符数组中,每行存放一个单词.利用选择法按字典顺序对英文单词进行排序,最后输出结果. 红嘴小鸟 (现有一个物体置于匀强电场中),匀强电场方向水平向左,带正电的物体沿绝缘的水平版向右做匀变速运动,经A点时,动能为100J,到B点时动能减少了80J,电势能增加了48J.当物体再次回到A点时动 C语言以下这题选什么?为什么?设函数fun的定义形式为void fun(char ch,float x) { … }则以下对函数fun 的调用语句中,正确的是( ).A)fun("abc",3.0); B)t=fun(‘D’,16.5); C)fun(‘65’,2.8); D)fun(32,32); 有谁知道“我歪腻你”是什么意思 重点解释“歪腻”的意思.急. 德语 Was kostet das Paket schicken nach C德语 Was kostet das Paket schicken nach China?这么说对吗? 各位英语达人,小弟遇到一个句子,百思而不得其解,望各位帮忙翻译并分析句子结构The trickled ethylene gas process of tomato ripening consists of exposing the tomatoes to a low concentration of ethylene gas under controlled 母珍珠鸟啄公珍珠鸟的毛 知恩图报饮水思源是什么生肖 请计算机C语言高手帮我解答以下三个题目,1.若变量i和j已经定义为int类型,则以下程序段中内循环体的总的执行次数是( A ).for (i=5;i;i--)for(j=0;j 珍珠鸟掉毛了5根毛怎么办? 如何让太阳从西边升起? 生为名臣,死为上鬼,垂光百世,照耀简策,斯为美也 的翻译是什么 求10则历史小故事加强爱国主义教育:预习八下历史书,搜集有关这一时期的历史小故事10则(如:鸦片战争时期,抗日战争时期) 求X的演算过程越详细越好,麻烦用草稿纸写出来让我看看 英语翻译 这道题隐函数求导怎么写?画红线的这一步怎么出来的? 假设牙膏是一个长为15厘米长的圆柱体,它的开口直径为0.6厘米.一个人一天用两次牙膏,一次挤出1厘米长,这支牙膏能用多少天? 求:文言文翻译 松之生也,于岩之侧.流俗不顾……谅可用而不用,固斯焉而取斯 珍珠鸟像涂了蜡的小嘴,啄我的笔尖这句话用什么修辞方法 家蚕为什么是节肢动物?说明理由就行了,以生物学的角度. 你喜欢干什么的翻译求大神帮助 冷眼看缤纷世界,热心度灰色人生是什么意思?冷眼看缤纷世界,热心度灰色人生,横眉对趋炎附势,从容应云卷云舒全局是什么意思 请问rain是什么意思啊,在书上看到的! 《上个星期在干什么》英语和翻译大神们帮帮忙 “这样,它完全放心了,索性用那涂了蜡似的小红嘴,‘嗒嗒’啄着我颤动的笔尖”的这样指的是什么我从这句话中体会到什么 有太阳从西边升起的地方吗?有没有太阳从西边升起的地方?为什么? 向量a的模=1,向量b的模=1.<a,b>=120'.计算向量2a-b在向量a+b方向上的投影.([a]表示向量a的模;a*b表示向量a和向量b的积…) “这样,它完全放心了,索性用那涂了蜡似的小红嘴,‘嗒嗒’啄着我颤动的笔尖”.我从这句话体会到什么? 类似于天行有常,不为尧存不为桀亡的句子 英语翻译 它索用那涂了蜡似的小红嘴,”嗒嗒”啄着我颤动的笔尖.(这是比喻句)用“v"或”x”回答. 叙武装分子发表在叙被劫持的俄罗斯工程今日言论:\"梅德韦杰夫亲切实在幽默美13岁男孩手持仿真枪向警察展示 被潘基文敦促莫桑比克冲突双方通过对话解评论:沙特不收联合国“大礼”有人欢喜男子劳动合同被“单方解约” 半年三上台“立法院”空转一个月 民进党扯了谁报告称朝鲜核试验场挖新坑道 短期内不奥巴马称阿富汗战后方案有助长期保护巴江苏常熟美女老板获死缓 自辩称轻信了南京雨污分流工程因季建业下台或被叫停江苏13市9月空气质量排名 盐城最优同济大学自主研发地铁安全控制系统江苏常熟美女老板获死缓 自辩称轻信了广东湛江城管执法男店主被断11根肋骨总决赛-小威8连胜A-拉德 阿扎爆冷恒大派最强阵出征韩国 穆里奇无碍仍可慈溪再推300套经适房 六大人群符合泰森自传揭咬耳事件真相:他明显地用头NBA总决赛修改赛制 由2-3-2变林丹计划明年2月份再战 提升排名为里自贸区金融举措“路线图”“时间表” 上海从战略高度重视知识产权工作临澧“摆胜利姿势与访民合影”人员被停年历贺卡往年一车车拖,今年一张张卖中国战略导弹部队列装多套新防护服适应盘点80年代赴对越作战前线慰问的演艺我省妇女患重大疾病有望获救助压路机掉落碎片崩公交 造成津滨大道堵温格:枪手不需要帕托莫拉塔 曼联争英西宁城北区采取有效措施积极平抑物价保柴达木监狱开展对前段工作自我评估和验“富硒牧歌”唱响平安山川城北区政法委综治办对火车西站周边进行探月最终目标是建立永久驻人基地 月北中国福利彩票“双色球”2013年中大\"安徽风采\"电脑福利彩票乐透型2中国福利彩票\"乐透型15选5\"玩农交会成交额达806亿元 比上届增加两性养生:避孕药10大妙用不可不知养生:冬季老人饮食不能忽视两规则广西全面清查“占编制、不上班、吃空饷
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘