繁体   English   中英

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

unexpected logiclib behavior when testing string returned by system plugin

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我通过使用类似于上一个问题答案的代码,通过System插件获取系统信息。 API函数非常相似,除了它返回(或不返回)宽字符字符串。

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

变量转储

在阅读更多NetGetDCName参考时,我认为最好检查函数返回的值而不是宽字符字符串指针。 我有点困惑,为什么我的${If} 0 <> $1总是失败? 在这种情况下,我已经检查了不是$1等于0的域成员的虚拟机。 我想然后${IfThen}测试来释放内存也是错误的。

这是示例代码:

!include "logiclib.nsh"
outfile "hello2.exe"

!define DEBUG `System::Call kernel32::OutputDebugString(ts)`

section

    Call GetDCName
    pop $0

    Messagebox MB_OK "DCName=$0"

sectionEnd

Function GetDCName
    ;Push the domain controler name to the stack (or an empty string if no dc)
    push $0
    push $1
    push $2
    System::Call "netapi32::NetGetDCName(i0, i0, *w 0 r1) i.r2"
    Dumpstate::debug
    ${If} 0 <> $1
        ${debug} "copy $1"
        StrCpy $0 $1
    ${else}
        ${debug} "copy empty string"
        StrCpy $0 ""
    ${endif}
    ${IfThen} $1 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir1)" ${|}
    Pop $2
    Pop $1
    Exch $0
FunctionEnd

编辑:感谢安德斯,这是更正的功能:

Function GetDCName
    ;Push the domain controler name to the stack (or an empty string if no dc)
    push $0
    push $1
    push $2
    System::Call "netapi32::NetGetDCName(i0, i0, *i 0 r1) i.r2" ;do not convert r1 to wchar, keep the pointer to free it
    ${If} $2 = 0
        System::Call "*$1(&w${NSIS_MAX_STRLEN} .r0)"        ;get the wchar from the pointer
        ${IfThen} $1 <> 0 ${|} System::Call "netapi32::NetApiBufferFree(ir1)" ${|}  ;free the pointer
    ${else}
        StrCpy $0 ""
    ${endif}
    Pop $2
    Pop $1
    Exch $0
FunctionEnd
1 个回复

<>运算符用于数字,而不是字符串。 但是,这不是您唯一的问题; * (通常)只能与i一起使用,而不与t / m / w t / m / w类型在C样式字符串之间来回转换,但是在这种情况下,您需要实际的内存地址,因为必须将其传递给free函数。

您需要将*i0r1传递给NetGetDCName,然后,如果$ 2为0,则可以使用结构语法( *$1(&w${NSIS_MAX_STRLEN}.r5)*$1(w.r5) )提取字符串,并最终传递未*$1(w.r5) $ 1免费功能...

1 返回字符串时出现意外延迟

从函数返回字符串是否会有延迟的原因? 背景信息:我编写了一个简单的程序,该程序接受字母输入并输出这些字母的任何字谜。 它从包含数千个单词的超大型文本文件中检查单词。 它基本上将每个单词放入一个向量中,并检查它是否是字母的字谜,并打印出来。 它通常在1-15秒内完成,对此我感到满意。 ...

2 在Ruby中更改字符串中的字符时出现意外行为

这段代码(在Ruby 1.9中) 给出响应“ wtf”,这 给出的响应“确定”,这比我期望的要多得多。 这是Ruby中的错误,还是我期望更改单词(无论我如何更改)不应更改new_word,所以我错了。 ...

2013-03-14 15:28:18 4 47   ruby
4 使用字母和短划线排序字符串时出现意外行为

如果我有一些字符串列表包含所有数字和破折号,他们将按升序排序: 66-0616280-000 66-0616280-100 66-06162801000 66-06162801040 这是预期的。 但是,如果字符串包含字母,则排序有些出乎意料。 例如,这里是相同 ...

8 在PHP中处理字符串时出现意外结果

谢谢您抽出宝贵的时间为我着眼。 背景:我正在为个人理财项目处理OFX / QFX文件。 我已经用C#编写了代码,并且执行得很好。 我能够创建导入对象,逐行处理OFX / QFX文件,然后将前面提到的对象输出到控制台。 但是,我将其移植到PHP,以便在未在.Net Framework上 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM