Winapi 测试系统插件返回的字符串时出现意外的logiclib行为

Winapi 测试系统插件返回的字符串时出现意外的logiclib行为,winapi,nsis,Winapi,Nsis,我通过系统插件获得系统信息,代码类似于。API函数非常类似,只是它返回(或不返回)宽字符字符串 在作为域成员的计算机上使用该脚本时,我无法理解为什么logiclib测试总是通过测试的${else}分支。以下捕获显示$1不为空: 在阅读更多内容时,我认为最好检查函数返回值,而不是宽字符字符串指针。我有点困惑,为什么我的${If}0$1总是失败?我在一个虚拟机上进行了检查,该虚拟机不是$1在本例中等于0的域的成员。我认为释放内存的${IfThen}测试也是错误的 以下是示例代码: !包括“logi

我通过系统插件获得系统信息,代码类似于。API函数非常类似,只是它返回(或不返回)宽字符字符串

在作为域成员的计算机上使用该脚本时,我无法理解为什么logiclib测试总是通过测试的
${else}
分支。以下捕获显示
$1
不为空:

在阅读更多内容时,我认为最好检查函数返回值,而不是宽字符字符串指针。我有点困惑,为什么我的
${If}0$1
总是失败?我在一个虚拟机上进行了检查,该虚拟机不是
$1
在本例中等于
0
的域的成员。我认为释放内存的
${IfThen}
测试也是错误的

以下是示例代码:

!包括“logiclib.nsh”
输出文件“hello2.exe”
!定义调试`System::调用内核32::OutputDebugString(ts)`
部分
调用GetDCName
流行音乐$0
Messagebox MB_OK“DCName=$0”
分段结束
函数GetDCName
;将域控制器名称推送到堆栈(如果没有dc,则为空字符串)
推送$0
推1美元
推2美元
系统::调用“netapi32::NetGetDCName(i0,i0,*w 0 r1)i.r2”
Dumpstate::调试
${If}0$1
${debug}“复制$1”
StrCpy$0$1
${else}
${debug}“复制空字符串”
StrCpy$0“”
${endif}
${IfThen}$1 0${|}系统::调用“netapi32::NetApiBufferFree(ir1)”${
流行音乐2美元
流行音乐1美元
Exch$0
功能端
编辑:感谢Anders,以下是更正后的功能:

函数GetDCName ;将域控制器名称推送到堆栈(如果没有dc,则为空字符串) 推送$0 推1美元 推2美元 系统::调用“netapi32::NetGetDCName(i0,i0,*i0r1)i.r2”;不要将r1转换为wchar,请保留指向释放它的指针 ${If}$2=0 系统::调用“*$1(&w${NSIS_MAX_STRLEN}.r0)”;从指针获取wchar ${IfThen}$10${{124;}系统::调用“netapi32::NetApiBufferFree(ir1)”${{124;};释放指针 ${else} StrCpy$0“” ${endif} 流行音乐2美元 流行音乐1美元 Exch$0 功能端
运算符用于数字,而不是字符串。这不是你唯一的问题<代码>*
通常只能与
i
一起使用,不能与
t
/
m
/
w
一起使用。
t
/
m
/
w
类型在C样式字符串之间转换,但在您的情况下,您需要实际内存地址,因为您必须将其传递给空闲函数


您需要将
*i0r1
传递给NetGetDCName,然后如果$2是0,那么您可以使用结构语法(
*$1(&w${NSIS\u MAX\u STRLEN}.r5)
*$1(w.r5)
)提取字符串,最后将$1原封不动地传递给自由函数…

即使函数失败,字符串指针也可以是非空的,总是先检查返回值…天哪,我错过了关于字符串比较器的要点。非常感谢
*$1(&w${NSIS\u MAX\u STRLEN}.r5)
符号(我不会猜到),因为我使用了
*$1(w.r5)
符号。不知道为什么,可能是因为我的NSIS特别构建了长字符串?是的,你真的应该使用&w语法,这样你就不会溢出缓冲区。只有您自己设置字符串时,w.r0语法才可能起作用,我记不清了。。。