本帖最后由 cumtljj 于 2014-4-24 08:27 编辑
我正在努力学习你编写的书但是遇到了不懂的了 能加qq帮我解答下么? qq676501125
问题:代码2.2-1中的Local $tName = DllStructCreate("char[" & $iLength & "]")一句
char[" & $iLength & "]为什么不是 char[$iLength] ? $iLength之前已经赋值了啊为什么不能是 char[$iLength] ? char[$iLength] 和下面的char[32767]不就一样的么 可为什么就是不行啊 第11行和第19行@pusofalse @7634069
; 获取Windows安装目录。
MsgBox(0, "WINDIR", _EnvGet("WINDIR"))
Func _EnvGet($sEnvironment)
; 获取环境变量名称的字符串长度,方便接下来创建一个缓冲区。
Local $iLength = StringLen($sEnvironment)
; 长度值加1,确保缓冲区以NULL字符结尾。
$iLength += 1
; 创建一个特定长度的缓冲区以容纳环境变量的名称,注意此处已由char改为wchar。
Local $tName = DllStructCreate("wchar[" & $iLength & "]")
; 获取缓冲区指针,用作API函数的lpName参数。
Local $pName = DllStructGetPtr($tName)
; 将环境变量的名称写入缓冲区里面。
DllStructSetData($tName, 1, $sEnvironment)
; 创建一个可以容纳32767个字符的缓冲区,用来接收环境变量的值,同应使用wchar类型。
Local $tBuffer = DllStructCreate("wchar[32767]")
; 获取$tBuffer指针,用作API函数的lpBuffer参数。
Local $pBuffer = DllStructGetPtr($tBuffer)
; 注意观察scite的输出。
If @AutoItX64 Then
ConsoleWrite(StringFormat("$tName缓冲区指针=0x%016X, $tBuffer缓冲区指针=0x%016X\n", $pName, $pBuffer))
Else
ConsoleWrite(StringFormat("$tName缓冲区指针=0x%08X, $tBuffer缓冲区指针=0x%08X\n", $pName, $pBuffer))
EndIf
; 调用GetEnvironmentVariable读取环境变量的值。
Local $iResult = DllCall( _
"Kernel32.dll", _ ; DLL文件。
"dword", _ ; 返回值类型。
"GetEnvironmentVariableW", _ ; API函数名称,UNICODE版本。
"ptr", $pName, _ ; lpName,环境变量名称。
"ptr", $pBuffer, _ ; lpBuffer,用于存储环境变量的值。
"dword", 32767 _ ; nSize,lpBuffer缓冲区最多能容纳32767个字符。
)
; 从$tBuffer缓冲区里面读出环境变量的值。
Local $sValue = DllStructGetData($tBuffer, 1)
; $iResult[0]指出已经将多少个字符复制到了$tBuffer缓冲区里面。
; 与StringLen($sValue)有相同的意义。
Local $iLength = $iResult[0] ; StringLen($sValue)
; 成功 - @error=0, @extended=环境变量其值的字符串长度, 返回值=环境变量其值。
; 失败 - @error=1, @extended=0, 返回值=""。
Return SetError($iLength = 0, $iLength, $sValue)
EndFunc ;==>_EnvGet
|