gpt4 book ai didi

.net - Windows API根据未使用的变量名称导致不同的结果?

转载 作者:行者123 更新时间:2023-12-01 14:17:44 25 4
gpt4 key购买 nike

我对.Net编程所了解的一切都告诉我,在这里看到的行为是完全不可能的。那么有人可以解释一下这是怎么回事吗?简单的代码:

Structure WKSTA_USER_INFO_1
Dim wkui1_username As Integer
Dim wkui1_logon_domain As Integer
Dim wkui1_logon_server As Integer
Dim wkui1_oth_domains As Integer
End Structure

Declare Function NetWkstaUserGetInfo Lib "Netapi32" (ByVal reserved As Integer, ByVal level As Integer, ByRef lpBuffer As Integer) As Integer
Declare Sub lstrcpyW Lib "kernel32" (ByRef dest As Byte, ByVal src As Integer)
Declare Sub RtlMoveMemory Lib "kernel32" (ByRef dest As WKSTA_USER_INFO_1, ByRef src As Integer, ByVal Size As Integer)
Declare Function NetApiBufferFree Lib "Netapi32" (ByVal Buffer As Integer) As Integer

Function GetDomain() As String
Dim ret As Integer
Dim wk1 As WKSTA_USER_INFO_1
Dim pwk1 As Integer

Dim test As String = ""

ret = NetWkstaUserGetInfo(Nothing, 1, pwk1)
RtlMoveMemory(wk1, pwk1, Len(wk1))

ret = NetApiBufferFree(pwk1)

Return "test"
End Function

当我在此处放置一个断点时,我看到在RtlMoveMemory之后,我的wk1包含一个指向用户名的指针,其他所有指针均为0。这是一致的。现在,如果将 Dim test As String = ""更改为 Dim login As String = ""并再次运行,则wk1包含指向用户名和logon_domain的指针。

如果将其更改为 Dim login As String,则它仅包含指向用户名的指针。根据我将(完全未使用的)变量名称更改为什么,我得到了不同的结果。这怎么可能?

我一直给人的印象是,用什么命名变量都可能无关紧要。而且,声明变量然后再不使用它与根本没有变量是不可能的。

我已经在两台计算机上进行了尝试,结果一致(一台在.Net 3.5上,一台在4.0上)。但是,当我尝试将其转换为C#时,无法复制它。

顺便说一下,我知道我可以使用System.Environment获取有关当前用户信息的信息。这是自动升级的旧VB6代码(我对其进行了一些编辑以使其变得更简单)。我只是想了解这种行为是怎么可能的。显然,我已经花了很多年时间来假设有关.Net的事实并非如此。

最佳答案

解决方案,在Raymond Chen的帮助下:

RtlMoveMemory的声明应将src作为ByVal而不是ByRef传递。因为我要传递的src是指向内存位置的指针,所以将其传递给ByRef会导致它传递我的指针存储位置的内存地址...换句话说,就是变量声明的位置。因此,在其他变量或命名不同的变量周围产生不同的结果。

关于为什么在原始VB6代码中将其传递给ByRef ...的注释,它未在声明中指定ByVal,而ByRef是VB6中的默认值。因此,声明本身期望使用ByRef。但是,对API的调用指定它正在传递变量ByVal。这是您在.Net中无法做到的;您必须像声明中期望的那样传递它。因此,自动升级程序将ByRef添加到了声明中,该声明的确与VB6保持相同,但是在调用中它忽略了ByVal。

关于.net - Windows API根据未使用的变量名称导致不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10035157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com