cumtljj 发表于 2014-4-22 16:41:19

学习《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

cumtljj 发表于 2014-4-22 16:43:46

自己顶啊,在线等……

afan 发表于 2014-4-22 17:08:07

字符串和变量的连接需要用 &

pusofalse 发表于 2014-4-22 19:53:09

$world = "world"
MsgBox(0, "", "Hello" & $world)

cumtljj 发表于 2014-4-22 20:36:30

回复 4# pusofalse


   
[" & $iLength & "]
之前已经获取了 $iLength 的值了啊 假如 $iLength =10 那[ $iLength ]不就=这个不就和一样的么?32767是数值型$iLength 也是数值型的啊 为什么还要用引号和&接接啊

netegg 发表于 2014-4-23 07:22:08

不是 。。。。。。。。。。。。。。。

seniors 发表于 2014-4-23 10:28:14

DllStructCreate("wchar[" & $iLength & "]")
就是
DllStructCreate("wchar[$iLeigth这个数值]")
这是字符串连接

如果是DllStructCreate("wchar[$iLength]"),$iLength就不会变成对应的数字了
这是基本知识

haijie1223 发表于 2014-4-23 23:59:28

楼主去补充一下基础知识,这个问题和dllcall没有任何关系

wua0550 发表于 2014-4-24 00:01:07

回复 5# cumtljj



"char[" & $iLength & "]" 这样传入的字符才是"char",如果不用连接符传入的就是
"char[$iLength]" 不管你上面 $iLength=0也好 $iLength=100也好~~都和"char[$iLength]"里的$iLength无关了
页: [1]
查看完整版本: 学习《AU3之DllCall精讲(上)》遇到困惑望高手帮助 已解决