|
1 // MyWindows.cpp |
|
2 |
|
3 #include "StdAfx.h" |
|
4 |
|
5 #ifndef _WIN32 |
|
6 |
|
7 #include "MyWindows.h" |
|
8 #include "Types.h" |
|
9 #include <malloc.h> |
|
10 |
|
11 static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); } |
|
12 static inline void FreeForBSTR(void *pv) { ::free(pv);} |
|
13 |
|
14 static UINT MyStringLen(const wchar_t *s) |
|
15 { |
|
16 UINT i; |
|
17 for (i = 0; s[i] != '\0'; i++); |
|
18 return i; |
|
19 } |
|
20 |
|
21 BSTR SysAllocStringByteLen(LPCSTR psz, UINT len) |
|
22 { |
|
23 int realLen = len + sizeof(UINT) + sizeof(OLECHAR) + sizeof(OLECHAR); |
|
24 void *p = AllocateForBSTR(realLen); |
|
25 if (p == 0) |
|
26 return 0; |
|
27 *(UINT *)p = len; |
|
28 BSTR bstr = (BSTR)((UINT *)p + 1); |
|
29 memmove(bstr, psz, len); |
|
30 Byte *pb = ((Byte *)bstr) + len; |
|
31 for (int i = 0; i < sizeof(OLECHAR) * 2; i++) |
|
32 pb[i] = 0; |
|
33 return bstr; |
|
34 } |
|
35 |
|
36 BSTR SysAllocString(const OLECHAR *sz) |
|
37 { |
|
38 if (sz == 0) |
|
39 return 0; |
|
40 UINT strLen = MyStringLen(sz); |
|
41 UINT len = (strLen + 1) * sizeof(OLECHAR); |
|
42 void *p = AllocateForBSTR(len + sizeof(UINT)); |
|
43 if (p == 0) |
|
44 return 0; |
|
45 *(UINT *)p = strLen; |
|
46 BSTR bstr = (BSTR)((UINT *)p + 1); |
|
47 memmove(bstr, sz, len); |
|
48 return bstr; |
|
49 } |
|
50 |
|
51 void SysFreeString(BSTR bstr) |
|
52 { |
|
53 if (bstr != 0) |
|
54 FreeForBSTR((UINT *)bstr - 1); |
|
55 } |
|
56 |
|
57 UINT SysStringByteLen(BSTR bstr) |
|
58 { |
|
59 if (bstr == 0) |
|
60 return 0; |
|
61 return *((UINT *)bstr - 1); |
|
62 } |
|
63 |
|
64 UINT SysStringLen(BSTR bstr) |
|
65 { |
|
66 return SysStringByteLen(bstr) / sizeof(OLECHAR); |
|
67 } |
|
68 |
|
69 HRESULT VariantClear(VARIANTARG *prop) |
|
70 { |
|
71 if (prop->vt == VT_BSTR) |
|
72 SysFreeString(prop->bstrVal); |
|
73 prop->vt = VT_EMPTY; |
|
74 return S_OK; |
|
75 } |
|
76 |
|
77 HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src) |
|
78 { |
|
79 HRESULT res = ::VariantClear(dest); |
|
80 if (res != S_OK) |
|
81 return res; |
|
82 if (src->vt == VT_BSTR) |
|
83 { |
|
84 dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal, |
|
85 SysStringByteLen(src->bstrVal)); |
|
86 if (dest->bstrVal == 0) |
|
87 return E_OUTOFMEMORY; |
|
88 dest->vt = VT_BSTR; |
|
89 } |
|
90 else |
|
91 *dest = *src; |
|
92 return S_OK; |
|
93 } |
|
94 |
|
95 LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2) |
|
96 { |
|
97 if(ft1->dwHighDateTime < ft2->dwHighDateTime) |
|
98 return -1; |
|
99 if(ft1->dwHighDateTime > ft2->dwHighDateTime) |
|
100 return 1; |
|
101 if(ft1->dwLowDateTime < ft2->dwLowDateTime) |
|
102 return -1; |
|
103 if(ft1->dwLowDateTime > ft2->dwLowDateTime) |
|
104 return 1; |
|
105 return 0; |
|
106 } |
|
107 |
|
108 DWORD GetLastError() |
|
109 { |
|
110 return 0; |
|
111 } |
|
112 |
|
113 #endif |