找回密码
 加入
搜索
查看: 6760|回复: 10

[系统综合] SHSetFolderPath DllCall 方法[已解决]

  [复制链接]
发表于 2013-7-8 21:23:16 | 显示全部楼层 |阅读模式
本帖最后由 q113960096 于 2013-7-9 15:24 编辑

要在 XP 系统中使用 SHSetFolderPath 来改变桌面、我的文档、位置。参考了MSDN,说要在使用前调用  GetProcAddress 原因是我不会,delphi c++ c# 都有相关参考就是 autoit 我没找到。尝试依葫芦画瓢, 但尝试了几十次都失败了。GOOGLE,bing, baidu 了。发现05年,已经有个朋友在 http://www.autoitscript.com/forum/topic/12466-api-calling/ 发过类似的求助,看了他的代码和说明,他也失败了,但他的帖子至今没有人回答。希望我的帖子能得到回答! 谢谢!
顺带说句:有没有已解决按钮。我没有找到。谢谢!
发表于 2013-7-9 12:17:36 | 显示全部楼层
回复 1# q113960096
这个问题要找P版解决啊!
 楼主| 发表于 2013-7-9 14:59:01 | 显示全部楼层
回复 3# xms77

P版??抱歉,我不知道是谁!
以下代码在 Win8 x64 有效,但是XP 出错,Error ID: 127
;~ Local $SHSetFolderPath = _WinAPI_GetProcAddress("Shell32.dll","SHSetFolderPath")
;~ DllCall("Shell32.dll","long","SHSetFolderPath","int",0,"HANDLE",$SHSetFolderPath,"DWORD",0,"str","C:\Desktop")
发表于 2013-7-9 15:16:31 | 显示全部楼层
本帖最后由 nmgwddj 于 2013-7-9 15:19 编辑

调用GetProcAddress是获取当前进程中加载的一个dll模块的地址。你上面的脚本不知道会不会自动包含(取决于程序内有没有代码使用这个dll中的函数)shell32.dll。
在调用GetProcAddress前先open shell32.dll试试。

另外推荐你看下孙鑫的Windows编程视频教程第19章,里面详细阐述了dll的工作方式。你不需要学会写C/C++的代码,只需要理解意思即可,里面就有提到GetProcAddress这个函数。
 楼主| 发表于 2013-7-9 15:18:40 | 显示全部楼层
回复 4# q113960096


    在老外 (不知道是不是老外)帮助下这段代码在XP上有效运行:
DllCall("Shell32.dll","handle",231,"int",0x0010,"HANDLE",0,"DWORD",0,"str","C:\Desktop")
发表于 2013-7-9 15:24:52 | 显示全部楼层
回复 6# q113960096


    的确是你用错了,这个函数返回的是一个句柄。
HRESULT SHSetFolderPath(
  _In_        int csidl,
  _In_        HANDLE hToken,
  _Reserved_  DWORD dwFlags,
  _In_        LPCTSTR pszPath
);
发表于 2013-7-9 21:58:18 | 显示全部楼层
回复 6# q113960096


    这个函数名怎么是数字?
 楼主| 发表于 2013-7-9 21:59:41 | 显示全部楼层
回复 5# nmgwddj


  • 非常感谢,虽然现在已经实现。
  • 但MSDN上说,SHSetFolderPath 无法导出 shell32.dll,要使用 GetProcAddress。于是我就各种搜,发现 Delphi 和 C++ (老版本) 的确用 GetProcAddress。中文是这么说的,SHSetFolderPath 不按名称从 Shell32.dll 导出。要使用该函数,您需要调用 GetProcAddress 于 SHSetFolderPathA 序号 231。个人翻译,英语非常不好,莫见怪。
  • 虽然不按照MSDN也可以实现。但我还是觉得按照MSDN要求写更好。但我水平太差,折腾了一天一夜也搞不出。你能否写个?感激不尽!
  • 还有就是我发现 SHSetKnownFolderPath 也可以用在 XP上,MSDN上说只支持VISTA以上操作系统。不知道是否是因为虚拟机的原因。明天我在实体机上测试下。
 楼主| 发表于 2013-7-9 22:01:32 | 显示全部楼层
回复 8# haijie1223

MSDN上提了下,序列 231 是 SHSetFolderPathA ,232 是SHSetFolderPathW。

如果使用 232 ,注册表中的路径就会变成乱码。(XP操作系统)
发表于 2013-7-10 14:17:18 | 显示全部楼层
回复 10# q113960096


    你看下dll中相应位置的函数,是个数字,不是函数。怪了,这个dll中竟然没有这个函数~~
发表于 2013-7-11 12:44:06 | 显示全部楼层
回复 10# q113960096


    SHSetFolderPathW使用Unicode编码,SHSetFolderPathA是ANSI编码,传递字符串的时候要用宽位,你直接使用A的好了,A的在使用过程中实际是将ANSI的字符串转换为Unicode编码再调用SHSetFolderPathW。以上是看到Windows核心编程书里面的介绍得知的。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 23:14 , Processed in 0.079936 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表