1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/Common/MyWindows.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,113 @@ 1.4 +// MyWindows.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#ifndef _WIN32 1.9 + 1.10 +#include "MyWindows.h" 1.11 +#include "Types.h" 1.12 +#include <malloc.h> 1.13 + 1.14 +static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); } 1.15 +static inline void FreeForBSTR(void *pv) { ::free(pv);} 1.16 + 1.17 +static UINT MyStringLen(const wchar_t *s) 1.18 +{ 1.19 + UINT i; 1.20 + for (i = 0; s[i] != '\0'; i++); 1.21 + return i; 1.22 +} 1.23 + 1.24 +BSTR SysAllocStringByteLen(LPCSTR psz, UINT len) 1.25 +{ 1.26 + int realLen = len + sizeof(UINT) + sizeof(OLECHAR) + sizeof(OLECHAR); 1.27 + void *p = AllocateForBSTR(realLen); 1.28 + if (p == 0) 1.29 + return 0; 1.30 + *(UINT *)p = len; 1.31 + BSTR bstr = (BSTR)((UINT *)p + 1); 1.32 + memmove(bstr, psz, len); 1.33 + Byte *pb = ((Byte *)bstr) + len; 1.34 + for (int i = 0; i < sizeof(OLECHAR) * 2; i++) 1.35 + pb[i] = 0; 1.36 + return bstr; 1.37 +} 1.38 + 1.39 +BSTR SysAllocString(const OLECHAR *sz) 1.40 +{ 1.41 + if (sz == 0) 1.42 + return 0; 1.43 + UINT strLen = MyStringLen(sz); 1.44 + UINT len = (strLen + 1) * sizeof(OLECHAR); 1.45 + void *p = AllocateForBSTR(len + sizeof(UINT)); 1.46 + if (p == 0) 1.47 + return 0; 1.48 + *(UINT *)p = strLen; 1.49 + BSTR bstr = (BSTR)((UINT *)p + 1); 1.50 + memmove(bstr, sz, len); 1.51 + return bstr; 1.52 +} 1.53 + 1.54 +void SysFreeString(BSTR bstr) 1.55 +{ 1.56 + if (bstr != 0) 1.57 + FreeForBSTR((UINT *)bstr - 1); 1.58 +} 1.59 + 1.60 +UINT SysStringByteLen(BSTR bstr) 1.61 +{ 1.62 + if (bstr == 0) 1.63 + return 0; 1.64 + return *((UINT *)bstr - 1); 1.65 +} 1.66 + 1.67 +UINT SysStringLen(BSTR bstr) 1.68 +{ 1.69 + return SysStringByteLen(bstr) / sizeof(OLECHAR); 1.70 +} 1.71 + 1.72 +HRESULT VariantClear(VARIANTARG *prop) 1.73 +{ 1.74 + if (prop->vt == VT_BSTR) 1.75 + SysFreeString(prop->bstrVal); 1.76 + prop->vt = VT_EMPTY; 1.77 + return S_OK; 1.78 +} 1.79 + 1.80 +HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src) 1.81 +{ 1.82 + HRESULT res = ::VariantClear(dest); 1.83 + if (res != S_OK) 1.84 + return res; 1.85 + if (src->vt == VT_BSTR) 1.86 + { 1.87 + dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, 1.88 + SysStringByteLen(src->bstrVal)); 1.89 + if (dest->bstrVal == 0) 1.90 + return E_OUTOFMEMORY; 1.91 + dest->vt = VT_BSTR; 1.92 + } 1.93 + else 1.94 + *dest = *src; 1.95 + return S_OK; 1.96 +} 1.97 + 1.98 +LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2) 1.99 +{ 1.100 + if(ft1->dwHighDateTime < ft2->dwHighDateTime) 1.101 + return -1; 1.102 + if(ft1->dwHighDateTime > ft2->dwHighDateTime) 1.103 + return 1; 1.104 + if(ft1->dwLowDateTime < ft2->dwLowDateTime) 1.105 + return -1; 1.106 + if(ft1->dwLowDateTime > ft2->dwLowDateTime) 1.107 + return 1; 1.108 + return 0; 1.109 +} 1.110 + 1.111 +DWORD GetLastError() 1.112 +{ 1.113 + return 0; 1.114 +} 1.115 + 1.116 +#endif