mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
7.0 KiB
370 lines
7.0 KiB
#include "procs.hxx"
|
|
#pragma hdrstop
|
|
#include "macro.h"
|
|
|
|
HRESULT
|
|
PackStringinVariant(
|
|
BSTR bstrString,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if ( bstrString == NULL )
|
|
RRETURN(E_FAIL);
|
|
|
|
VariantInit(pvarInputData);
|
|
|
|
pvarInputData->vt = VT_BSTR;
|
|
|
|
if (!bstrString) {
|
|
V_BSTR(pvarInputData) = NULL;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
hr = ADsAllocString(bstrString, &(V_BSTR(pvarInputData)));
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
UnpackStringfromVariant(
|
|
VARIANT varSrcData,
|
|
BSTR * pbstrDestString
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if( varSrcData.vt != VT_BSTR){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
if (!V_BSTR(&varSrcData)) {
|
|
*pbstrDestString = NULL;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
hr = ADsAllocString(V_BSTR(&varSrcData), pbstrDestString);
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PackLONGinVariant(
|
|
LONG lValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
VariantInit(pvarInputData);
|
|
|
|
pvarInputData->vt = VT_I4;
|
|
V_I4(pvarInputData) = lValue;
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
UnpackLONGfromVariant(
|
|
VARIANT varSrcData,
|
|
LONG * plValue
|
|
)
|
|
{
|
|
if( varSrcData.vt != VT_I4){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
*plValue = V_I4(&varSrcData);
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PackDATEinVariant(
|
|
DATE daValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
VariantInit(pvarInputData);
|
|
|
|
pvarInputData->vt = VT_DATE;
|
|
V_DATE(pvarInputData) = daValue;
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
UnpackDATEfromVariant(
|
|
VARIANT varSrcData,
|
|
DATE * pdaValue
|
|
)
|
|
{
|
|
if( varSrcData.vt != VT_DATE){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
*pdaValue = V_DATE(&varSrcData);
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
|
|
HRESULT
|
|
PackFILETIMEinVariant(
|
|
DATE daValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
IADsLargeInteger *pTime = NULL;
|
|
VARIANT var;
|
|
SYSTEMTIME systemtime;
|
|
FILETIME filetime;
|
|
HRESULT hr = S_OK;
|
|
|
|
if (VariantTimeToSystemTime(daValue,
|
|
&systemtime) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
if (SystemTimeToFileTime(&systemtime,
|
|
&filetime) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
if (LocalFileTimeToFileTime(&filetime, &filetime ) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
hr = CoCreateInstance(
|
|
CLSID_LargeInteger,
|
|
NULL,
|
|
CLSCTX_ALL,
|
|
IID_IADsLargeInteger,
|
|
(void**)&pTime
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pTime->put_HighPart(filetime.dwHighDateTime);
|
|
BAIL_ON_FAILURE(hr);
|
|
hr = pTime->put_LowPart(filetime.dwLowDateTime);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
VariantInit(pvarInputData);
|
|
pvarInputData->pdispVal = pTime;
|
|
pvarInputData->vt = VT_DISPATCH;
|
|
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
UnpackFILETIMEfromVariant(
|
|
VARIANT varSrcData,
|
|
DATE * pdaValue
|
|
)
|
|
{
|
|
IADsLargeInteger *pLarge = NULL;
|
|
IDispatch *pDispatch = NULL;
|
|
FILETIME filetime;
|
|
FILETIME locFiletime;
|
|
SYSTEMTIME systemtime;
|
|
DATE date;
|
|
HRESULT hr = S_OK;
|
|
|
|
if( varSrcData.vt != VT_DISPATCH){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
pDispatch = varSrcData.pdispVal;
|
|
hr = pDispatch->QueryInterface(IID_IADsLargeInteger, (VOID **) &pLarge);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pLarge->get_HighPart((long*)&filetime.dwHighDateTime);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = pLarge->get_LowPart((long*)&filetime.dwLowDateTime);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
//
|
|
// time is "0" actually means that either user never logs on or property not known
|
|
//
|
|
if (filetime.dwLowDateTime == 0 && filetime.dwHighDateTime == 0) {
|
|
hr = E_ADS_PROPERTY_NOT_FOUND;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
if (FileTimeToLocalFileTime(&filetime, &locFiletime) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
if (FileTimeToSystemTime(&locFiletime,
|
|
&systemtime) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
if (SystemTimeToVariantTime(&systemtime,
|
|
&date) == 0) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
*pdaValue = date;
|
|
error:
|
|
return hr;
|
|
}
|
|
|
|
HRESULT
|
|
PackVARIANT_BOOLinVariant(
|
|
VARIANT_BOOL fValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
VariantInit(pvarInputData);
|
|
|
|
pvarInputData->vt = VT_BOOL;
|
|
V_BOOL(pvarInputData) = fValue;
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
UnpackVARIANT_BOOLfromVariant(
|
|
VARIANT varSrcData,
|
|
VARIANT_BOOL * pfValue
|
|
)
|
|
{
|
|
if( varSrcData.vt != VT_BOOL){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
*pfValue = V_BOOL(&varSrcData);
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PackVARIANTinVariant(
|
|
VARIANT vaValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
VariantInit(pvarInputData);
|
|
|
|
pvarInputData->vt = VT_VARIANT;
|
|
RRETURN( VariantCopy( pvarInputData, &vaValue ));
|
|
}
|
|
|
|
HRESULT
|
|
UnpackVARIANTfromVariant(
|
|
VARIANT varSrcData,
|
|
VARIANT * pvaValue
|
|
)
|
|
{
|
|
VariantInit( pvaValue );
|
|
|
|
RRETURN( VariantCopy( pvaValue, &varSrcData ));
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PackDATEinLONGVariant(
|
|
DATE daValue,
|
|
VARIANT * pvarInputData
|
|
)
|
|
{
|
|
LONG lValue;
|
|
HRESULT hr = S_OK;
|
|
SYSTEMTIME stSystemTime;
|
|
SYSTEMTIME LocalTime;
|
|
FILETIME LocalFileTime;
|
|
FILETIME FileTimeCurrent;
|
|
DATE date ;
|
|
BOOL fRetval;
|
|
|
|
VariantInit(pvarInputData);
|
|
|
|
if( hr = ConvertDATEToSYSTEMTIME(daValue,
|
|
&LocalTime)
|
|
) {
|
|
RRETURN( hr );
|
|
}
|
|
|
|
fRetval = SystemTimeToFileTime(&LocalTime,
|
|
&LocalFileTime);
|
|
if(!fRetval){
|
|
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
|
|
fRetval = LocalFileTimeToFileTime(
|
|
&LocalFileTime,
|
|
&FileTimeCurrent
|
|
);
|
|
if(!fRetval){
|
|
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
|
|
fRetval = FileTimeToSystemTime(&FileTimeCurrent,
|
|
&stSystemTime);
|
|
if(!fRetval){
|
|
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
lValue = stSystemTime.wHour * 60 + stSystemTime.wMinute;
|
|
|
|
pvarInputData->vt = VT_I4;
|
|
V_I4(pvarInputData) = lValue;
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
HRESULT
|
|
UnpackDATEfromLONGVariant(
|
|
VARIANT varSrcData,
|
|
DATE * pdaValue
|
|
)
|
|
{
|
|
LONG lValue;
|
|
SYSTEMTIME stSystemTime;
|
|
SYSTEMTIME LocalTime;
|
|
DATE date ;
|
|
BOOL fRetval;
|
|
HRESULT hr = S_OK;
|
|
|
|
if( varSrcData.vt != VT_I4){
|
|
RRETURN(E_ADS_CANT_CONVERT_DATATYPE);
|
|
}
|
|
|
|
lValue = V_I4(&varSrcData);
|
|
|
|
GetSystemTime( &stSystemTime);
|
|
|
|
|
|
stSystemTime.wHour = (WORD)(lValue)/60;
|
|
stSystemTime.wMinute = (WORD)(lValue)%60;
|
|
stSystemTime.wSecond =0;
|
|
stSystemTime.wMilliseconds = 0;
|
|
|
|
fRetval = SystemTimeToTzSpecificLocalTime(
|
|
NULL,
|
|
&stSystemTime,
|
|
&LocalTime
|
|
);
|
|
if(!fRetval){
|
|
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
|
|
hr = ConvertSystemTimeToDATE (LocalTime,
|
|
pdaValue);
|
|
|
|
//lpVarDestObject->date = date - (DWORD)date;
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
|
|
|