IADsLargeInteger 接口 (iads.h)
IADsLargeInteger 接口用于操作 LargeInteger 类型的 64 位整数。
继承
IADsLargeInteger 接口继承自 IDispatch 接口。
备注
由于 Visual Basic 没有本机无符号数值数据类型,因此难以处理 Visual Basic 中的 IADsLargeInteger 。 如果 LowPart 或 HighPart 具有高位集,这可能会导致数据转换出错,从而导致 Visual Basic 将数字处理为负数。 下面的 Visual Basic 代码示例演示如何在 Visual Basic 中正确处理 IADsLargeInteger 。
示例
以下示例演示如何将 IADsLargeInteger 对象转换为十六进制字符串。
Dim oDomain As IADs
Dim oLargeInt As LargeInteger
Set oDomain = GetObject("LDAP://DC=fabrikam,DC=com")
Set oLargeInt = oDomain.Get("creationTime")
Debug.Print oLargeInt.HighPart
Debug.Print oLargeInt.LowPart
strTemp = "&H" + CStr(Hex(oLargeInt.HighPart)) + _
CStr(Hex(oLargeInt.LowPart))
Debug.Print strTemp
在 Visual Basic 中,可以使用 FileTimeToSystemTime 和 SystemTimeToVariantTime API 将表示日期和时间的 IADsLargeInteger 对象转换为时间变体。 下面的代码示例对此进行了演示。
Public Declare Function FileTimeToSystemTime Lib "kernel32" _
(lpFileTime As FILETIME, _
lpSystemTime As SYSTEMTIME) As Long
Public Declare Function SystemTimeToVariantTime Lib "oleaut32.dll" _
(lpSystemTime As SYSTEMTIME, _
dbTime As Double) As Long
Public Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
' This function will convert the ADSI data type LargeInteger to
' a Variant time value in Greenwich Mean Time (GMT).
Function LargeInteger_To_Time(oLargeInt As LargeInteger, vTime As Variant)_
As Boolean
On Error Resume Next
Dim pFileTime As FILETIME
Dim pSysTime As SYSTEMTIME
Dim dbTime As Double
Dim lResult As Long
If (oLargeInt.HighPart = 0 And oLargeInt.LowPart = 0) Then
vTime = 0
LargeInteger_To_Time = True
Exit Function
End If
If (oLargeInt.LowPart = -1) Then
vTime = -1
LargeInteger_To_Time = True
Exit Function
End If
pFileTime.dwHighDateTime = oLargeInt.HighPart
pFileTime.dwLowDateTime = oLargeInt.LowPart
' Convert the FileTime to System time.
lResult = FileTimeToSystemTime(pFileTime, pSysTime)
If lResult = 0 Then
LargeInteger_To_Time = False
Debug.Print "FileTimeToSystemTime: " + Err.Number + " - "_
+ Err.Description
Exit Function
End If
' Convert System Time to a Double.
lResult = SystemTimeToVariantTime(pSysTime, dbTime)
If lResult = 0 Then
LargeInteger_To_Time = False
Debug.Print "SystemTimeToVariantTime: " + Err.Number + _
" - " + Err.Description
Exit Function
End If
' Place the double in the variant.
vTime = CDate(dbTime)
LargeInteger_To_Time = True
End Function
以下示例演示如何将 IADsLargeInteger 转换为 64 位整数。
HRESULT PrintAccountExpires(LPCWSTR pwszADsPath)
{
if(!pwszADsPath)
{
return E_INVALIDARG;
}
HRESULT hr;
CComPtr<IADs> spads;
// Bind to the object.
hr = ADsGetObject(pwszADsPath, IID_IADs, (LPVOID*)&spads);
if(FAILED(hr))
{
return hr;
}
/*
Get the accountExpires attribute, which is an
IDispatch that contains an IADsLargeInteger.
*/
CComVariant svar;
hr = spads->Get(CComBSTR("accountExpires"), &svar);
if(FAILED(hr))
{
return hr;
}
// Get the IADsLargeInteger interface.
CComPtr<IADsLargeInteger> spli;
hr = svar.pdispVal->QueryInterface(IID_IADsLargeInteger,
(LPVOID*)&spli);
if(FAILED(hr))
{
return hr;
}
// Get the high and low parts of the value.
long lHigh;
long lLow;
hr = spli->get_HighPart(&lHigh);
hr = spli->get_LowPart(&lLow);
// Convert the high and low parts to an __i64.
__int64 i64;
i64 = (ULONG)lHigh;
i64 = (i64 << 32);
i64 = i64 + (ULONG)lLow;
// Print all of the values.
wprintf(L"HighPart = %u, LowPart = %u, Combined = %I64d\n",
lHigh, lLow, i64);
return hr;
}
要求
最低受支持的客户端 | Windows Vista |
最低受支持的服务器 | Windows Server 2008 |
目标平台 | Windows |
标头 | iads.h |