00001 /* 00002 Free Download Manager Copyright (c) 2003-2007 FreeDownloadManager.ORG 00003 */ 00004 00005 #include "StdAfx.h" 00006 00007 #ifndef _WIN32 00008 00009 #include "MyWindows.h" 00010 #include "Types.h" 00011 #include <malloc.h> 00012 00013 static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); } 00014 static inline void FreeForBSTR(void *pv) { ::free(pv);} 00015 00016 static UINT MyStringLen(const wchar_t *s) 00017 { 00018 UINT i; 00019 for (i = 0; s[i] != '\0'; i++); 00020 return i; 00021 } 00022 00023 BSTR SysAllocStringByteLen(LPCSTR psz, UINT len) 00024 { 00025 int realLen = len + sizeof(UINT) + sizeof(OLECHAR) + sizeof(OLECHAR); 00026 void *p = AllocateForBSTR(realLen); 00027 if (p == 0) 00028 return 0; 00029 *(UINT *)p = len; 00030 BSTR bstr = (BSTR)((UINT *)p + 1); 00031 memmove(bstr, psz, len); 00032 Byte *pb = ((Byte *)bstr) + len; 00033 for (int i = 0; i < sizeof(OLECHAR) * 2; i++) 00034 pb[i] = 0; 00035 return bstr; 00036 } 00037 00038 BSTR SysAllocString(const OLECHAR *sz) 00039 { 00040 if (sz == 0) 00041 return 0; 00042 UINT strLen = MyStringLen(sz); 00043 UINT len = (strLen + 1) * sizeof(OLECHAR); 00044 void *p = AllocateForBSTR(len + sizeof(UINT)); 00045 if (p == 0) 00046 return 0; 00047 *(UINT *)p = strLen; 00048 BSTR bstr = (BSTR)((UINT *)p + 1); 00049 memmove(bstr, sz, len); 00050 return bstr; 00051 } 00052 00053 void SysFreeString(BSTR bstr) 00054 { 00055 if (bstr != 0) 00056 FreeForBSTR((UINT *)bstr - 1); 00057 } 00058 00059 UINT SysStringByteLen(BSTR bstr) 00060 { 00061 if (bstr == 0) 00062 return 0; 00063 return *((UINT *)bstr - 1); 00064 } 00065 00066 UINT SysStringLen(BSTR bstr) 00067 { 00068 return SysStringByteLen(bstr) / sizeof(OLECHAR); 00069 } 00070 00071 HRESULT VariantClear(VARIANTARG *prop) 00072 { 00073 if (prop->vt == VT_BSTR) 00074 SysFreeString(prop->bstrVal); 00075 prop->vt = VT_EMPTY; 00076 return S_OK; 00077 } 00078 00079 HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src) 00080 { 00081 HRESULT res = ::VariantClear(dest); 00082 if (res != S_OK) 00083 return res; 00084 if (src->vt == VT_BSTR) 00085 { 00086 dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, 00087 SysStringByteLen(src->bstrVal)); 00088 if (dest->bstrVal == 0) 00089 return E_OUTOFMEMORY; 00090 dest->vt = VT_BSTR; 00091 } 00092 else 00093 *dest = *src; 00094 return S_OK; 00095 } 00096 00097 LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2) 00098 { 00099 if(ft1->dwHighDateTime < ft2->dwHighDateTime) 00100 return -1; 00101 if(ft1->dwHighDateTime > ft2->dwHighDateTime) 00102 return 1; 00103 if(ft1->dwLowDateTime < ft2->dwLowDateTime) 00104 return -1; 00105 if(ft1->dwLowDateTime > ft2->dwLowDateTime) 00106 return 1; 00107 return 0; 00108 } 00109 00110 DWORD GetLastError() 00111 { 00112 return 0; 00113 } 00114 00115 #endif
1.5.6