// MyWindows.h #ifdef Z7_DEFINE_GUID #undef Z7_DEFINE_GUID #endif #ifdef INITGUID #define Z7_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID name; \ EXTERN_C const GUID name = { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } #else #define Z7_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID name #endif #ifndef ZIP7_INC_MY_WINDOWS_H #define ZIP7_INC_MY_WINDOWS_H #ifdef _WIN32 #include "../../C/7zWindows.h" #else // _WIN32 #include // for wchar_t #include // #include // for uintptr_t #include "../../C/7zTypes.h" #include "MyGuidDef.h" // WINAPI is __stdcall in Windows-MSVC in windef.h #define WINAPI typedef char CHAR; typedef unsigned char UCHAR; #undef BYTE typedef unsigned char BYTE; typedef short SHORT; typedef unsigned short USHORT; #undef WORD typedef unsigned short WORD; typedef short VARIANT_BOOL; #define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff)) #define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16)) // MS uses long for BOOL, but long is 32-bit in MS. So we use int. // typedef long BOOL; typedef int BOOL; #ifndef FALSE #define FALSE 0 #define TRUE 1 #endif // typedef size_t ULONG_PTR; // typedef size_t DWORD_PTR; // typedef uintptr_t UINT_PTR; // typedef ptrdiff_t UINT_PTR; typedef Int64 LONGLONG; typedef UInt64 ULONGLONG; typedef struct _LARGE_INTEGER { LONGLONG QuadPart; } LARGE_INTEGER; typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart; } ULARGE_INTEGER; typedef const CHAR *LPCSTR; typedef CHAR TCHAR; typedef const TCHAR *LPCTSTR; typedef wchar_t WCHAR; typedef WCHAR OLECHAR; typedef const WCHAR *LPCWSTR; typedef OLECHAR *BSTR; typedef const OLECHAR *LPCOLESTR; typedef OLECHAR *LPOLESTR; typedef struct _FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; } FILETIME; #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) #define FAILED(hr) ((HRESULT)(hr) < 0) typedef ULONG PROPID; typedef LONG SCODE; #define S_OK ((HRESULT)0x00000000L) #define S_FALSE ((HRESULT)0x00000001L) #define E_NOTIMPL ((HRESULT)0x80004001L) #define E_NOINTERFACE ((HRESULT)0x80004002L) #define E_ABORT ((HRESULT)0x80004004L) #define E_FAIL ((HRESULT)0x80004005L) #define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L) #define CLASS_E_CLASSNOTAVAILABLE ((HRESULT)0x80040111L) #ifdef _MSC_VER #define STDMETHODCALLTYPE __stdcall #define STDAPICALLTYPE __stdcall #else // do we need __export here? #define STDMETHODCALLTYPE #define STDAPICALLTYPE #endif #define STDAPI EXTERN_C HRESULT STDAPICALLTYPE #ifndef DECLSPEC_NOTHROW #define DECLSPEC_NOTHROW Z7_DECLSPEC_NOTHROW #endif #ifndef DECLSPEC_NOVTABLE #define DECLSPEC_NOVTABLE Z7_DECLSPEC_NOVTABLE #endif #ifndef COM_DECLSPEC_NOTHROW #ifdef COM_STDMETHOD_CAN_THROW #define COM_DECLSPEC_NOTHROW #else #define COM_DECLSPEC_NOTHROW DECLSPEC_NOTHROW #endif #endif #define DECLARE_INTERFACE(iface) struct DECLSPEC_NOVTABLE iface #define DECLARE_INTERFACE_(iface, baseiface) struct DECLSPEC_NOVTABLE iface : public baseiface #define STDMETHOD_(t, f) virtual COM_DECLSPEC_NOTHROW t STDMETHODCALLTYPE f #define STDMETHOD(f) STDMETHOD_(HRESULT, f) #define STDMETHODIMP_(t) COM_DECLSPEC_NOTHROW t STDMETHODCALLTYPE #define STDMETHODIMP STDMETHODIMP_(HRESULT) #define PURE = 0 // #define MIDL_INTERFACE(x) struct #ifdef __cplusplus /* p7zip and 7-Zip before v23 used virtual destructor in IUnknown, if _WIN32 is not defined. It used virtual destructor, because some compilers don't like virtual interfaces without virtual destructor. IUnknown in Windows (_WIN32) doesn't use virtual destructor in IUnknown. We still can define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN here, if we want to be compatible with old plugin interface of p7zip and 7-Zip before v23. v23: In new 7-Zip v23 we try to be more compatible with original IUnknown from _WIN32. So we do not define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN here, */ // #define Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN #ifdef Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN #if defined(__clang__) #pragma GCC diagnostic ignored "-Winconsistent-missing-destructor-override" #endif #endif Z7_PURE_INTERFACES_BEGIN DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); struct IUnknown { STDMETHOD(QueryInterface) (REFIID iid, void **outObject) =0; STDMETHOD_(ULONG, AddRef)() =0; STDMETHOD_(ULONG, Release)() =0; #ifdef Z7_USE_VIRTUAL_DESTRUCTOR_IN_IUNKNOWN virtual ~IUnknown() {} #endif }; typedef IUnknown *LPUNKNOWN; Z7_PURE_INTERFACES_END #endif // __cplusplus #define VARIANT_TRUE ((VARIANT_BOOL)-1) #define VARIANT_FALSE ((VARIANT_BOOL)0) enum VARENUM { VT_EMPTY = 0, VT_NULL = 1, VT_I2 = 2, VT_I4 = 3, VT_R4 = 4, VT_R8 = 5, VT_CY = 6, VT_DATE = 7, VT_BSTR = 8, VT_DISPATCH = 9, VT_ERROR = 10, VT_BOOL = 11, VT_VARIANT = 12, VT_UNKNOWN = 13, VT_DECIMAL = 14, VT_I1 = 16, VT_UI1 = 17, VT_UI2 = 18, VT_UI4 = 19, VT_I8 = 20, VT_UI8 = 21, VT_INT = 22, VT_UINT = 23, VT_VOID = 24, VT_HRESULT = 25, VT_FILETIME = 64 }; typedef unsigned short VARTYPE; typedef WORD PROPVAR_PAD1; typedef WORD PROPVAR_PAD2; typedef WORD PROPVAR_PAD3; typedef struct tagPROPVARIANT { VARTYPE vt; PROPVAR_PAD1 wReserved1; PROPVAR_PAD2 wReserved2; PROPVAR_PAD3 wReserved3; union { CHAR cVal; UCHAR bVal; SHORT iVal; USHORT uiVal; LONG lVal; ULONG ulVal; INT intVal; UINT uintVal; LARGE_INTEGER hVal; ULARGE_INTEGER uhVal; VARIANT_BOOL boolVal; SCODE scode; FILETIME filetime; BSTR bstrVal; }; } PROPVARIANT; typedef PROPVARIANT tagVARIANT; typedef tagVARIANT VARIANT; typedef VARIANT VARIANTARG; EXTERN_C HRESULT VariantClear(VARIANTARG *prop); EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src); typedef struct tagSTATPROPSTG { LPOLESTR lpwstrName; PROPID propid; VARTYPE vt; } STATPROPSTG; EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len); EXTERN_C BSTR SysAllocStringLen(const OLECHAR *sz, UINT len); EXTERN_C BSTR SysAllocString(const OLECHAR *sz); EXTERN_C void SysFreeString(BSTR bstr); EXTERN_C UINT SysStringByteLen(BSTR bstr); EXTERN_C UINT SysStringLen(BSTR bstr); EXTERN_C DWORD GetLastError(); EXTERN_C void SetLastError(DWORD dwCode); EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2); EXTERN_C DWORD GetCurrentThreadId(); EXTERN_C DWORD GetCurrentProcessId(); #define MAX_PATH 1024 #define CP_ACP 0 #define CP_OEMCP 1 #define CP_UTF8 65001 typedef enum tagSTREAM_SEEK { STREAM_SEEK_SET = 0, STREAM_SEEK_CUR = 1, STREAM_SEEK_END = 2 } STREAM_SEEK; typedef struct _SYSTEMTIME { WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME; BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *fileTime, FILETIME *localFileTime); BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *localFileTime, FILETIME *fileTime); BOOL WINAPI FileTimeToSystemTime(const FILETIME *fileTime, SYSTEMTIME *systemTime); // VOID WINAPI GetSystemTimeAsFileTime(FILETIME *systemTimeAsFileTime); DWORD GetTickCount(); #define CREATE_NEW 1 #define CREATE_ALWAYS 2 #define OPEN_EXISTING 3 #define OPEN_ALWAYS 4 #define TRUNCATE_EXISTING 5 #endif // _WIN32 #endif