q113960096 发表于 2013-7-8 21:23:16

SHSetFolderPath DllCall 方法[已解决]

本帖最后由 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/ 发过类似的求助,看了他的代码和说明,他也失败了,但他的帖子至今没有人回答。希望我的帖子能得到回答! 谢谢!
顺带说句:有没有已解决按钮。我没有找到。谢谢!

xms77 发表于 2013-7-9 12:17:36

回复 1# q113960096
这个问题要找P版解决啊!

q113960096 发表于 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")

nmgwddj 发表于 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这个函数。

q113960096 发表于 2013-7-9 15:18:40

回复 4# q113960096


    在老外 (不知道是不是老外)帮助下这段代码在XP上有效运行:DllCall("Shell32.dll","handle",231,"int",0x0010,"HANDLE",0,"DWORD",0,"str","C:\Desktop")

nmgwddj 发表于 2013-7-9 15:24:52

回复 6# q113960096


    的确是你用错了,这个函数返回的是一个句柄。HRESULT SHSetFolderPath(
_In_      int csidl,
_In_      HANDLE hToken,
_Reserved_DWORD dwFlags,
_In_      LPCTSTR pszPath
);

haijie1223 发表于 2013-7-9 21:58:18

回复 6# q113960096


    这个函数名怎么是数字?

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以上操作系统。不知道是否是因为虚拟机的原因。明天我在实体机上测试下。

q113960096 发表于 2013-7-9 22:01:32

回复 8# haijie1223

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

如果使用 232 ,注册表中的路径就会变成乱码。(XP操作系统)

haijie1223 发表于 2013-7-10 14:17:18

回复 10# q113960096


    你看下dll中相应位置的函数,是个数字,不是函数。怪了,这个dll中竟然没有这个函数~~

nmgwddj 发表于 2013-7-11 12:44:06

回复 10# q113960096


    SHSetFolderPathW使用Unicode编码,SHSetFolderPathA是ANSI编码,传递字符串的时候要用宽位,你直接使用A的好了,A的在使用过程中实际是将ANSI的字符串转换为Unicode编码再调用SHSetFolderPathW。以上是看到Windows核心编程书里面的介绍得知的。
页: [1]
查看完整版本: SHSetFolderPath DllCall 方法[已解决]