已解决 枚举装入点API调用,请教个缓冲区大小设置问题
本帖最后由 Qokelate 于 2012-5-4 13:52 编辑现成的Au3里面找不到相关函数,只好自己弄个用着先,不过有个问题搞不懂,请教达人
缓冲区大小如何自动获取? (cchBufferLength)
Func OpenKernel32DLL($CloseHWND = 0)
If $CloseHWND = 0 Then Return DllOpen('Kernel32.dll')
DllClose($CloseHWND)
EndFunc ;==>OpenKernel32DLL
;~ HANDLE WINAPI FindFirstVolume(
;~ __outLPTSTR lpszVolumeName,
;~ __in DWORD cchBufferLength
;~ );
Func FindFirstVolume()
Local $hDLL = OpenKernel32DLL()
Local $tAPI = DllStructCreate('char VolumeName')
Local $p1 = DllStructGetPtr($tAPI, 1)
Local $iLen = DllStructGetSize($tAPI)
Local $API = DllCall($hDLL, 'Handle', 'FindFirstVolume', 'ptr', $p1, 'dword', $iLen)
OpenKernel32DLL($hDLL)
Return $API
EndFunc ;==>FindFirstVolume
;~ BOOL WINAPI FindVolumeClose(
;~ __inHANDLE hFindVolume
;~ );
Func FindVolumeClose($hVolume)
Local $hDLL = OpenKernel32DLL()
DllCall($hDLL, 'int', 'FindVolumeClose', 'handle', $hVolume)
OpenKernel32DLL($hDLL)
EndFunc ;==>FindVolumeClose
;~ BOOL WINAPI FindNextVolume(
;~ __in HANDLE hFindVolume,
;~ __out LPTSTR lpszVolumeName,
;~ __in DWORD cchBufferLength
;~ );
Func FindNextVolume($hVolume)
Local $tAPI = DllStructCreate('char VolumeName')
Local $p1 = DllStructGetPtr($tAPI, 1)
Local $iLen = DllStructGetSize($tAPI)
Local $hDLL = OpenKernel32DLL()
Local $API = DllCall($hDLL, 'int', 'FindNextVolume', 'handle', $hVolume, 'ptr', $p1, 'dword', $iLen)
OpenKernel32DLL($hDLL)
Return DllStructGetData($tAPI, 1)
EndFunc ;==>FindNextVolume
Local $hFind = FindFirstVolume()
Local $sVolumeMP
While 1
$sVolumeMP = FindNextVolume($hFind)
If $sVolumeMP = '' Then ExitLoop
MsgBox(0,0,$sVolumeMP)
WEnd
FindVolumeClose($hFind)
不多说,上图,下载搜索"缘鸟api"
回复 2# 风行者
原来如此,受教了 查看msdn:http://msdn.microsoft.com/en-us/library/windows/desktop/aa364425(v=vs.85).aspx
FindFirstVolume 函数
第一个参数是一个指向有结束符('\0')的字符串指针,所以缓冲区分配足够大的内存就可以
api 函数会根据结束符自动截取需要的,一般使用MAX_PATH ,260字节
可以参考它的例子:
http://msdn.microsoft.com/en-us/library/windows/desktop/cc542456(v=vs.85).aspx
页:
[1]