找回密码
 加入
搜索
查看: 4467|回复: 8

[AU3基础] 学习《AU3之DllCall精讲(上)》遇到困惑望高手帮助 已解决

  [复制链接]
发表于 2014-4-22 16:41:19 | 显示全部楼层 |阅读模式
本帖最后由 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
 楼主| 发表于 2014-4-22 16:43:46 | 显示全部楼层
自己顶啊,在线等……
发表于 2014-4-22 17:08:07 | 显示全部楼层
字符串和变量的连接需要用 &
发表于 2014-4-22 19:53:09 | 显示全部楼层
$world = "world"
MsgBox(0, "", "Hello" & $world)
 楼主| 发表于 2014-4-22 20:36:30 | 显示全部楼层
回复 4# pusofalse


    [32767]
[" & $iLength & "]
之前已经获取了 $iLength 的值了啊 假如 $iLength =10 那[ $iLength ]不就=[10]  这个不就和[32767]一样的么?32767是数值型  $iLength 也是数值型的啊 为什么还要用引号和&接接啊
发表于 2014-4-23 07:22:08 | 显示全部楼层
不是 。。。。。。。。。。。。。。。
发表于 2014-4-23 10:28:14 | 显示全部楼层
DllStructCreate("wchar[" & $iLength & "]")
就是
DllStructCreate("wchar[$iLeigth这个数值]")
这是字符串连接

如果是DllStructCreate("wchar[$iLength]"),$iLength就不会变成对应的数字了
这是基本知识
发表于 2014-4-23 23:59:28 | 显示全部楼层
楼主去补充一下基础知识,这个问题和dllcall没有任何关系
发表于 2014-4-24 00:01:07 | 显示全部楼层
回复 5# cumtljj



"char[" & $iLength & "]" 这样传入的字符才是"char[10]",如果不用连接符传入的就是
"char[$iLength]" 不管你上面 $iLength=0也好 $iLength=100也好~~都和"char[$iLength]"里的$iLength无关了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 01:42 , Processed in 0.074184 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表