hur.cn - 华软网

 热门搜索

在PB程序中想要取到“我的文档”路径,想用API函数读注册表实现,求具体实现

  作者:未知    来源:网络    更新时间:2019/4/16
需求是要取到“我的文档”的路径,由于用户有可能自行修悔改“我的文档”的路径,所以不能写死,也不能根据当前的用户名来拼路径
于是想到读注册表“HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders”的“Personal”项
然则用PB自带的RegistryGet函数读出的值是“%USERPROFILE%\My Documents”也就是环境变量没有读出来
所以思量用API的读注册表函数实现
查找RegQueryValueEx的API函数,没有PB的例子,只有VB的例子
欠好意思 我不会把各种VB的数据类型、方法等转换成PB的,请知晓的帮我看看如何用PB实现
VB的方法:
声明:
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" _

   ( _

    ByVal hKey As Long, _

    ByVal lpValueName As String, _

    ByVal lpReserved As Long, _

    ByRef lpType As Long, _

    ByVal lpData As Any, _

    ByRef lpcbData As Long _

   ) As Long '查询一个键值,lpData应由缺省的ByRef型改成ByVal型

调用:Call RegQueryValueEx(nKeyHandle, "My Value", 0, nValueType, sValue, nLength)


用PB:
声明:
Function Long RegOpenKey (Long hKey, String lpSubKey, Long phkResult) Library "advapi32.dll" 
Function Long RegQueryValueEx(Long hKey, String lpValueName, Long lpReserved, Long TypeA, Any lpData, Long lpcbData) Library "advapi32.dll"

调用的时候,参数不知如何写,我是这样写的:
l_1 = RegQueryValueEx("HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Personal",0,str_type,str_1,200)

其实第一个参数是long型的,这么写当然不对,我也不知道如何把VB中的
Const HKEY_CLASSES_ROOT = -2147483648#
Const HKEY_CURRENT_USER = -2147483647#
Const HKEY_LOCAL_MACHINE = -2147483646#
Const HKEY_USERS = -2147483645#
在PB中定义为什么数据类型呢?

希望大家能耐心帮我解答 谢谢

------华软网友回答------
不要那么取了,给你段代码

函数声明
Function long SHGetSpecialFolderLocation (Long hwndOwner, Integer nFolder, ref Long ppidl) library "shell32.dll"
Function long SHGetPathFromIDList(long pidl, ref String szPath) library "shell32.dll" Alias for "SHGetPathFromIDListA"

代码
integer MYDOCUMENTS = 5 //'我的文档
long pidl
string sTmp

SHGetSpecialFolderLocation(0, MYDOCUMENTS, pidl)
SHGetPathFromIDList(pidl, sTmp)

messagebox('', sTmp)

在PB里尝试过了,没有问题,如果有什么问题,请发短消息给我,帮你搞定
------华软网友回复------
给你一个对照全的代码
函数声明
Function long SHGetSpecialFolderLocation (Long hwndOwner, Integer nFolder, ref Long ppidl) library "shell32.dll"
Function long SHGetPathFromIDList(long pidl, ref String szPath) library "shell32.dll" Alias for "SHGetPathFromIDListA"
Function long GetWindowsDirectory (ref String lPBuffer, Long nSize) Library "kernel32" Alias for "GetWindowsDirectoryA"
Function long GetSystemDirectory (ref String lpBuffer, Long nSize) Library "kernel32" Alias for "GetSystemDirectoryA"
Function long GetTempPath (Long nBufferLength, ref String lpBuffer) Library "kernel32" Alias for "GetTempPathA"

代码

Constant integer MAX_LEN = 200 //字符串最大长度
Constant integer DESKTOP = 0 //桌面
Constant integer PROGRAMS = 2 //程序集
Constant integer MYDOCUMENTS = 5 //我的文档
Constant integer MYFAVORITES = 6 //收藏夹
Constant integer STARTUP = 7 //启用
Constant integer RECENT = 8 //最近打开的资料
Constant integer SENDTO = 9 //发送
Constant integer STARTMENU = 11  //起头菜单
Constant integer NETHOOD = 19 //网上邻居
Constant integer FONTS = 20 //字体
Constant integer SHELLNEW = 21 //ShellNew
Constant integer APPDATA = 26 //Application Data
Constant integer PRINTHOOD = 28 //PrintHood
Constant integer PAGETMP = 32 //网页临时资料
Constant integer COOKIES = 33 //Cookies目录
Constant integer HISTORY = 34 //历史


String sTmp  //寄存结果的固定长度的字符串
Long Length //字符串的实际长度
Long pidl //某特殊目录在特殊目录列表中的位置
String ls_data, ls_path

//获得Windows目录
sTmp = space(200)
Length = GetWindowsDirectory(sTmp, MAX_LEN)
ls_path = Left(sTmp, Length)
ls_data += ls_path + "~r~n"

//获得System目录
sTmp = space(200)
Length = GetSystemDirectory(sTmp, MAX_LEN)
ls_path = Left(sTmp, Length)
ls_data += ls_path + "~r~n"

//获得Temp目录
sTmp = space(200)
Length = GetTempPath(MAX_LEN, sTmp)
ls_path = Left(sTmp, Length)
ls_data += ls_path + "~r~n"

//获得DeskTop目录
SHGetSpecialFolderLocation(0, DESKTOP, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得发送到目录
SHGetSpecialFolderLocation(0, SENDTO, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得我的文档目录
SHGetSpecialFolderLocation(0, MYDOCUMENTS, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得程序集目录
SHGetSpecialFolderLocation(0, PROGRAMS, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得启用目录
SHGetSpecialFolderLocation(0, STARTUP, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得起头菜单目录
SHGetSpecialFolderLocation(0, STARTMENU, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得收藏夹目录
SHGetSpecialFolderLocation(0, MYFAVORITES, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得最后打开的资料目录
SHGetSpecialFolderLocation(0, RECENT, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得网上邻居目录
SHGetSpecialFolderLocation(0, NETHOOD, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得字体目录
SHGetSpecialFolderLocation(0, FONTS, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得Cookies目录
SHGetSpecialFolderLocation(0, COOKIES, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得历史目录
SHGetSpecialFolderLocation(0, HISTORY, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得网页临时资料目录
SHGetSpecialFolderLocation(0, PAGETMP, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得ShellNew目录
SHGetSpecialFolderLocation(0, SHELLNEW, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得Application Data目录
SHGetSpecialFolderLocation(0, APPDATA, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

//获得PrintHood目录
SHGetSpecialFolderLocation(0, PRINTHOOD, pidl)
SHGetPathFromIDList(pidl, sTmp)
ls_path = sTmp
ls_data += ls_path + "~r~n"

messagebox('', ls_data)
------华软网友回复------
太棒了 我在机器上试了 无论是多用户照旧自行修改目录 都能找到当前的正确路径
非常非常的谢谢lzp_lrp(lzp)
------华软网友回复------
mark~~~~      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。