学习《AU3之DllCall精讲(上)》遇到困惑望高手帮助 已解决
本帖最后由 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不就一样的么 可为什么就是不行啊 第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")
; 获取$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指出已经将多少个字符复制到了$tBuffer缓冲区里面。
; 与StringLen($sValue)有相同的意义。
Local $iLength = $iResult ; StringLen($sValue)
; 成功 - @error=0, @extended=环境变量其值的字符串长度, 返回值=环境变量其值。
; 失败 - @error=1, @extended=0, 返回值=""。
Return SetError($iLength = 0, $iLength, $sValue)
EndFunc ;==>_EnvGet 自己顶啊,在线等…… 字符串和变量的连接需要用 & $world = "world"
MsgBox(0, "", "Hello" & $world) 回复 4# pusofalse
[" & $iLength & "]
之前已经获取了 $iLength 的值了啊 假如 $iLength =10 那[ $iLength ]不就=这个不就和一样的么?32767是数值型$iLength 也是数值型的啊 为什么还要用引号和&接接啊 不是 。。。。。。。。。。。。。。。 DllStructCreate("wchar[" & $iLength & "]")
就是
DllStructCreate("wchar[$iLeigth这个数值]")
这是字符串连接
如果是DllStructCreate("wchar[$iLength]"),$iLength就不会变成对应的数字了
这是基本知识 楼主去补充一下基础知识,这个问题和dllcall没有任何关系 回复 5# cumtljj
"char[" & $iLength & "]" 这样传入的字符才是"char",如果不用连接符传入的就是
"char[$iLength]" 不管你上面 $iLength=0也好 $iLength=100也好~~都和"char[$iLength]"里的$iLength无关了
页:
[1]