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

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

编辑:说三道四文库 发布时间:2017-12-18 07:34
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
先记下,留以后用
最简单的C语言顺序程序设计-C语言教程 分支结构程序-C语言教程 循环控制-C语言教程 数值数组-C语言教程 字符数组-C语言教程 函数(上)-C语言教程 函数(下)-C语言教程 预处理命令-C语言教程 C语言指针(上)-C语言教程 C语言指针(下)-C语言教程 结构体与共用体-C语言教程 位运算-C语言教程 文件处理-C语言教程 谭浩强C语言教程 C语言创建链表并实现插入、删除数据 C语言中队列Queue的操作 C语言实现堆栈stack操作 C语言建立和遍历二叉树 C语言冒泡排序法演示代码 C语言实现堆排序(Heap Sort) jQuery Ajax以JSON格式传递结果数据 微软称为WP8开发的应用不兼容WP7手机 WP8开发者必读 关于WP8开发者程序开发语言选择倾向的问题 强大的C#随机字符串生成器 C#上传文件到WEB服务器 WebClient的超时设置 MySQL备份脚本大全 c#对rar或zip文件进行压缩解压缩 c#采用递归非递归两种方式遍历目录下所有文件 使用DataContractJsonSerializer进行JSON序列化的JSONHelper类 鼠标钩子的小问题 ▲▲▲▲▲高分求网址!!!▲▲▲▲▲ 像Word一样的功能 CSDN的好兄弟们,求助!!!选择点击DATAGRID中的行改变Image图片的问题。 请问如何通过asp将excel表格的内容导入到oracle数据库中。100分送上,谢谢。 大家来看看这两个病毒呢w32.Randex和Backdoor.Roxy!!! 下拉菜单出错???(在线等候!--) 怎样在启动98时不让计划任务不启动? 谁偷了张飞的羽扇?(zt) C#树操作 想在客户端页面控制扫描仪,并将图象上传到服务器,up有分。 到出Excel表 打开foxpro文件时需要找索引文件,如何取消这种情况? ????????????????????csdn你凭什么改我的E-mail?????????????????? 来看看 请教回溯问题(N皇后) 紧急求救,在数据库中取已存的图片问题 请问怎么安装mysql的驱动程序和mysql++? 重分求解技术难题的解决方案 给定窗体的句柄,如何知道该窗体是否有状态栏? 请教VirtualAlloc和new的区别何在?有什么优点? 如何抓取视频流的图象!!!! WEB页怎样实现子父窗口? [总版主的立法和执法]:4、被网友投诉的处理不当的删帖、删回复三次或封杀一次,但制度中没有依据的 重分求解技术难题的解决方案 如何从代码中控制报表分页 高分请求一个怪问题, 关于C#中调用API 小弟写的一个动态生成JTree的例子, 大家帮忙看看. JDK环境变量的设置,实在难懂!!!搞定立刻给分!!在线等待 请问:用C#中的“System.Web.HttpUtility.UrlEncode(string)”编码后的字符串,在JScript用什么函数能对其进行解码?(在线) 一个权限的问题!!!急!!! 这个CG提示如何解决? 邮件群发软件哪个最好? 热键然后更改 换工作了,散分!!! 大家来看看[CSDN总版主的立法和执法],就会知道为什么水园的执法者如此猖狂了 请用这则给下面这个替换字符 局域网2000系统如何设置计算机描述(50分)? 强答题:请听好题"请问如何在可编辑的列表框中显示你想输入的字符串,而且可以输入多行?",开始! 下面两个操作,哪种效率高一些?或者还有什么更好的方法,谢谢! 简单问题,马上结账 ^在Delphi中是什么操作符? 各们兄台,小弟有急事相求,在线等~~~~~~~~~~~~~~~~~ 关于新闻发布时内容显示的问题 请教Tab Control的使用 microsoft jdbc for sqlserver2000 result 如何将指针移到首位!!在线等急!!! 谁有CVS下载?我去官方网站的下载,根本没有安装文件。 JSP中新建文件夹的问题 关于地图的问题,谁能解决啊? 怎样获取点击或按下winform上 [×]按钮时的事件 在服务器端执行一个 在客户端弹出对话框的程序? 社会实践证明有什么实际用处 触角向价值链的两端延伸是什么意思我看赢在中国时,宋文明说的这句话我听不懂. 三年级第6课触角这个词语是什么意思? 帮忙英译中,是能看得懂No jollity, no joking as usually went on, and whenever points were pressed and we seemed to be at a point of suggesting that our patience was running thin,they either made a concession there or moved rapidly onto someth “法律监督触角机制”是什么意思 一句话英译中 不要机械The troops that are sent to Bosnia and the letters that arrive in one’s letter box are all effectively Her Majesty’s. 一句话 英译中----机译不要!the enter Chamber of Commerce name,a recognized Chamber of Commerce under the laws of the State of enter State,has examined the manufacturer's invoice or shipper's affidavit concerning the origin of the merchandise 英语翻译Thirty were tested experimentally,including the antagonism of the b1 receptor by the transporterinhibitor Prozac,the inhibition of the 5-hydroxytryptamine (5-HT) transporter by the ion channel drug Vadilex,andantagonism of the histamine H 如果我爱你 村上春树 英语下面这段话能不能用英语翻译一下?拒绝各种在线翻译或者翻译机器.要自然一点的~美语思考方式的翻译如果我爱你...而你正巧的也爱我.那.你生病的时候..我会去照 英语翻译To reduce transportation costs manufacturers and wholesalers typically ship cases of products to retailerstypically ship cases 的用意 汽车2 时行100 千米,行1千米用多少时间? 一架直升机在莫斯科坠毁 未致地面人员埃及穆兄会领袖案开审 三名法官请辞俄罗斯总理说“俄入世崩溃论”未成真强风暴席卷北欧地区 造成大面积交通瘫金砖国家农业部长共商粮食安全消息称美考虑停止对盟国领袖监听 未做消息称美考虑停止对盟国领袖监听 未做希中经贸合作潜力巨大——访希腊新任驻一架直升机在莫斯科坠毁 未致地面人员强风暴席卷北欧地区 造成大面积交通瘫一架直升机在莫斯科坠毁 未致地面人员加内特禁赛一场詹姆斯 后悔吗加内特禁赛一场猛发83份研报 券商也是“蛮拼”的微拉美 领先全球的微创除皱新技术加盟麦当劳开家餐厅 今年可能得行福建长乐运钞车落水 4名工作人员身亡关于教师职业庄严的联想记者来帮忙深入贯彻党的十八届四中全会精神 全面郑元畅:我是真的单身,不排斥恋爱漫漫修仙路重生冥河女神的导师逍遥北宋行魔法纵横达芬奇密码百色纠缠:青青李滋味救世神途cs-边城 浪子关山月新白娘子传奇豹竹涧旅游仙足岛旅游格尔木胡杨林旅游天上王城旅游大巴扎旅游水磨沟旅游红山旅游克拉玛依河旅游阿勒泰冰雪大世界旅游黄土高原民俗村旅游轩辕庙旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘