首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

关于注册表读取解决方案

2012-03-16 
关于注册表读取使用myfll,或是foxer.dll读取 多字符串值 键值的时候只能读取出第一行,试着使用其他方法结

关于注册表读取
使用myfll,或是foxer.dll读取 多字符串值 键值的时候只能读取出第一行,试着使用其他方法结果也一样,求教

[解决办法]

VB code
以下读写注册表的自定义函数:*---------------------------*操作注册表*语法:*创建子键:registry(0,主键序号,子键名,新建子键名)*写注册表:registry(1,主键序号,子键名,,注册项,项目值)*读注册表:registry(2,主键序号,子键名,,注册项)*删除子键:registry(3,主键序号,子键名)FUNCTION registry    PARAMETERS  nReg_code,;&&操作代码,0-创建子键,1-写注册表,2-读注册表,3-删除注册表项    nReg_MainKeyNo,;       &&注册表主键序号    cReg_skey,;            &&子键    cReg_skey_New,;        &&需创建的子键    cReg_skeyname,;        &&注册表项    cReg_keyvalue,;        &&注册表项的值    nReg_ValueType         &&注册表项的值的类型,1-数据串,2-Unicode 串,3-二进制,4-32-位数值    ON ERROR RETURN .f.    LOCAL nDisposition,;    lnResult,;      &&要取得值的注册表子项的地址    nResult,;    ReturnValue,;   &&返回的注册表值    nKeyLength,;    &&要写的值的长度    BUFFER,;        &&返回注册表项值    BufferSize,;    &&返回值的长度    lnError,;       &&返回注册表函数的错误代码    nError,;        &&返回的错误代码    skey1,skey2    IF !BETWEEN(nReg_MainKeyNo,1,4)        RETURN .F.    ENDIF    IF nReg_code=1 AND !BETWEEN(nReg_ValueType,1,4)        RETURN .F.    ENDIF    nReg_MainKeyNo=nReg_MainKeyNo-2147483649    *注册表键值访问权限    #DEFINE KEY_ALL_ACCESS             983103          &&所有权限    DECLARE INTEGER RegOpenKeyEx IN Win32API ;    INTEGER nKey,;    STRING @cSubKey, ;    INTEGER nReserved,;    INTEGER nAccessMask,;    INTEGER @nResult    DECLARE INTEGER RegQueryValueEx IN Win32API;    INTEGER nKey, ;    STRING cValueName, ;    INTEGER nReserved,;    INTEGER @nType, ;    STRING @cBuffer, ;    INTEGER @nBufferSize    DECLARE RegCreateKeyEx IN WIN32API;    INTEGER hKey,;                &&一个打开项的句柄,或者一个标准项名    STRING lpSubKey,;             &&欲创建的新子项的名字    INTEGER Reserved,;            &&设为零    STRING lpClass,;              &&项的类名    INTEGER dwOptions,;           &&零,这个项不正式保存下来,系统重新启动后会消失    INTEGER samDesired,;          &&访问权限    INTEGER lpSecurityAttributes,;&&对这个项的安全特性进行描述的一个结构,零    INTEGER @phkResult,;          &&指定用于装载新子项句柄的一个变量    INTEGER @lpdwDisposition      &&返回是新建子项,还是打开子项(如果新建的子项存在)    DECLARE RegDeleteKey IN WIN32API;    INTEGER hKey,;    STRING lpSubKey    DECLARE INTEGER RegCloseKey IN Win32API INTEGER nKey    DECLARE INTEGER RegSetValueEx IN Win32API;    INTEGER hKey,;    STRING lpValueName,;    INTEGER Reserved,;    INTEGER dwType,;    STRING  lpData,;    INTEGER cbData    DO CASE        CASE nReg_code=0     &&创建子建            nResult= 0            nDisposition = 0            nError = RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey,0, KEY_ALL_ACCESS, @nResult)            IF nError#0                MESSAGEBOX('Can`t open the sub_key!',0+48,'INF')                RETURN .F.            ENDIF            nError=RegCreateKeyEx(nResult,cReg_sKey_New,0,'nReg_ValueType',0,KEY_ALL_ACCESS,0,@lnResult,@nDisposition)            =RegCloseKey(nResult)            RETURN nError        **************************************************************************************        CASE nReg_code=1  &&写注册表            nError=0            nError =RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey, 0,KEY_ALL_ACCESS, @lnResult)            IF nError#0                MESSAGEBOX('Can`t write the sub_key!',0+48,'INF')                RETURN .F.            ENDIF            nKeyLength=LEN(cReg_KeyValue)            nError=RegSetValueEx(lnResult,cReg_sKeyName,0,nReg_ValueType, @cReg_KeyValue, @nKeyLength)            =RegCloseKey(lnResult)            RETURN nError=0        ***************************************************************************        CASE nReg_code=2       &&读注册表            ReturnValue = ""            lnResult = 0            BUFFER = SPACE(128)            BufferSize = 128            lnError = RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey, 0, KEY_ALL_ACCESS, @lnResult)            IF lnError = 0                lnType = 0                lnError = RegQueryValueEx(lnResult, cReg_skeyname, 0, @lnType, @BUFFER, @BufferSize)                IF lnError = 0 AND BUFFER <> CHR(0)                &&如果错误码为 0, 则正常读取值.                    ReturnValue = LEFT(BUFFER, BufferSize - 1) &&取得返回值                ENDIF            ENDIF            =RegCloseKey(lnResult)            RETURN ReturnValue        **************************************************************************************        CASE nReg_code=3        &&删除注册表项            skey1=LEFT(cReg_sKey,AT('\',cReg_sKey,OCCURS('\',cReg_sKey))-1)            skey2=SUBST(cReg_sKey,AT('\',cReg_sKey,OCCURS('\',cReg_sKey))+1)            nError =RegOpenKeyEx(nReg_MainKeyNo,sKey1, 0,KEY_ALL_ACCESS, @lnResult)            IF nError#0                MESSAGEBOX('Can`t delete the sub_key!',0+48,'INF')                RETURN .F.            ELSE                nError=RegDeleteKey(lnResult,sKey2)            ENDIF            RETURN nError        ENDCASEENDFUNC 

热点排行