Recovery of release 990110 after disk crash.
See Changelog for changes between 990103 and 990110.
diff --git a/include/acconfig.h b/include/acconfig.h
index 35c7acf..19e6bba 100644
--- a/include/acconfig.h
+++ b/include/acconfig.h
@@ -63,6 +63,9 @@
/* Define if we can use curses (if no ncurses) for full-screen access */
#undef HAVE_LIBCURSES
+/* Define if ncurses have the new resizeterm function */
+#undef HAVE_RESIZETERM
+
/* Define if we can a compatible xterm program */
#undef XTERM_PROGRAM
diff --git a/include/commctrl.h b/include/commctrl.h
index 00e0953..49c888b 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -93,6 +93,7 @@
#define I_IMAGECALLBACK (-1)
#define I_INDENTCALLBACK (-1)
+#define I_CHILDRENCALLBACK (-1)
/* owner drawn types */
@@ -117,6 +118,66 @@
#define SNDMSG WINELIB_NAME_AW(SendMessage)
+
+/* Custom Draw messages */
+
+#define CDRF_DODEFAULT 0x0
+#define CDRF_NEWFONT 0x00000002
+#define CDRF_SKIPDEFAULT 0x00000004
+#define CDRF_NOTIFYPOSTPAINT 0x00000010
+#define CDRF_NOTIFYITEMDRAW 0x00000020
+#define CDRF_NOTIFYSUBITEMDRAW 0x00000020
+#define CDRF_NOTIFYPOSTERASE 0x00000040
+/* #define CDRF_NOTIFYITEMERASE 0x00000080 obsolete ? */
+
+
+/* drawstage flags */
+
+#define CDDS_PREPAINT 1
+#define CDDS_POSTPAINT 2
+#define CDDS_PREERASE 3
+#define CDDS_POSTERASE 4
+
+#define CDDS_ITEM 0x00010000
+#define CDDS_ITEMPREPAINT (CDDS_ITEM | CDDS_PREPAINT)
+#define CDDS_ITEMPOSTPAINT (CDDS_ITEM | CDDS_POSTPAINT)
+#define CDDS_ITEMPREERASE (CDDS_ITEM | CDDS_PREERASE)
+#define CDDS_ITEMPOSTERASE (CDDS_ITEM | CDDS_POSTERASE)
+#define CDDS_SUBITEM 0x00020000
+
+/* itemState flags */
+
+#define CDIS_SELECTED 0x0001
+#define CDIS_GRAYED 0x0002
+#define CDIS_DISABLED 0x0004
+#define CDIS_CHECKED 0x0008
+#define CDIS_FOCUS 0x0010
+#define CDIS_DEFAULT 0x0020
+#define CDIS_HOT 0x0040
+#define CDIS_MARKED 0x0080
+#define CDIS_INDETERMINATE 0x0100
+
+
+typedef struct tagNMCUSTOMDRAWINFO
+{
+ NMHDR hdr;
+ DWORD dwDrawStage;
+ HDC32 hdc;
+ RECT32 rc;
+ DWORD dwItemSpec;
+ UINT32 uItemState;
+ LPARAM lItemlParam;
+} NMCUSTOMDRAW, *LPNMCUSTOMDRAW;
+
+typedef struct tagNMTTCUSTOMDRAW
+{
+ NMCUSTOMDRAW nmcd;
+ UINT32 uDrawFlags;
+} NMTTCUSTOMDRAW, *LPNMTTCUSTOMDRAW;
+
+
+
+
/* StatusWindow */
#define STATUSCLASSNAME16 "msctls_statusbar"
@@ -395,6 +456,28 @@
#define ImageList_RemoveAll(himl) ImageList_Remove(himl,-1)
+/* Flat Scrollbar control */
+
+#define FLATSB_CLASS16 "flatsb_class"
+#define FLATSB_CLASS32A "flatsb_class32"
+#define FLATSB_CLASS32W L"flatsb_class32"
+#define FLATSB_CLASS WINELIB_NAME_AW(FLATSB_CLASS)
+
+BOOL32 WINAPI FlatSB_EnableScrollBar(HWND32, INT32, UINT32);
+BOOL32 WINAPI FlatSB_ShowScrollBar(HWND32, INT32, BOOL32);
+BOOL32 WINAPI FlatSB_GetScrollRange(HWND32, INT32, LPINT32, LPINT32);
+BOOL32 WINAPI FlatSB_GetScrollInfo(HWND32, INT32, LPSCROLLINFO);
+INT32 WINAPI FlatSB_GetScrollPos(HWND32, INT32);
+BOOL32 WINAPI FlatSB_GetScrollProp(HWND32, INT32, LPINT32);
+INT32 WINAPI FlatSB_SetScrollPos(HWND32, INT32, INT32, BOOL32);
+INT32 WINAPI FlatSB_SetScrollInfo(HWND32, INT32, LPSCROLLINFO, BOOL32);
+INT32 WINAPI FlatSB_SetScrollRange(HWND32, INT32, INT32, INT32, BOOL32);
+BOOL32 WINAPI FlatSB_SetScrollProp(HWND32, UINT32, INT32, BOOL32);
+BOOL32 WINAPI InitializeFlatSB(HWND32);
+HRESULT WINAPI UninitializeFlatSB(HWND32);
+
+
+
/* Header control */
#define WC_HEADER16 "SysHeader"
@@ -2307,9 +2390,15 @@
#define TCM_GETIMAGELIST (TCM_FIRST + 2)
#define TCM_SETIMAGELIST (TCM_FIRST + 3)
#define TCM_GETITEMCOUNT (TCM_FIRST + 4)
-#define TCM_GETITEM (TCM_FIRST + 5)
-#define TCM_SETITEM (TCM_FIRST + 6)
-#define TCM_INSERTITEM (TCM_FIRST + 7)
+#define TCM_GETITEM WINELIB_NAME_AW(TCM_GETITEM)
+#define TCM_GETITEM32A (TCM_FIRST + 5)
+#define TCM_GETITEM32W (TCM_FIRST + 60)
+#define TCM_SETITEM32A (TCM_FIRST + 6)
+#define TCM_SETITEM32W (TCM_FIRST + 61)
+#define TCM_SETITEM WINELIB_NAME_AW(TCM_SETITEM)
+#define TCM_INSERTITEM32A (TCM_FIRST + 7)
+#define TCM_INSERTITEM32W (TCM_FIRST + 62)
+#define TCM_INSERTITEM WINELIB_NAME_AW(TCM_INSERTITEM)
#define TCM_DELETEITEM (TCM_FIRST + 8)
#define TCM_DELETEALLITEMS (TCM_FIRST + 9)
#define TCM_GETITEMRECT (TCM_FIRST + 10)
@@ -2328,27 +2417,51 @@
#define TCM_SETCURFOCUS (TCM_FIRST + 48)
#define TCM_SETMINTTABWIDTH (TCM_FIRST + 49)
#define TCM_DESELECTALL (TCM_FIRST + 50)
+#define TCM_HIGHLIGHTITEM (TCM_FIRST + 51)
+#define TCM_SETEXTENDEDSTYLE (TCM_FIRST + 52)
+#define TCM_GETEXTENDEDSTYLE (TCM_FIRST + 53)
+#define TCM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT
+#define TCM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT
+
#define TCIF_TEXT 0x0001
#define TCIF_IMAGE 0x0002
#define TCIF_RTLREADING 0x0004
#define TCIF_PARAM 0x0008
+#define TCIF_STATE 0x0010
-typedef struct tagTCITEM {
+
+typedef struct tagTCITEM32A {
UINT32 mask;
- UINT32 lpReserved1;
- UINT32 lpReserved2;
+ UINT32 dwState;
+ UINT32 dwStateMask;
LPSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
-} TCITEM, *LPTCITEM;
+} TCITEM32A, *LPTCITEM32A;
+
+typedef struct tagTCITEM32W
+{
+ UINT32 mask;
+ DWORD dwState;
+ DWORD dwStateMask;
+ LPWSTR pszText;
+ INT32 cchTextMax;
+ INT32 iImage;
+ LPARAM lParam;
+} TCITEM32W, *LPTCITEM32W;
+
+#define TCITEM WINELIB_NAME_AW(TCITEM)
+#define LPTCITEM WINELIB_NAME_AW(LPTCITEM)
+
#define TCN_FIRST (0U-550U)
#define TCN_LAST (0U-580U)
#define TCN_KEYDOWN (TCN_FIRST - 0)
#define TCN_SELCHANGE (TCN_FIRST - 1)
#define TCN_SELCHANGING (TCN_FIRST - 2)
+#define TCN_GETOBJECT (TCN_FIRST - 3)
/* ComboBoxEx control */
@@ -2522,6 +2635,36 @@
#define DATETIMEPICK_CLASS32W L"SysDateTimePick32"
#define DATETIMEPICK_CLASS WINELIB_NAME_AW(DATETIMEPICK_CLASS)
+#define DTM_FIRST 0x1000
+
+#define DTM_GETSYSTEMTIME (DTM_FIRST+1)
+#define DTM_SETSYSTEMTIME (DTM_FIRST+2)
+#define DTM_GETRANGE (DTM_FIRST+3)
+#define DTM_SETRANGE (DTM_FIRST+4)
+#define DTM_SETFORMAT32A (DTM_FIRST+5)
+#define DTM_SETFORMAT32W (DTM_FIRST + 50)
+#define DTM_SETFORMAT WINELIB_NAME_AW(DTM_SETFORMAT)
+#define DTM_SETMCCOLOR (DTM_FIRST+6)
+#define DTM_GETMCCOLOR (DTM_FIRST+7)
+
+#define DTM_GETMONTHCAL (DTM_FIRST+8)
+
+#define DTM_SETMCFONT (DTM_FIRST+9)
+#define DTM_GETMCFONT (DTM_FIRST+10)
+
+
+
+
+#define GDT_ERROR -1
+#define GDT_VALID 0
+#define GDT_NONE 1
+
+#define GDTR_MIN 0x0001
+#define GDTR_MAX 0x0002
+
+
+
+
/**************************************************************************
* UNDOCUMENTED functions
@@ -2624,6 +2767,13 @@
/*
* Property sheet support (callback procs)
*/
+
+
+#define WC_PROPSHEET32A "SysPager"
+#define WC_PROPSHEET32W L"SysPager"
+#define WC_PROPSHEET WINELIB_NAME_AW(WC_PROPSHEET)
+
+
struct _PROPSHEETPAGE32A; /** need to forward declare those structs **/
struct _PROPSHEETPAGE32W;
struct _PSP;
diff --git a/include/compobj.h b/include/compobj.h
index ecd57eb..e1b372b 100644
--- a/include/compobj.h
+++ b/include/compobj.h
@@ -1,43 +1,8 @@
-#ifndef COMPOBJ_H
-#define COMPOBJ_H
+#ifndef __WINE_COMPOBJ_H
+#define __WINE_COMPOBJ_H
-#include "ole.h"
+/* "compobj.h" is obsolete, you should include "objbase.h" instead */
-struct tagGUID
-{
- DWORD Data1;
- WORD Data2;
- WORD Data3;
- BYTE Data4[8];
-};
+#include "objbase.h"
-typedef struct tagGUID GUID,*LPGUID,*REFGUID;
-typedef struct tagGUID CLSID,*LPCLSID,*REFCLSID;
-typedef struct tagGUID IID,*REFIID,*LPIID;
-
-OLESTATUS WINAPI StringFromCLSID16(const CLSID *id, LPOLESTR16*);
-OLESTATUS WINAPI StringFromCLSID32(const CLSID *id, LPOLESTR32*);
-#define StringFromCLSID WINELIB_NAME(StringFromCLSID)
-OLESTATUS WINAPI CLSIDFromString16(LPCOLESTR16, CLSID *);
-OLESTATUS WINAPI CLSIDFromString32(LPCOLESTR32, CLSID *);
-#define CLSIDFromString WINELIB_NAME(CLSIDFromString)
-
-OLESTATUS WINAPI WINE_StringFromCLSID(const CLSID *id, LPSTR);
-
-INT32 WINAPI StringFromGUID2(REFGUID id, LPOLESTR32 str, INT32 cmax);
-
-
-#ifdef INITGUID
-#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- const GUID name =\
- { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
-#else
-#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- extern const GUID name
-#endif
-
-#define DEFINE_OLEGUID(name, l, w1, w2) \
- DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
-
-#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2)
-#endif
+#endif /* __WINE_COMPOBJ_H */
diff --git a/include/config.h.in b/include/config.h.in
index 75367e9..9f12234 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -69,6 +69,9 @@
/* Define if the struct statfs is defined by <sys/mount.h> */
#undef STATFS_DEFINED_BY_SYS_MOUNT
+/* Define if ncurses have the new resizeterm function */
+#undef HAVE_RESIZETERM
+
/* Define if IPX should use netipx/ipx.h from libc */
#undef HAVE_IPX_GNU
@@ -153,6 +156,9 @@
/* Define if you have the <sys/cdio.h> header file. */
#undef HAVE_SYS_CDIO_H
+/* Define if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
/* Define if you have the <sys/filio.h> header file. */
#undef HAVE_SYS_FILIO_H
diff --git a/include/d3d.h b/include/d3d.h
index d572933..34e0cac 100644
--- a/include/d3d.h
+++ b/include/d3d.h
@@ -41,6 +41,65 @@
typedef struct IDirect3DExecuteBuffer IDirect3DExecuteBuffer, *LPDIRECT3DEXECUTEBUFFER;
/* ********************************************************************
+ Error Codes
+ ******************************************************************** */
+#define D3D_OK DD_OK
+#define D3DERR_BADMAJORVERSION MAKE_DDHRESULT(700)
+#define D3DERR_BADMINORVERSION MAKE_DDHRESULT(701)
+#define D3DERR_INVALID_DEVICE MAKE_DDHRESULT(705)
+#define D3DERR_INITFAILED MAKE_DDHRESULT(706)
+#define D3DERR_DEVICEAGGREGATED MAKE_DDHRESULT(707)
+#define D3DERR_EXECUTE_CREATE_FAILED MAKE_DDHRESULT(710)
+#define D3DERR_EXECUTE_DESTROY_FAILED MAKE_DDHRESULT(711)
+#define D3DERR_EXECUTE_LOCK_FAILED MAKE_DDHRESULT(712)
+#define D3DERR_EXECUTE_UNLOCK_FAILED MAKE_DDHRESULT(713)
+#define D3DERR_EXECUTE_LOCKED MAKE_DDHRESULT(714)
+#define D3DERR_EXECUTE_NOT_LOCKED MAKE_DDHRESULT(715)
+#define D3DERR_EXECUTE_FAILED MAKE_DDHRESULT(716)
+#define D3DERR_EXECUTE_CLIPPED_FAILED MAKE_DDHRESULT(717)
+#define D3DERR_TEXTURE_NO_SUPPORT MAKE_DDHRESULT(720)
+#define D3DERR_TEXTURE_CREATE_FAILED MAKE_DDHRESULT(721)
+#define D3DERR_TEXTURE_DESTROY_FAILED MAKE_DDHRESULT(722)
+#define D3DERR_TEXTURE_LOCK_FAILED MAKE_DDHRESULT(723)
+#define D3DERR_TEXTURE_UNLOCK_FAILED MAKE_DDHRESULT(724)
+#define D3DERR_TEXTURE_LOAD_FAILED MAKE_DDHRESULT(725)
+#define D3DERR_TEXTURE_SWAP_FAILED MAKE_DDHRESULT(726)
+#define D3DERR_TEXTURE_LOCKED MAKE_DDHRESULT(727)
+#define D3DERR_TEXTURE_NOT_LOCKED MAKE_DDHRESULT(728)
+#define D3DERR_TEXTURE_GETSURF_FAILED MAKE_DDHRESULT(729)
+#define D3DERR_MATRIX_CREATE_FAILED MAKE_DDHRESULT(730)
+#define D3DERR_MATRIX_DESTROY_FAILED MAKE_DDHRESULT(731)
+#define D3DERR_MATRIX_SETDATA_FAILED MAKE_DDHRESULT(732)
+#define D3DERR_MATRIX_GETDATA_FAILED MAKE_DDHRESULT(733)
+#define D3DERR_SETVIEWPORTDATA_FAILED MAKE_DDHRESULT(734)
+#define D3DERR_INVALIDCURRENTVIEWPORT MAKE_DDHRESULT(735)
+#define D3DERR_INVALIDPRIMITIVETYPE MAKE_DDHRESULT(736)
+#define D3DERR_INVALIDVERTEXTYPE MAKE_DDHRESULT(737)
+#define D3DERR_TEXTURE_BADSIZE MAKE_DDHRESULT(738)
+#define D3DERR_INVALIDRAMPTEXTURE MAKE_DDHRESULT(739)
+#define D3DERR_MATERIAL_CREATE_FAILED MAKE_DDHRESULT(740)
+#define D3DERR_MATERIAL_DESTROY_FAILED MAKE_DDHRESULT(741)
+#define D3DERR_MATERIAL_SETDATA_FAILED MAKE_DDHRESULT(742)
+#define D3DERR_MATERIAL_GETDATA_FAILED MAKE_DDHRESULT(743)
+#define D3DERR_INVALIDPALETTE MAKE_DDHRESULT(744)
+#define D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY MAKE_DDHRESULT(745)
+#define D3DERR_ZBUFF_NEEDS_VIDEOMEMORY MAKE_DDHRESULT(746)
+#define D3DERR_SURFACENOTINVIDMEM MAKE_DDHRESULT(747)
+#define D3DERR_LIGHT_SET_FAILED MAKE_DDHRESULT(750)
+#define D3DERR_LIGHTHASVIEWPORT MAKE_DDHRESULT(751)
+#define D3DERR_LIGHTNOTINTHISVIEWPORT MAKE_DDHRESULT(752)
+#define D3DERR_SCENE_IN_SCENE MAKE_DDHRESULT(760)
+#define D3DERR_SCENE_NOT_IN_SCENE MAKE_DDHRESULT(761)
+#define D3DERR_SCENE_BEGIN_FAILED MAKE_DDHRESULT(762)
+#define D3DERR_SCENE_END_FAILED MAKE_DDHRESULT(763)
+#define D3DERR_INBEGIN MAKE_DDHRESULT(770)
+#define D3DERR_NOTINBEGIN MAKE_DDHRESULT(771)
+#define D3DERR_NOVIEWPORTS MAKE_DDHRESULT(772)
+#define D3DERR_VIEWPORTDATANOTSET MAKE_DDHRESULT(773)
+#define D3DERR_VIEWPORTHASNODEVICE MAKE_DDHRESULT(774)
+#define D3DERR_NOCURRENTVIEWPORT MAKE_DDHRESULT(775)
+
+/* ********************************************************************
Enums
******************************************************************** */
#define D3DNEXT_NEXT 0x01l
@@ -1202,7 +1261,12 @@
struct IDirect3DTexture2 {
LPDIRECT3DTEXTURE2_VTABLE lpvtbl;
DWORD ref;
-
+
+ void *D3Ddevice; /* I put (void *) to use the same pointer for both
+ Direct3D and Direct3D2 */
+#ifdef HAVE_MESAGL
+ GLuint tex_name;
+#endif
LPDIRECTDRAWSURFACE3 surface;
};
diff --git a/include/ddraw.h b/include/ddraw.h
index 4b5e917..fdb74dc 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -1,6 +1,8 @@
#ifndef __WINE_DDRAW_H
#define __WINE_DDRAW_H
+#include "wine/obj_base.h"
+
#include "config.h"
#ifndef X_DISPLAY_MISSING
@@ -14,7 +16,6 @@
#define DIRECTDRAW_VERSION 0x0500
#endif /* DIRECTDRAW_VERSION */
-
DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35 );
DEFINE_GUID( CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 );
DEFINE_GUID( IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 );
@@ -900,6 +901,7 @@
We need it also in DGA mode to make some games (for example Monkey Island III work) */
ATOM winclass;
HWND32 window;
+ Window drawable;
PAINTSTRUCT32 ps;
};
@@ -910,7 +912,6 @@
};
struct _xlib_directdrawdata {
- Window drawable;
int paintable;
#ifdef HAVE_LIBXXSHM
diff --git a/include/debug.h b/include/debug.h
index f5e6447..8d0ea7a 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -101,57 +101,58 @@
#define dbch_profile 93
#define dbch_progress 94
#define dbch_prop 95
-#define dbch_psapi 96
-#define dbch_psdrv 97
-#define dbch_ras 98
-#define dbch_rebar 99
-#define dbch_reg 100
-#define dbch_region 101
-#define dbch_relay 102
-#define dbch_resource 103
-#define dbch_scroll 104
-#define dbch_security 105
-#define dbch_segment 106
-#define dbch_selector 107
-#define dbch_sem 108
-#define dbch_sendmsg 109
-#define dbch_server 110
-#define dbch_shell 111
-#define dbch_shm 112
-#define dbch_snoop 113
-#define dbch_sound 114
-#define dbch_static 115
-#define dbch_statusbar 116
-#define dbch_stress 117
-#define dbch_string 118
-#define dbch_syscolor 119
-#define dbch_system 120
-#define dbch_tab 121
-#define dbch_task 122
-#define dbch_text 123
-#define dbch_thread 124
-#define dbch_thunk 125
-#define dbch_timer 126
-#define dbch_toolbar 127
-#define dbch_toolhelp 128
-#define dbch_tooltips 129
-#define dbch_trackbar 130
-#define dbch_treeview 131
-#define dbch_tweak 132
-#define dbch_uitools 133
-#define dbch_updown 134
-#define dbch_ver 135
-#define dbch_virtual 136
-#define dbch_vxd 137
-#define dbch_wave 138
-#define dbch_win 139
-#define dbch_win16drv 140
-#define dbch_win32 141
-#define dbch_wing 142
-#define dbch_winsock 143
-#define dbch_wnet 144
-#define dbch_x11 145
-#define dbch_x11drv 146
+#define dbch_propsheet 96
+#define dbch_psapi 97
+#define dbch_psdrv 98
+#define dbch_ras 99
+#define dbch_rebar 100
+#define dbch_reg 101
+#define dbch_region 102
+#define dbch_relay 103
+#define dbch_resource 104
+#define dbch_scroll 105
+#define dbch_security 106
+#define dbch_segment 107
+#define dbch_selector 108
+#define dbch_sem 109
+#define dbch_sendmsg 110
+#define dbch_server 111
+#define dbch_shell 112
+#define dbch_shm 113
+#define dbch_snoop 114
+#define dbch_sound 115
+#define dbch_static 116
+#define dbch_statusbar 117
+#define dbch_stress 118
+#define dbch_string 119
+#define dbch_syscolor 120
+#define dbch_system 121
+#define dbch_tab 122
+#define dbch_task 123
+#define dbch_text 124
+#define dbch_thread 125
+#define dbch_thunk 126
+#define dbch_timer 127
+#define dbch_toolbar 128
+#define dbch_toolhelp 129
+#define dbch_tooltips 130
+#define dbch_trackbar 131
+#define dbch_treeview 132
+#define dbch_tweak 133
+#define dbch_uitools 134
+#define dbch_updown 135
+#define dbch_ver 136
+#define dbch_virtual 137
+#define dbch_vxd 138
+#define dbch_wave 139
+#define dbch_win 140
+#define dbch_win16drv 141
+#define dbch_win32 142
+#define dbch_wing 143
+#define dbch_winsock 144
+#define dbch_wnet 145
+#define dbch_x11 146
+#define dbch_x11drv 147
/* Definitions for classes identifiers */
#define dbcl_fixme 0
#define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index ea469b5..cd1a472 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
#include "debugtools.h"
#endif
-#define DEBUG_CHANNEL_COUNT 147
+#define DEBUG_CHANNEL_COUNT 148
#ifdef DEBUG_RUNTIME
short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0},
@@ -154,6 +154,7 @@
{1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0},
+{1, 1, 0, 0},
};
const char* debug_ch_name[] = {
"accel",
@@ -252,6 +253,7 @@
"profile",
"progress",
"prop",
+"propsheet",
"psapi",
"psdrv",
"ras",
diff --git a/include/dinput.h b/include/dinput.h
index 03978e2..0bf86c3 100644
--- a/include/dinput.h
+++ b/include/dinput.h
@@ -1,6 +1,8 @@
#ifndef _WINE_DINPUT_H
#define _WINE_DINPUT_H
+#include "unknwn.h"
+
#define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
#define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn)
#define PURE
diff --git a/include/dosexe.h b/include/dosexe.h
index 4f5c16b..530cdd7 100644
--- a/include/dosexe.h
+++ b/include/dosexe.h
@@ -51,5 +51,7 @@
extern HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL32 inherit,
LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info );
extern int DOSVM_Enter( PCONTEXT context );
+extern void DOSVM_SetTimer( unsigned ticks );
+extern unsigned DOSVM_GetTimer( void );
#endif /* __WINE_DOSEXE_H */
diff --git a/include/dplay.h b/include/dplay.h
index fd9552e..d6d5506 100644
--- a/include/dplay.h
+++ b/include/dplay.h
@@ -2,6 +2,8 @@
#ifndef __WINE_DPLAY_H
#define __WINE_DPLAY_H
+#include "unknwn.h"
+
#pragma pack(1)
/* Return Values for Direct Play */
diff --git a/include/dsound.h b/include/dsound.h
index 2b2bcca..e944fab 100644
--- a/include/dsound.h
+++ b/include/dsound.h
@@ -3,7 +3,6 @@
#include "windows.h"
#include "winbase.h"
-#include "compobj.h"
#include "mmsystem.h"
#include "d3d.h" /*FIXME: Need to break out d3dtypes.h */
diff --git a/include/flatsb.h b/include/flatsb.h
new file mode 100644
index 0000000..2103ada
--- /dev/null
+++ b/include/flatsb.h
@@ -0,0 +1,20 @@
+/*
+ * Date and time picker class extra info
+ *
+ * Copyright 1998 Eric Kohl
+ */
+
+#ifndef __WINE_FLATSB_H
+#define __WINE_FLATSB_H
+
+typedef struct tagFLATSB_INFO
+{
+ DWORD dwDummy; /* just to keep the compiler happy ;-) */
+
+} FLATSB_INFO, *LPFLATSB_INFO;
+
+
+extern VOID FLATSB_Register (VOID);
+extern VOID FLATSB_Unregister (VOID);
+
+#endif /* __WINE_FLATSB_H */
diff --git a/include/interfaces.h b/include/interfaces.h
index 26f28d5..a7621f6 100644
--- a/include/interfaces.h
+++ b/include/interfaces.h
@@ -48,7 +48,6 @@
#include "objbase.h"
#define THIS LPCLASSFACTORY this
-typedef struct IClassFactory *LPCLASSFACTORY,IClassFactory;
typedef struct {
STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
@@ -57,14 +56,9 @@
STDMETHOD(LockServer) (THIS_ BOOL32) PURE;
} *LPCLASSFACTORY_VTABLE,IClassFactory_VTable;
-struct IClassFactory {
- LPCLASSFACTORY_VTABLE lpvtbl;
- DWORD ref;
-};
#undef THIS
#define THIS LPMALLOC32 this
-typedef struct IMalloc32 *LPMALLOC32,IMalloc32;
typedef struct {
STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
@@ -78,14 +72,9 @@
STDMETHOD_(LPVOID,HeapMinimize) ( THIS );
} *LPMALLOC32_VTABLE,IMalloc32_VTable;
-struct IMalloc32 {
- LPMALLOC32_VTABLE lpvtbl;
- DWORD ref;
-};
#undef THIS
#define THIS LPMALLOC16 this
-typedef struct IMalloc16 *LPMALLOC16,IMalloc16;
typedef struct {
STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
@@ -99,14 +88,6 @@
STDMETHOD_(LPVOID,HeapMinimize) ( THIS );
} *LPMALLOC16_VTABLE,IMalloc16_VTable;
-struct IMalloc16 {
- LPMALLOC16_VTABLE lpvtbl;
- DWORD ref;
- /* Gmm, I think one is not enough, we should probably manage a list of
- * heaps
- */
- HGLOBAL16 heap;
-};
#undef THIS
/* private prototypes for the constructors */
diff --git a/include/main.h b/include/main.h
index dc0762a..8e4af75 100644
--- a/include/main.h
+++ b/include/main.h
@@ -12,6 +12,9 @@
extern int MAIN_GetLanguageID(char*lang, char*country, char*charset, char*dialect);
extern BOOL32 RELAY_Init(void);
+extern int RELAY_ShowDebugmsgRelay(const char *func);
extern void* CALL32_Init(void);
+extern BOOL32 THUNK_Init(void);
+
#endif /* __WINE_MAIN_H */
diff --git a/include/miscemu.h b/include/miscemu.h
index 9b2598b..558f841 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -11,7 +11,10 @@
#include "winnt.h"
#include "ldt.h"
- /* msdos/dosmem.c */
+/* msdos/dosconf.c */
+extern int DOSCONF_ReadConfig(void);
+
+/* msdos/dosmem.c */
extern HANDLE16 DOSMEM_BiosSeg;
extern DWORD DOSMEM_CollateTable;
diff --git a/include/msdos.h b/include/msdos.h
index dccb072..ca68cf2 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -196,4 +196,25 @@
void do_mscdex( CONTEXT *context );
void do_mscdex_dd (CONTEXT * context, int dorealmode);
+#define DOSCONF_MEM_HIGH 0x0001
+#define DOSCONF_MEM_UMB 0x0002
+#define DOSCONF_NUMLOCK 0x0004
+#define DOSCONF_KEYB_CONV 0x0008
+
+typedef struct {
+ char lastdrive;
+ int brk_flag;
+ int files;
+ int stacks_nr;
+ int stacks_sz;
+ int buf;
+ int buf2;
+ int fcbs;
+ int flags;
+ char *shell;
+ char *country;
+} DOSCONF;
+
+extern DOSCONF DOSCONF_config;
+
#endif /* __WINE_MSDOS_H */
diff --git a/include/multimedia.h b/include/multimedia.h
index 4d97843..11ac6a4 100644
--- a/include/multimedia.h
+++ b/include/multimedia.h
@@ -58,8 +58,8 @@
extern UINT16 MCI_NextDevID(UINT16 wDevID);
extern BOOL32 MCI_DevIDValid(UINT16 wDevID);
-extern int MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam);
-extern int MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam);
+extern int MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam);
+extern int MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam);
typedef LONG (*MCIPROC16)(DWORD, HDRVR16, WORD, DWORD, DWORD);
typedef LONG (*MCIPROC32)(DWORD, HDRVR16, DWORD, DWORD, DWORD);
@@ -69,7 +69,9 @@
extern DWORD MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr);
extern const char* MCI_CommandToString(UINT16 wMsg);
-extern DWORD MCI_SendCommandAsync32(UINT32 wDevID, UINT32 wMsg, DWORD dwParam1, DWORD dwParam2);
+
+extern DWORD MCI_SendCommand32(UINT32 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
+extern DWORD MCI_SendCommandAsync32(UINT32 wDevID, UINT32 wMsg, DWORD dwParam1, DWORD dwParam2);
LONG MCIWAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg,
DWORD dwParam1, DWORD dwParam2);
diff --git a/include/objbase.h b/include/objbase.h
index f7c5697..38a540c 100644
--- a/include/objbase.h
+++ b/include/objbase.h
@@ -2,467 +2,115 @@
#define __WINE_OBJBASE_H
-/*
- * The goal of the following set of definitions is to provide a way to use the same
- * header file definitions to provide both a C interface and a C++ object oriented
- * interface to COM interfaces. The type of interface is selected automatically
- * depending on the language but it is always possible to get the C interface in C++
- * by defining CINTERFACE.
- *
- * It is based on the following assumptions:
- * - all COM interfaces derive from IUnknown, this should not be a problem.
- * - the header file only defines the interface, the actual fields are defined
- * separately in the C file implementing the interface.
- * - no COM method returns void. This seems to be the case but otherwise we could support this
- * case by having one more set of macros.
- *
- * The natural approach to this problem would be to make sure we get a C++ class and
- * virtual methods in C++ and a structure with a table of pointer to functions in C.
- * Unfortunately the layout of the virtual table is compiler specific, the layout of
- * g++ virtual tables is not the same as that of an egcs virtual table which is not the
- * same as that generated by Visual C+. There are workarounds to make the virtual tables
- * compatible via padding but unfortunately the one which is imposed to the WINE emulator
- * by the Windows binaries, i.e. the Visual C++ one, is the most compact of all.
- *
- * So the solution I finally adopted does not use virtual tables. Instead I use inline
- * non virtual methods that dereference the method pointer themselves and perform the call.
- *
- * Let's take Direct3D as an example:
- *
- * #define ICOM_INTERFACE IDirect3D
- * ICOM_BEGIN(IDirect3D,IUnknown)
- * ICOM_METHOD1(HRESULT,Initialize, REFIID,);
- * ICOM_METHOD2(HRESULT,EnumDevices, LPD3DENUMDEVICESCALLBACK,, LPVOID,);
- * ICOM_METHOD2(HRESULT,CreateLight, LPDIRECT3DLIGHT*,, IUnknown*,);
- * ICOM_METHOD2(HRESULT,CreateMaterial,LPDIRECT3DMATERIAL*,, IUnknown*,);
- * ICOM_METHOD2(HRESULT,CreateViewport,LPDIRECT3DVIEWPORT*,, IUnknown*,);
- * ICOM_METHOD2(HRESULT,FindDevice, LPD3DFINDDEVICESEARCH,, LPD3DFINDDEVICERESULT,);
- * ICOM_END(IDirect3D)
- * #undef ICOM_INTERFACE
- *
- * #if !defined(__cplusplus) || defined(CINTERFACE)
- * // *** IUnknown methods *** //
- * #define IDirect3D_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
- * #define IDirect3D_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
- * #define IDirect3D_Release(p) ICOM_ICALL (IUnknown,Release,p)
- * // *** IDirect3D methods *** //
- * #define IDirect3D_Initialize(p,a) ICOM_CALL1(Initialize,p,a)
- * #define IDirect3D_EnumDevices(p,a,b) ICOM_CALL2(EnumDevice,p,a,b)
- * #define IDirect3D_CreateLight(p,a,b) ICOM_CALL2(CreateLight,p,a,b)
- * #define IDirect3D_CreateMaterial(p,a,b) ICOM_CALL2(CreateMaterial,p,a,b)
- * #define IDirect3D_CreateViewport(p,a,b) ICOM_CALL2(CreateViewport,p,a,b)
- * #define IDirect3D_FindDevice(p,a,b) ICOM_CALL2(FindDevice,p,a,b)
- * #endif
- *
- * Comments:
- * - The ICOM_INTERFACE is used in the ICOM_METHOD macros for the 'this' pointer and to cast
- * pointers. Defining this macro here saves us the trouble of having to repeat the interface
- * name everywhere. Note haowever that because of the way macros work a macro like ICOM_METHOD1
- * cannot use 'ICOM_INTERFACE##_VTABLE' because this would give 'ICOM_INTERFACE_VTABLE' and not
- * 'IDirect3D_VTABLE'.
- * - ICOM_BEGIN and ICOM_END are responsible for generating whatever structure is appropriate for
- * representing the interface in the current language. In C this is a couple of structs in C++
- * it's a class. The first parameter is the interface name and the second one is the interface
- * we inherit from. The reason why you have to repeat the interface name is because that's the
- * only way these macro can successfully output "IDirect3D_VTABLE'. Trying to use ICOM_INTERFACE
- * would, as in ICOM_METHOD, only yield 'ICOM_INTERFACE_VTABLE'.
- * - With the way ICOM_BEGIN works you don't have to repeat the definitions of the methods of the
- * parent interface. They are automatically inherited both in C and in C++.
- * - In C++ the ICOM_METHOD macros generate a function prototype and a call to a function pointer
- * method. This means using once 't1 p1, t2 p2, ...' and once 'p1, p2' without the types. The
- * only way I found to handle this is to have one ICOM_METHOD macro per number of parameters and
- * to have it take only the type information (with const if necessary) as parameters.
- * The 'undef ICOM_INTERFACE' is here to remind you that using ICOM_INTERFACE in the following
- * macros will not work. This time it's because the ICOM_CALL macro expansion is done only once
- * the 'IDirect3D_Xxx' macro is expanded. And by that time ICOM_INTERFACE will be long gone
- * anyway.
- * - You may have noticed the double commas after each parameter type. This allows you to put the
- * name of that parameter which I think is good for documentation. It is not required and since
- * I did not know what to put there for this example (I could only find doc about IDirect3D2),
- * I left them blank.
- * - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access
- * to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate
- * the inherited method definitions there. We must use ICOM_ICALL to invoke inherited methods,
- * because in C we have to cast the virtual table pointer, and we should use the ICOM_CALL
- * method in the other cases. This time I could have used a trick to use only one macro whatever
- * the number of parameters but I prefered to have it work the same way as above.
- * - You probably have noticed that we don't define the fields we need to actually implement this
- * interface: reference count, pointer to other resources and miscellaneous fields. That's
- * because it's not needed, and the user will anyway only manipulate pointers to this structure
- * so he does not need to know its real size. Of course on the implementation side we have the
- * real definition of the interface structure and they should match what the macros yield in
- * each language (or conversely).
- *
- *
- * In C this gives:
- * typedef struct IDirect3D_VTABLE IDirect3D_VTABLE;
- * struct IDirect3D {
- * IDirect3D_VTABLE* lpvtbl;
- * };
- * struct IDirect3D_VTABLE {
- * IUnknown_VTABLE bvt;
- * HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
- * HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
- * HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
- * HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
- * HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
- * HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
- * };
- *
- * #if !defined(__cplusplus) || defined(CINTERFACE)
- * // *** IUnknown methods *** //
- * #define IDirect3D_QueryInterface(p,a,b) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnQueryInterface((IUnknown*)p,a,b)
- * #define IDirect3D_AddRef(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnAddRef((IUnknown*)p)
- * #define IDirect3D_Release(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnRelease((IUnknown*)p)
- * // *** IDirect3D methods *** //
- * #define IDirect3D_Initialize(p,a) (p)->lpvtbl->fnInitialize(p,a)
- * #define IDirect3D_EnumDevices(p,a,b) (p)->lpvtbl->fnEnumDevice(p,a,b)
- * #define IDirect3D_CreateLight(p,a,b) (p)->lpvtbl->fnCreateLight(p,a,b)
- * #define IDirect3D_CreateMaterial(p,a,b) (p)->lpvtbl->fnCreateMaterial(p,a,b)
- * #define IDirect3D_CreateViewport(p,a,b) (p)->lpvtbl->fnCreateViewport(p,a,b)
- * #define IDirect3D_FindDevice(p,a,b) (p)->lpvtbl->fnFindDevice(p,a,b)
- * #endif
- *
- * Comments:
- * - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing
- * the user needs to know to use the interface. Of course the structure we will define to
- * implement this interface will have more fields but the first one will match this pointer.
- * - The code generated by ICOM_BEGIN goes up to the bvt field in the IDirect3D virtual table.
- * This bvt field is what saves us from having to duplicate the inherited method definitions.
- * It's a shame that C (gcc) will not allow unnamed structs. If this was possible we could
- * seamlessly inherit and use the parent's interface function pointers.
- * - What follows is just a bunch of function pointer definitions generated by the ICOM_METHOD
- * macros. The implementation will fill this jump table with appropriate values in a static
- * variable and initialize the lpvtbl field to point to this variable.
- * - The IDirect3D_Xxx macros then just derefence the lpvtbl pointer and use the function pointer
- * corresponding to the macro name. This emulates the behavior of a virtual table and should be
- * about as fast. In the case of inherited methods we have some additional casting to do to
- * because the inherited methods are defined in the bvt field or maybe further imbricated. Since
- * the effect of the bvt field is that we inherit the parent virtual table fields this cast is
- * relatively inocuous. A similar cast must be performed on the interface pointer before the
- * invoked method will accept it. Despite all these casts there is little chance that you call a
- * method on the wrong type of interface because the function names still have to match. But this
- * is the only thing that will make the compilation fail.
- *
- *
- * And in C++ (with gcc's g++):
- *
- * typedef struct IDirect3D: public IUnknown {
- * private: HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
- * public: inline HRESULT Initialize(REFIID a) { return ((IDirect3D*)t.lpvtbl)->fnInitialize(this,a); };
- * private: HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
- * public: inline HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b)
- * { return ((IDirect3D*)t.lpvtbl)->fnEnumDevices(this,a,b); };
- * private: HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
- * public: inline HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b)
- * { return ((IDirect3D*)t.lpvtbl)->fnCreateLight(this,a,b); };
- * private: HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
- * public: inline HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b)
- * { return ((IDirect3D*)t.lpvtbl)->fnCreateMaterial(this,a,b); };
- * private: HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
- * public: inline HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b)
- * { return ((IDirect3D*)t.lpvtbl)->fnCreateViewport(this,a,b); };
- * private: HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
- * public: inline HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b)
- * { return ((IDirect3D*)t.lpvtbl)->fnFindDevice(this,a,b); };
- * };
- *
- * Comments:
- * - In C++ IDirect3D does double duty as both the virtual/jump table and as the interface
- * definition. The reason for this is to avoid having to duplicate the mehod definitions: once
- * to have the function pointers in the jump table and once to have the methods in the interface
- * class. Here one macro can generate both. This means though that the first pointer, t.lpvtbl
- * defined in IUnknown, must be interpreted as the jump table pointer if we interpret the
- * structure as the the interface class, and as the function pointer to the QueryInterface
- * method, t.fnQueryInterface, if we interpret the structure as the jump table. Fortunately this
- * gymnastic is entirely taken care of in the header of IUnknown.
- * - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions.
- * - Since IDirect3D does double duty, each ICOM_METHOD macro defines both a function pointer and
- * a non-vritual inline method which dereferences it and calls it. This way this method behaves
- * just like a virtual method but does not create a true C++ virtual table which would break the
- * structure layout. If you look at the implementation of these methods you'll notice that they
- * would not work for void functions. We have to return something and fortunately this seems to
- * be what all the COM methods do (otherwise we would need another set of macros).
- * - Note how the ICOM_METHOD generates both function prototypes mixing types and formal parameter
- * names and the method invocation using only the formal parameter name. This is the reason why
- * we need different macros to handle different numbers of parameters.
- * - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE
- * macro is defined in which case we would not be here.
- *
- *
- * Implementing a COM interface.
- *
- * This continues the above example.I assume the implementation is in C but it would probably
- * be similar in C++.
- *
- * typedef struct _IDirect3D {
- * void* lpvtbl;
- * // ...
- *
- * } _IDirect3D;
- *
- * static ICOM_VTABLE(IDirect3D) d3dvt;
- *
- * // implement the IDirect3D methods here
- *
- * int IDirect3D_fnQueryInterface(LPUNKNOWN me)
- * {
- * ICOM_THIS(IDirect3D,me);
- * // ...
- * }
- *
- * // ...
- *
- * static ICOM_VTABLE(IDirect3D) d3dvt = {
- * {
- * IDirect3D_fnQueryInterface,
- * IUnknown_fnAdd,
- * IUnknown_fnAdd2
- * },
- * IDirect3D_fnInitialize,
- * IDirect3D_fnSetWidth
- * };
- *
- * Comments:
- * - We first define what the interface really contains. This is th e_IDirect3D structure. The
- * first field must of course be the virtual table pointer. Everything else is free.
- * - Then we predeclare our static virtual table variable, we will need its address in some
- * methods to initialize the virtual table pointer of the returned interface objects.
- * - Then we implement the interface methods. To match what has been declared in the header file
- * they must take a pointer to a IDirect3D structure so we must cast it to an _IDirect3D so that
- * we can manipulate the fields. This is performed by the ICOM_THIS macro.
- * - Finally we initialize the virtual table. The inherited methods must be in curly brackets to
- * match the parent interface's virtual table definition.
+#include "wine/obj_base.h"
+
+/* the following depend only on obj_base.h */
+#include "wine/obj_misc.h"
+#include "wine/obj_channel.h"
+#include "wine/obj_clientserver.h"
+#include "wine/obj_marshal.h"
+#include "wine/obj_storage.h"
+
+/* the following depend on obj_storage.h */
+#include "wine/obj_moniker.h"
+#include "wine/obj_propertystorage.h"
+
+/* the following depend on obj_moniker.h */
+#include "wine/obj_dataobject.h"
+
+/* FIXME: the following should be moved to one of the wine/obj_XXX.h headers */
+
+/*****************************************************************************
+ * CoXXX API
+ */
+/* FIXME: more CoXXX functions are missing */
+DWORD WINAPI CoBuildVersion(void);
+
+typedef enum tagCOINIT
+{
+ COINIT_APARTMENTTHREADED = 0x2, /* Apartment model */
+ COINIT_MULTITHREADED = 0x0, /* OLE calls objects on any thread */
+ COINIT_DISABLE_OLE1DDE = 0x4, /* Don't use DDE for Ole1 support */
+ COINIT_SPEED_OVER_MEMORY = 0x8 /* Trade memory for speed */
+} COINIT;
+
+HRESULT WINAPI CoInitialize16(LPVOID lpReserved);
+HRESULT WINAPI CoInitialize32(LPVOID lpReserved);
+#define CoInitialize WINELIB_NAME(CoInitialize)
+
+HRESULT WINAPI CoInitializeEx32(LPVOID lpReserved, DWORD dwCoInit);
+#define CoInitializeEx WINELIB_NAME(CoInitializeEx)
+
+void WINAPI CoUninitialize(void);
+
+
+HRESULT WINAPI CoCreateGuid(GUID *pguid);
+
+/* class registration flags; passed to CoRegisterClassObject */
+typedef enum tagREGCLS
+{
+ REGCLS_SINGLEUSE = 0,
+ REGCLS_MULTIPLEUSE = 1,
+ REGCLS_MULTI_SEPARATE = 2,
+ REGCLS_SUSPENDED = 4
+} REGCLS;
+
+HRESULT WINAPI CoRegisterClassObject16(REFCLSID rclsid, LPUNKNOWN pUnk, DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister);
+HRESULT WINAPI CoRegisterClassObject32(REFCLSID rclsid,LPUNKNOWN pUnk,DWORD dwClsContext,DWORD flags,LPDWORD lpdwRegister);
+#define CoRegisterClassObject WINELIB_NAME(CoRegisterClassObject)
+
+HRESULT WINAPI CoRevokeClassObject(DWORD dwRegister);
+HRESULT WINAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext,LPVOID pvReserved, const REFIID iid, LPVOID *ppv);
+
+
+HRESULT WINAPI CoCreateInstance(REFCLSID rclsid,LPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID iid,LPVOID *ppv);
+void WINAPI CoFreeLibrary(HINSTANCE32 hLibrary);
+void WINAPI CoFreeAllLibraries(void);
+void WINAPI CoFreeUnusedLibraries(void);
+HRESULT WINAPI CoFileTimeNow(FILETIME *lpFileTime);
+LPVOID WINAPI CoTaskMemAlloc(ULONG size);
+void WINAPI CoTaskMemFree(LPVOID ptr);
+HINSTANCE32 WINAPI CoLoadLibrary(LPOLESTR16 lpszLibName, BOOL32 bAutoFree);
+
+HRESULT WINAPI CoLockObjectExternal16(LPUNKNOWN pUnk,BOOL16 fLock,BOOL16 fLastUnlockReleases);
+HRESULT WINAPI CoLockObjectExternal32(LPUNKNOWN pUnk,BOOL32 fLock,BOOL32 fLastUnlockReleases);
+#define CoLockObjectExternal WINELIB_NAME(CoLockObjectExternal)
+
+
+/* internal Wine stuff */
+
+
+/*****************************************************************************
+ * IClassFactory interface
*/
+typedef struct _IClassFactory {
+ /* IUnknown fields */
+ ICOM_VTABLE(IClassFactory)* lpvtbl;
+ DWORD ref;
+} _IClassFactory;
-#define ICOM_VTABLE(iface) iface##_VTABLE
+HRESULT WINE_StringFromCLSID(const CLSID *id, LPSTR);
-#if defined(__cplusplus) && !defined(CINTERFACE)
-/* C++ interface */
-
-#define ICOM_BEGIN(iface,ibase) \
- typedef struct iface: public ibase {
-
-#define ICOM_METHOD(ret,xfn) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \
- public: inline ret (CALLBACK xfn)(void) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
-
-#define ICOM_METHOD1(ret,xfn,ta,na) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); \
- public: inline ret (CALLBACK xfn)(ta a) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
-
-#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); \
- public: inline ret (CALLBACK xfn)(ta a,tb b) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
-
-#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
-
-#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
-
-#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
-
-#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
-
-#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
- private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
-
-
-#define ICOM_CMETHOD(ret,xfn) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); \
- public: inline ret (CALLBACK xfn)(void) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
-
-#define ICOM_CMETHOD1(ret,xfn,ta,na) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); \
- public: inline ret (CALLBACK xfn)(ta a) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
-
-#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); \
- public: inline ret (CALLBACK xfn)(ta a,tb b) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
-
-#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
-
-#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
-
-#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
-
-#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
-
-#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
- private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
- public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
-
-
-#define ICOM_END(iface) \
- };
-
-#define ICOM_ICALL(ibase, xfn, p) this_is_a_syntax_error
-#define ICOM_ICALL1(ibase, xfn, p,a) this_is_a_syntax_error
-#define ICOM_ICALL2(ibase, xfn, p,a,b) this_is_a_syntax_error
-#define ICOM_ICALL3(ibase, xfn, p,a,b,c) this_is_a_syntax_error
-#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) this_is_a_syntax_error
-#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) this_is_a_syntax_error
-#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) this_is_a_syntax_error
-#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error
-
-#define ICOM_CALL(xfn, p) this_is_a_syntax_error
-#define ICOM_CALL1(xfn, p,a) this_is_a_syntax_error
-#define ICOM_CALL2(xfn, p,a,b) this_is_a_syntax_error
-#define ICOM_CALL3(xfn, p,a,b,c) this_is_a_syntax_error
-#define ICOM_CALL4(xfn, p,a,b,c,d) this_is_a_syntax_error
-#define ICOM_CALL5(xfn, p,a,b,c,d,e) this_is_a_syntax_error
-#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) this_is_a_syntax_error
-#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error
-
-
-#else
-/* C interface */
-
-
-#define ICOM_BEGIN(iface,ibase) \
- typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
- struct iface { \
- const ICOM_VTABLE(iface)* lpvtbl; \
- }; \
- struct ICOM_VTABLE(iface) { \
- ICOM_VTABLE(ibase) bvt;
-
-#define ICOM_METHOD(ret, xfn) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me);
-
-#define ICOM_METHOD1(ret,xfn,ta,na) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a);
-
-#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b);
-
-#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
-
-#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
-
-#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
-
-#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
-
-#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
- ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
-
-
-#define ICOM_CMETHOD(ret, xfn) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me);
-
-#define ICOM_CMETHOD1(ret,xfn,ta,na) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a);
-
-#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b);
-
-#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c);
-
-#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
-
-#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
-
-#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
-
-#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
- ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
-
-#define ICOM_END(iface) \
- };
-
-#define ICOM_ICALL(ibase, xfn, p) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p)
-#define ICOM_ICALL1(ibase, xfn, p,a) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a)
-#define ICOM_ICALL2(ibase, xfn, p,a,b) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b)
-#define ICOM_ICALL3(ibase, xfn, p,a,b,c) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c)
-#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d)
-#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e)
-#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f)
-#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f,g)
-
-#define ICOM_CALL(xfn, p) (p)->lpvtbl->fn##xfn(p)
-#define ICOM_CALL1(xfn, p,a) (p)->lpvtbl->fn##xfn(p,a)
-#define ICOM_CALL2(xfn, p,a,b) (p)->lpvtbl->fn##xfn(p,a,b)
-#define ICOM_CALL3(xfn, p,a,b,c) (p)->lpvtbl->fn##xfn(p,a,b,c)
-#define ICOM_CALL4(xfn, p,a,b,c,d) (p)->lpvtbl->fn##xfn(p,a,b,c,d)
-#define ICOM_CALL5(xfn, p,a,b,c,d,e) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e)
-#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f)
-#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f,g)
-
-
-#define ICOM_THIS(iface,me) struct _##iface* this=(struct _##iface*)me
-#define ICOM_CTHIS(iface,me) const _##iface* this=(const _##iface*)me
-
-#endif
-
-
-/* FIXME: compobj.h seems to be obsolete (replaced by objbase.h!) but it still contains REFIID */
-#include "compobj.h"
-
-typedef struct IUnknown IUnknown ,*LPUNKNOWN;
+/*****************************************************************************
+ * IMalloc interface
+ */
+/* private prototypes for the constructors */
+LPMALLOC16 IMalloc16_Constructor(void);
+LPMALLOC32 IMalloc32_Constructor(void);
/*****************************************************************************
* IUnknown interface
*/
-#define ICOM_INTERFACE IUnknown
-#if defined(__cplusplus) && !defined(CINTERFACE)
-struct IUnknown {
- union {
- const void* lpvtbl;
- HRESULT (CALLBACK *fnQueryInterface)(IUnknown* me, REFIID riid, LPVOID* ppvObj);
- } t;
- inline int QueryInterface(REFIID a, LPVOID* b) { return ((IUnknown*)t.lpvtbl)->t.fnQueryInterface(this,a,b); }
-#else
-typedef struct ICOM_VTABLE(IUnknown) ICOM_VTABLE(IUnknown);
-struct IUnknown {
+
+typedef struct _IUnknown {
+ /* IUnknown fields */
ICOM_VTABLE(IUnknown)* lpvtbl;
-};
-struct ICOM_VTABLE(IUnknown) {
- ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj)
-#endif
+ DWORD ref;
+} _IUnknown;
- ICOM_METHOD (ULONG,AddRef)
- ICOM_METHOD (ULONG,Release)
-#ifdef __WRC__
-}; /* FIXME: WRC does not support function macros and it is ICOM_END that is supposed to close the class */
-#else
-ICOM_END(IUnknown)
-#endif
-#undef ICOM_INTERFACE
-
-#if !defined(__cplusplus) || defined(CINTERFACE)
-/*** IUnknown methods ***/
-#define IUnknown_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
-#define IUnknown_AddRef(p) ICOM_CALL (AddRef,p)
-#define IUnknown_Release(p) ICOM_CALL (Release,p)
-#endif
-
+LPUNKNOWN IUnknown_Constructor(void);
#endif /* __WINE_OBJBASE_H */
diff --git a/include/objidl.h b/include/objidl.h
new file mode 100644
index 0000000..a923c1e
--- /dev/null
+++ b/include/objidl.h
@@ -0,0 +1,22 @@
+#ifndef __WINE_OBJIDL_H
+#define __WINE_OBJIDL_H
+
+
+#include "wine/obj_base.h"
+
+/* the following depend only on obj_base.h */
+#include "wine/obj_misc.h"
+#include "wine/obj_channel.h"
+#include "wine/obj_clientserver.h"
+#include "wine/obj_marshal.h"
+#include "wine/obj_storage.h"
+
+/* the following depend on obj_storage.h */
+#include "wine/obj_moniker.h"
+#include "wine/obj_propertystorage.h"
+
+/* the following depend on obj_moniker.h */
+#include "wine/obj_dataobject.h"
+
+
+#endif /* __WINE_OBJIDL_H */
diff --git a/include/ole.h b/include/ole.h
index 0a368ef..e5d4fab 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -7,37 +7,18 @@
#include "wingdi.h"
-typedef CHAR OLECHAR16;
-typedef OLECHAR16 *BSTR16;
-typedef BSTR16 *LPBSTR16;
-typedef LPSTR LPOLESTR16;
-typedef LPCSTR LPCOLESTR16;
-typedef WCHAR OLECHAR32;
-typedef OLECHAR32 *BSTR32;
-typedef BSTR32 *LPBSTR32;
-typedef LPWSTR LPOLESTR32;
-typedef LPCWSTR LPCOLESTR32;
-DECL_WINELIB_TYPE(OLECHAR)
-DECL_WINELIB_TYPE(LPOLESTR)
-DECL_WINELIB_TYPE(LPCOLESTR)
-DECL_WINELIB_TYPE(BSTR)
-DECL_WINELIB_TYPE(LPBSTR)
+/* FIXME: we need to include wtypes.h mainly, it seems, because we need BSTR.
+ * Normally none of the APIs in ole.h depend on it. It is most likey that they should
+ * be moved to ole2.h (which includes objbase.h and thus wtypes.h) or some other
+ * OLE include
+ */
+#include "wtypes.h"
+
#define OLESTR16(x) x
#define OLESTR32(x) L##x /* probably wrong */
#define OLESTR WINELIB_NAME(OLESTR)
-typedef enum tagCLSCTX
-{
- CLSCTX_INPROC_SERVER = 0x1,
- CLSCTX_INPROC_HANDLER = 0x2,
- CLSCTX_LOCAL_SERVER = 0x4,
- CLSCTX_REMOTE_SERVER = 0x10
-} CLSCTX;
-
-#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER)
-#define CLSCTX_ALL (CLSCTX_INPROC_HANDLER|CLSCTX_SERVER)
-
typedef unsigned short VARTYPE;
typedef LONG DISPID;
diff --git a/include/ole2.h b/include/ole2.h
index dc604c4..c91c9ae 100644
--- a/include/ole2.h
+++ b/include/ole2.h
@@ -6,18 +6,15 @@
#define __WINE_OLE2_H
/* to be implemented */
-typedef LPVOID LPMESSAGEFILTER;
+/* FIXME: this should be defined somewhere in oleidl.h instead, should it be repeated here ? */
typedef LPVOID LPDROPTARGET;
-typedef struct tagMONIKER *LPMONIKER, IMoniker;
-#define S_OK 0
-#define S_FALSE 1
/* OLE version */
#define rmm 23
#define rup 639
-/* FIXME should be in oleidl.h*/
+/* FIXME: should be in oleidl.h */
typedef struct tagOleMenuGroupWidths
{ LONG width[ 6 ];
} OLEMENUGROUPWIDTHS32;
diff --git a/include/oleobj.h b/include/oleobj.h
index ab21084..d846d97 100644
--- a/include/oleobj.h
+++ b/include/oleobj.h
@@ -3,8 +3,10 @@
#include "ole.h"
#include "ole2.h"
-#include "compobj.h"
-/* #include "interfaces.h" */
+#include "wine/obj_base.h"
+#include "wine/obj_storage.h"
+#include "wine/obj_moniker.h"
+#include "wine/obj_dataobject.h"
#define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
#define STDMETHOD_(type,xfn) type (CALLBACK *fn##xfn)
@@ -14,8 +16,6 @@
/* forward declaration of the objects*/
typedef struct tagOLEADVISEHOLDER *LPOLEADVISEHOLDER, IOleAdviseHolder;
-typedef struct tagADVISESINK *LPADVISESINK, IAdviseSink;
-typedef struct tagENUMSTATDATA *LPENUMSTATDATA, IEnumSTATDATA;
/****************************************************************************
diff --git a/include/options.h b/include/options.h
index 9a09ecb..84150fc 100644
--- a/include/options.h
+++ b/include/options.h
@@ -92,6 +92,7 @@
extern char* PROFILE_GetStringItem( char* );
/* Version functions */
-extern void VERSION_ParseVersion( char *arg );
+extern void VERSION_ParseWinVersion( const char *arg );
+extern void VERSION_ParseDosVersion( const char *arg );
#endif /* __WINE_OPTIONS_H */
diff --git a/include/propsheet.h b/include/propsheet.h
new file mode 100644
index 0000000..0a42159
--- /dev/null
+++ b/include/propsheet.h
@@ -0,0 +1,21 @@
+/*
+ * Property sheet class extra info
+ *
+ * Copyright 1998 Anders Carlsson
+ */
+
+#ifndef __WINE_PROPSHEET_H
+#define __WINE_PROPSHEET_H
+
+typedef struct tagPROPSHEET_INFO
+{
+ DWORD dwDummy; /* just to keep the compiler happy ;-) */
+
+} PROPSHEET_INFO, *LPPROPSHEET_INFO;
+
+
+
+extern VOID PROPSHEET_Register (VOID);
+extern VOID PROPSHEET_UnRegister (VOID);
+
+#endif /* __WINE_PROPSHEET_H */
diff --git a/include/servprov.h b/include/servprov.h
new file mode 100644
index 0000000..6df57b3
--- /dev/null
+++ b/include/servprov.h
@@ -0,0 +1,34 @@
+#ifndef __WINE_SERVPROV_H
+#define __WINE_SERVPROV_H
+
+
+#include "unknwn.h"
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_GUID (IID_IServiceProvider, 0x6d5140c1L, 0x7436, 0x11ce, 0x80, 0x34, 0x00, 0xaa, 0x00, 0x60, 0x09, 0xfa);
+typedef struct IServiceProvider IServiceProvider,*LPSERVICEPROVIDER;
+
+
+/*****************************************************************************
+ * IServiceProvider interface
+ */
+#define ICOM_INTERFACE IServiceProvider
+ICOM_BEGIN(IServiceProvider,IUnknown)
+ ICOM_METHOD3(HRESULT,QueryService, REFGUID,guidService, REFIID,riid, void**,ppvObject);
+ICOM_END(IServiceProvider)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IServiceProvider_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IServiceProvider_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IServiceProvider_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IServiceProvider methods ***/
+#define IServiceProvider_QueryService(p,a,b,c) ICOM_CALL3(QueryService,p,a,b,c)
+#endif
+
+
+#endif /* __WINE_SERVPROV_H */
diff --git a/include/shell.h b/include/shell.h
index c19af49..2b5cdf6 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -4,13 +4,10 @@
#ifndef __WINE_SHELL_H
#define __WINE_SHELL_H
-#include "wintypes.h"
+#include "windows.h"
#include "winreg.h"
#include "imagelist.h"
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
/****************************************************************************
* shell 16
@@ -247,6 +244,11 @@
/****************************************************************************
* string and path functions
*/
+BOOL32 WINAPI PathIsRoot32A(LPCSTR x);
+BOOL32 WINAPI PathIsRoot32W(LPCWSTR x);
+#define PathIsRoot WINELIB_NAME_AW(PathIsRoot)
+BOOL32 WINAPI PathIsRoot32AW(LPCVOID x);
+
LPSTR WINAPI PathAddBackslash32A(LPSTR path);
LPWSTR WINAPI PathAddBackslash32W(LPWSTR path);
#define PathAddBackslash WINELIB_NAME_AW(PathAddBackslash)
diff --git a/include/shlguid.h b/include/shlguid.h
new file mode 100644
index 0000000..3f6a853
--- /dev/null
+++ b/include/shlguid.h
@@ -0,0 +1,13 @@
+#ifndef __WINE_SHLGUID_H
+#define __WINE_SHLGUID_H
+
+
+/* This file defines the GUID of the shell objects. In WINE we define
+ * the GUIDs where the interface is declared so this file just
+ * includes shlobj.h
+ */
+
+#include "shlobj.h"
+
+
+#endif /* __WINE_SHLGUID_H */
diff --git a/include/shlobj.h b/include/shlobj.h
index 8f82309..c741985 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -1,15 +1,13 @@
-#ifndef _WINE_SHLOBJ_H
-#define _WINE_SHLOBJ_H
+#ifndef __WINE_SHLOBJ_H
+#define __WINE_SHLOBJ_H
+#include "wine/obj_base.h"
#include "shell.h"
#include "ole.h"
#include "ole2.h"
-#include "compobj.h"
#include "oleobj.h"
-#include "storage.h"
#include "commctrl.h"
#include "wintypes.h"
-#include "interfaces.h"
#define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
#define STDMETHOD_(type,xfn) type (CALLBACK *fn##xfn)
@@ -23,22 +21,19 @@
DWORD WINAPI SHELL32_DllGetClassObject(LPCLSID,REFIID,LPVOID*);
-typedef LPVOID LPBC; /* *IBindCtx really */
/* foreward declaration of the objects*/
-typedef struct tagPERSISTFILE *LPPERSISTFILE, IPersistFile;
typedef struct tagCONTEXTMENU *LPCONTEXTMENU, IContextMenu;
typedef struct tagSHELLEXTINIT *LPSHELLEXTINIT,IShellExtInit;
typedef struct tagENUMIDLIST *LPENUMIDLIST, IEnumIDList;
typedef struct tagSHELLFOLDER *LPSHELLFOLDER, IShellFolder;
typedef struct tagSHELLVIEW *LPSHELLVIEW, IShellView;
typedef struct tagSHELLBROWSER *LPSHELLBROWSER,IShellBrowser;
-typedef struct tagDATAOBJECT *LPDATAOBJECT, IDataObject;
typedef struct tagSHELLICON *LPSHELLICON, IShellIcon;
typedef struct tagDOCKINGWINDOWFRAME *LPDOCKINGWINDOWFRAME, IDockingWindowFrame;
-typedef struct tagSERVICEPROVIDER *LPSERVICEPROVIDER, IServiceProvider;
typedef struct tagCOMMDLGBROWSER *LPCOMMDLGBROWSER, ICommDlgBrowser;
-typedef struct tagENUMFORMATETC *LPENUMFORMATETC, IEnumFORMATETC;
+
+
/****************************************************************************
* SHELL ID
@@ -47,24 +42,13 @@
DEFINE_GUID (IID_MyComputer, 0x20D04FE0L, 0x3AEA, 0x1069, 0xA2, 0xD8, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D);
/* strange Objects */
-DEFINE_SHLGUID(IID_IEnumUnknown, 0x00000100L, 0, 0);
-DEFINE_SHLGUID(IID_IEnumString, 0x00000101L, 0, 0);
-DEFINE_SHLGUID(IID_IEnumMoniker, 0x00000102L, 0, 0);
-DEFINE_SHLGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0);
DEFINE_SHLGUID(IID_IEnumOLEVERB, 0x00000104L, 0, 0);
-DEFINE_SHLGUID(IID_IEnumSTATDATA, 0x00000105L, 0, 0);
-DEFINE_SHLGUID(IID_IPersistStream, 0x00000109L, 0, 0);
-DEFINE_SHLGUID(IID_IPersistStorage, 0x0000010AL, 0, 0);
-DEFINE_SHLGUID(IID_IPersistFile, 0x0000010BL, 0, 0);
-DEFINE_SHLGUID(IID_IPersist, 0x0000010CL, 0, 0);
DEFINE_SHLGUID(IID_IViewObject, 0x0000010DL, 0, 0);
-DEFINE_SHLGUID(IID_IDataObject, 0x0000010EL, 0, 0);
DEFINE_SHLGUID(IID_IDropSource, 0x00000121L, 0, 0);
DEFINE_SHLGUID(IID_IDropTarget, 0x00000122L, 0, 0);
-DEFINE_GUID (IID_IServiceProvider, 0x6D5140C1L, 0x7436, 0x11CE, 0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA);
DEFINE_GUID (IID_IDockingWindow, 0x012dd920L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
DEFINE_GUID (IID_IDockingWindowSite, 0x2A342FC2L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
DEFINE_GUID (IID_IDockingWindowFrame, 0x47D2657AL, 0x7B27, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
@@ -127,31 +111,8 @@
WCHAR cStrW[MAX_PATH];
}u;
} STRRET,*LPSTRRET;
-/*****************************************************************************
- * IPersistFile interface
- */
-#define THIS LPPERSISTFILE this
-typedef struct IPersistFile_VTable
-{ /* *** IUnknown methods *** */
- STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
- STDMETHOD_(ULONG,AddRef) (THIS) PURE;
- STDMETHOD_(ULONG,Release) (THIS) PURE;
- STDMETHOD(GetClassID )(THIS_ CLSID *pClassID) PURE;
- STDMETHOD(IsDirty )(THIS) PURE;
- STDMETHOD(Load )(THIS_ LPCOLESTR32 pszFileName, DWORD dwMode) PURE;
- STDMETHOD(Save )(THIS_ LPCOLESTR32 pszFileName, BOOL32 fRemember) PURE;
- STDMETHOD(SaveCompleted )(THIS_ LPCOLESTR32 pszFileName) PURE;
- STDMETHOD(GetCurFile )(THIS_ LPOLESTR32 *ppszFileName) PURE;
-} IPersistFile_VTable,*LPPERSISTFILE_VTABLE;
-
-struct tagPERSISTFILE
-{ LPPERSISTFILE_VTABLE lpvtbl;
- DWORD ref;
-};
-
-#undef THIS
/*****************************************************************************
* IContextMenu interface
*/
@@ -282,52 +243,6 @@
DVASPECT_DOCPRINT = 8
} DVASPECT;
-typedef enum tagTYMED
-{ TYMED_HGLOBAL = 1,
- TYMED_FILE = 2,
- TYMED_ISTREAM = 4,
- TYMED_ISTORAGE = 8,
- TYMED_GDI = 16,
- TYMED_MFPICT = 32,
- TYMED_ENHMF = 64,
- TYMED_NULL = 0
-} TYMED;
-
-typedef struct
-{ DWORD tdSize;
- WORD tdDriverNameOffset;
- WORD tdDeviceNameOffset;
- WORD tdPortNameOffset;
- WORD tdExtDevmodeOffset;
- BYTE tdData[ 1 ];
-} DVTARGETDEVICE32;
-
-typedef WORD CLIPFORMAT32, *LPCLIPFORMAT32;
-
-/* dataobject as answer to a request */
-typedef struct
-{ DWORD tymed;
- union
- { HBITMAP32 hBitmap;
- /*HMETAFILEPICT32 hMetaFilePict;*/
- /*HENHMETAFILE32 hEnhMetaFile;*/
- HGLOBAL32 hGlobal;
- LPOLESTR32 lpszFileName;
- IStream32 *pstm;
- IStorage32 *pstg;
- } u;
- IUnknown *pUnkForRelease;
-} STGMEDIUM32;
-
-/* wished data format */
-typedef struct
-{ CLIPFORMAT32 cfFormat;
- DVTARGETDEVICE32 *ptd;
- DWORD dwAspect;
- LONG lindex;
- DWORD tymed;
-} FORMATETC32, *LPFORMATETC32;
-
/* shell specific clipboard formats */
/* DATAOBJECT_InitShellIDList*/
@@ -399,65 +314,6 @@
extern LPIDLLIST IDLList_Constructor (UINT32 uStep);
extern void IDLList_Destructor(LPIDLLIST this);
#undef THIS
-/*****************************************************************************
- * IEnumFORMATETC interface
- */
-#define THIS LPENUMFORMATETC this
-
-typedef struct IEnumFORMATETC_VTable
-{ /* IUnknown methods */
- STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
- STDMETHOD_(ULONG,AddRef) (THIS) PURE;
- STDMETHOD_(ULONG,Release) (THIS) PURE;
-
- /* IEnumFORMATETC methods */
- STDMETHOD (Next)(THIS_ ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) PURE;
- STDMETHOD (Skip)(THIS_ ULONG celt) PURE;
- STDMETHOD (Reset)(THIS) PURE;
- STDMETHOD (Clone)(THIS_ IEnumFORMATETC ** ppenum) PURE;
-} IEnumFORMATETC_VTable,*LPENUMFORMATETC_VTABLE;
-
-struct tagENUMFORMATETC
-{ LPENUMFORMATETC_VTABLE lpvtbl;
- DWORD ref;
- UINT32 posFmt;
- UINT32 countFmt;
- LPFORMATETC32 pFmt;
-};
-
-#undef THIS
-
-/*****************************************************************************
- * IDataObject interface
- */
-#define THIS LPDATAOBJECT this
-
-typedef struct IDataObject_VTable
-{ /*** IUnknown methods ***/
- STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
- STDMETHOD_(ULONG,AddRef) (THIS) PURE;
- STDMETHOD_(ULONG,Release) (THIS) PURE;
-
- STDMETHOD (GetData )(THIS_ LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) PURE;
- STDMETHOD (GetDataHere)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) PURE;
- STDMETHOD (QueryGetData)(THIS_ LPFORMATETC32 pformatetc) PURE;
- STDMETHOD (GetCanonicalFormatEtc)(THIS_ LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) PURE;
- STDMETHOD (SetData)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) PURE;
- STDMETHOD (EnumFormatEtc)(THIS_ DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) PURE;
- STDMETHOD (DAdvise )(THIS_ LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) PURE;
- STDMETHOD (DUnadvise)(THIS_ DWORD dwConnection) PURE;
- STDMETHOD (EnumDAdvise)(THIS_ IEnumSTATDATA **ppenumAdvise) PURE;
-} IDataObject_VTable,*LPDATAOBJECT_VTABLE;
-
-struct tagDATAOBJECT
-{ LPDATAOBJECT_VTABLE lpvtbl;
- DWORD ref;
- LPSHELLFOLDER psf;
- LPIDLLIST lpill; /* the data of the dataobject */
- LPITEMIDLIST pidl;
-};
-
-#undef THIS
/*****************************************************************************
@@ -1108,24 +964,6 @@
#undef THIS
/****************************************************************************
- * IServiceProvider interface
- */
-#define THIS LPSERVICEPROVIDER this
-
-typedef struct IServiceProvider_VTable
-{ /*** IUnknown methods ***/
- STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
- STDMETHOD_(ULONG,AddRef) (THIS) PURE;
- STDMETHOD_(ULONG,Release) (THIS) PURE;
-
- STDMETHOD(QueryService)(THIS_ REFGUID guidService, REFIID riid, void **ppvObject);
-} IServiceProvider_VTable, *LPSERVICEPROVIDER_VTABLE;
-
-struct tagSERVICEPROVIDER
-{ LPSERVICEPROVIDER_VTABLE lpvtbl;
- DWORD ref;
-};
-/****************************************************************************
* Shell Execute API
*/
#define SE_ERR_FNF 2 /* file not found */
@@ -1389,4 +1227,5 @@
#undef THIS_
#undef STDMETHOD
#undef STDMETHOD_
-#endif /*_WINE_SHLOBJ_H*/
+
+#endif /* __WINE_SHLOBJ_H */
diff --git a/include/storage.h b/include/storage.h
index 678ea76..10fd693 100644
--- a/include/storage.h
+++ b/include/storage.h
@@ -1,254 +1,8 @@
#ifndef __WINE_STORAGE_H
#define __WINE_STORAGE_H
+/* "storage.h" is obsolete, you should include "objbase.h" instead */
+
#include "objbase.h"
-#include "windows.h"
-
-/* Does this look like a cellar to you? */
-
-struct storage_header {
- BYTE magic[8]; /* 00: magic */
- BYTE unknown1[36]; /* 08: unknown */
- DWORD num_of_bbd_blocks;/* 2C: length of big datablocks */
- DWORD root_startblock;/* 30: root storage first big block */
- DWORD unknown2[2]; /* 34: unknown */
- DWORD sbd_startblock; /* 3C: small block depot first big block */
- DWORD unknown3[3]; /* 40: unknown */
- DWORD bbd_list[109]; /* 4C: big data block list (up to end of sector)*/
-};
-struct storage_pps_entry {
- WCHAR pps_rawname[32];/* 00: \0 terminated widechar name */
- WORD pps_sizeofname; /* 40: namelength in bytes */
- BYTE pps_type; /* 42: flags, 1 storage/dir, 2 stream, 5 root */
- BYTE pps_unknown0; /* 43: unknown */
- DWORD pps_prev; /* 44: previous pps */
- DWORD pps_next; /* 48: next pps */
- DWORD pps_dir; /* 4C: directory pps */
- GUID pps_guid; /* 50: class ID */
- DWORD pps_unknown1; /* 60: unknown */
- FILETIME pps_ft1; /* 64: filetime1 */
- FILETIME pps_ft2; /* 70: filetime2 */
- DWORD pps_sb; /* 74: data startblock */
- DWORD pps_size; /* 78: datalength. (<0x1000)?small:big blocks*/
- DWORD pps_unknown2; /* 7C: unknown */
-};
-
-#define STORAGE_CHAINENTRY_FAT 0xfffffffd
-#define STORAGE_CHAINENTRY_ENDOFCHAIN 0xfffffffe
-#define STORAGE_CHAINENTRY_FREE 0xffffffff
-
-typedef LPOLESTR16 *SNB16;
-typedef LPOLESTR32 *SNB32;
-DECL_WINELIB_TYPE(SNB)
-
-typedef struct IStorage16 IStorage16,*LPSTORAGE16;
-typedef struct IStorage32 IStorage32,*LPSTORAGE32;
-typedef struct IStream16 IStream16,*LPSTREAM16;
-typedef struct IStream32 IStream32,*LPSTREAM32;
-
-typedef struct IEnumSTATSTG IEnumSTATSTG,*LPENUMSTATSTG;
-
-typedef struct {
- LPOLESTR16 pwcsName;
- DWORD type;
- ULARGE_INTEGER cbSize;
- FILETIME mtime;
- FILETIME ctime;
- FILETIME atime;
- DWORD grfMode;
- DWORD grfLocksSupported;
- CLSID clsid;
- DWORD grfStateBits;
- DWORD reserved;
-} STATSTG;
-
-#define STGM_DIRECT 0x00000000
-#define STGM_TRANSACTED 0x00010000
-#define STGM_SIMPLE 0x08000000
-#define STGM_READ 0x00000000
-#define STGM_WRITE 0x00000001
-#define STGM_READWRITE 0x00000002
-#define STGM_SHARE_DENY_NONE 0x00000040
-#define STGM_SHARE_DENY_READ 0x00000030
-#define STGM_SHARE_DENY_WRITE 0x00000020
-#define STGM_SHARE_EXCLUSIVE 0x00000010
-#define STGM_PRIORITY 0x00040000
-#define STGM_DELETEONRELEASE 0x04000000
-#define STGM_NOSCRATCH 0x00100000
-#define STGM_CREATE 0x00001000
-#define STGM_CONVERT 0x00020000
-#define STGM_FAILIFTHERE 0x00000000
-
-
-/*****************************************************************************
- * IStorage16 interface
- */
-#define ICOM_INTERFACE IStorage16
-ICOM_BEGIN(IStorage16,IUnknown)
- ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm)
- ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm)
- ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg)
- ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg)
- ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest)
- ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags)
- ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags)
- ICOM_METHOD (HRESULT,Revert)
- ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum)
- ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName)
- ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName)
- ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime)
- ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid)
- ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask)
- ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag)
-ICOM_END(IStorage16)
-#undef ICOM_INTERFACE
-
-#if !defined(__cplusplus) || defined(CINTERFACE)
-/*** IUnknown methods ***/
-#define IStorage16_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b)
-#define IStorage16_AddRef(p) ICOM_ICALL (AddRef,p)
-#define IStorage16_Release(p) ICOM_ICALL (Release,p)
-/*** IStorage16 methods ***/
-#define IStorage16_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e)
-#define IStorage16_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e)
-#define IStorage16_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e)
-#define IStorage16_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f)
-#define IStorage16_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d)
-#define IStorage16_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d)
-#define IStorage16_Commit(p,a) ICOM_CALL1(Commit,p,a)
-#define IStorage16_Revert(p) ICOM_CALL (Revert,p)
-#define IStorage16_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d)
-#define IStorage16_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a)
-#define IStorage16_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b)
-#define IStorage16_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d)
-#define IStorage16_SetClass(p,a) ICOM_CALL1(SetClass,p,a)
-#define IStorage16_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b)
-#define IStorage16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
-#endif
-
-
-/*****************************************************************************
- * IStorage32 interface
- */
-#define ICOM_INTERFACE IStorage32
-ICOM_BEGIN(IStorage32,IUnknown)
- ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm)
- ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm)
- ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg)
- ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg)
- ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest)
- ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags)
- ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags)
- ICOM_METHOD (HRESULT,Revert)
- ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum)
- ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName)
- ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName)
- ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime)
- ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid)
- ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask)
- ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag)
-ICOM_END(IStorage32)
-#undef ICOM_INTERFACE
-
-#if !defined(__cplusplus) || defined(CINTERFACE)
-/*** IUnknown methods ***/
-#define IStorage32_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b)
-#define IStorage32_AddRef(p) ICOM_ICALL (AddRef,p)
-#define IStorage32_Release(p) ICOM_ICALL (Release,p)
-/*** IStorage32 methods ***/
-#define IStorage32_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e)
-#define IStorage32_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e)
-#define IStorage32_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e)
-#define IStorage32_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f)
-#define IStorage32_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d)
-#define IStorage32_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d)
-#define IStorage32_Commit(p,a) ICOM_CALL1(Commit,p,a)
-#define IStorage32_Revert(p) ICOM_CALL (Revert,p)
-#define IStorage32_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d)
-#define IStorage32_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a)
-#define IStorage32_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b)
-#define IStorage32_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d)
-#define IStorage32_SetClass(p,a) ICOM_CALL1(SetClass,p,a)
-#define IStorage32_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b)
-#define IStorage32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
-#endif
-
-
-/*****************************************************************************
- * IStream16 interface
- */
-#define ICOM_INTERFACE IStream16
-ICOM_BEGIN(IStream16,IUnknown)
- ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead)
- ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten)
- ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition)
- ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize)
- ICOM_METHOD4(HRESULT,CopyTo, IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten)
- ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags)
- ICOM_METHOD (HRESULT,Revert)
- ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType)
- ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType)
- ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag)
- ICOM_METHOD1(HRESULT,Clone, IStream16**,ppstm)
-ICOM_END(IStream16)
-#undef ICOM_INTERFACE
-
-#if !defined(__cplusplus) || defined(CINTERFACE)
-/*** IUnknown methods ***/
-#define IStream16_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b)
-#define IStream16_AddRef(p) ICOM_ICALL (AddRef,p)
-#define IStream16_Release(p) ICOM_ICALL (Release,p)
-/*** IStream16 methods ***/
-#define IStream16_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c)
-#define IStream16_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
-#define IStream16_Seek(p) ICOM_CALL3(Seek,p)
-#define IStream16_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b)
-#define IStream16_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d)
-#define IStream16_Commit(p,a) ICOM_CALL1(Commit,p,a)
-#define IStream16_Revert(p) ICOM_CALL (Revert,p)
-#define IStream16_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c)
-#define IStream16_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
-#define IStream16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
-#define IStream16_Clone(p,a) ICOM_CALL1(Clone,p,a)
-#endif
-
-
-/*****************************************************************************
- * IStream32 interface
- */
-#define ICOM_INTERFACE IStream32
-ICOM_BEGIN(IStream32,IUnknown)
- ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead)
- ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten)
- ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition)
- ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize)
- ICOM_METHOD4(HRESULT,CopyTo, IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten)
- ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags)
- ICOM_METHOD (HRESULT,Revert)
- ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType)
- ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType)
- ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag)
- ICOM_METHOD1(HRESULT,Clone, IStream32**,ppstm)
-ICOM_END(IStream32)
-#undef ICOM_INTERFACE
-
-#if !defined(__cplusplus) || defined(CINTERFACE)
-/*** IUnknown methods ***/
-#define IStream32_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b)
-#define IStream32_AddRef(p) ICOM_ICALL (AddRef,p)
-#define IStream32_Release(p) ICOM_ICALL (Release,p)
-/*** IStream32 methods ***/
-#define IStream32_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c)
-#define IStream32_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
-#define IStream32_Seek(p) ICOM_CALL3(Seek,p)
-#define IStream32_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b)
-#define IStream32_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d)
-#define IStream32_Commit(p,a) ICOM_CALL1(Commit,p,a)
-#define IStream32_Revert(p) ICOM_CALL (Revert,p)
-#define IStream32_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c)
-#define IStream32_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
-#define IStream32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
-#define IStream32_Clone(p,a) ICOM_CALL1(Clone,p,a)
-#endif
#endif
diff --git a/include/tab.h b/include/tab.h
index 81b7248..40f6e36 100644
--- a/include/tab.h
+++ b/include/tab.h
@@ -9,11 +9,10 @@
typedef struct tagTAB_ITEM
{
- UINT32 mask;
- UINT32 lpReserved1;
- UINT32 lpReserved2;
+ UINT32 mask;
+ DWORD dwState;
LPSTR pszText;
- INT32 cchTextMax;
+ INT32 cchTextMax;
INT32 iImage;
LPARAM lParam;
RECT32 rect; /* bounding rectangle of the item */
@@ -21,13 +20,15 @@
typedef struct tagTAB_INFO
{
- UINT32 uNumItem; /* number of tab items */
- INT32 nHeight; /* height of the tab row */
- HFONT32 hFont; /* handle to the current font */
+ UINT32 uNumItem; /* number of tab items */
+ INT32 nHeight; /* height of the tab row */
+ HFONT32 hFont; /* handle to the current font */
HCURSOR32 hcurArrow; /* handle to the current cursor */
- INT32 iSelected; /* the currently selected item */
+ HIMAGELIST himl; /* handle to a image list (may be 0) */
+ UINT32 cchTextMax;
+ INT32 iSelected; /* the currently selected item */
TAB_ITEM *items; /* pointer to an array of TAB_ITEM's */
- RECT32 rect;
+ RECT32 rect;
} TAB_INFO;
diff --git a/include/unknwn.h b/include/unknwn.h
new file mode 100644
index 0000000..1803cb2
--- /dev/null
+++ b/include/unknwn.h
@@ -0,0 +1,8 @@
+#ifndef __WINE_UNKNWN_H
+#define __WINE_UNKNWN_H
+
+
+#include "wine/obj_base.h"
+
+
+#endif /* __WINE_UNKNWN_H */
diff --git a/include/version.h b/include/version.h
index 6d6aa5a..cf4f0e4 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 990103"
+#define WINE_RELEASE_INFO "Wine release 990110"
diff --git a/include/winbase.h b/include/winbase.h
index 8668da9..8df2d66 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -302,6 +302,7 @@
void WINAPI EnterCriticalSection(CRITICAL_SECTION *lpCrit);
void WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
void WINAPI LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
+void WINAPI MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit);
HANDLE32 WINAPI OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
BOOL32 WINAPI GetProcessWorkingSetSize(HANDLE32,LPDWORD,LPDWORD);
BOOL32 WINAPI SetProcessWorkingSetSize(HANDLE32,DWORD,DWORD);
diff --git a/include/windows.h b/include/windows.h
index db13b18..3b602c4 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -12,8 +12,14 @@
#include "wintypes.h"
#include "winbase.h"
-/* FIXME: Maybe we should try to get something from the Unix headers instead, this should be in windef.h by the way */
+/* FIXME: Maybe MAX_PATH and _MAX_PATH should be computed from the Unix headers instead
+ * and by the way, _MAX_PATH should be defined in stdlib.h and MAX_PATH in windef.h
+ * and mapiwin.h
+ */
+#define _MAX_PATH 260
+#ifndef MAX_PATH
#define MAX_PATH 260
+#endif
#ifndef DONT_INCLUDE_WINGDI
#include "winbase.h"
@@ -3836,6 +3842,8 @@
VOID WINAPI PostEvent(HTASK16);
WORD WINAPI PrestoChangoSelector(WORD,WORD);
BOOL32 WINAPI RegisterShellHook(HWND16,UINT16);
+/* NOTE: This is SYSTEM.3, not USER.182, which is also named KillSystemTimer */
+WORD WINAPI SYSTEM_KillSystemTimer( WORD );
WORD WINAPI SelectorAccessRights(WORD,WORD,WORD);
VOID WINAPI SetPriority(HTASK16,INT16);
FARPROC16 WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16);
@@ -3857,6 +3865,7 @@
BOOL32 WINAPI Beep(DWORD,DWORD);
BOOL32 WINAPI CloseHandle(HANDLE32);
BOOL32 WINAPI CloseServiceHandle(HANDLE32);
+HANDLE32 WINAPI ConvertToGlobalHandle(HANDLE32 hSrc);
BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32);
BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32);
#define CopyFile WINELIB_NAME_AW(CopyFile)
@@ -4135,6 +4144,7 @@
LONG WINAPI RegUnLoadKey32A(HKEY,LPCSTR);
LONG WINAPI RegUnLoadKey32W(HKEY,LPCWSTR);
#define RegUnLoadKey WINELIB_NAME_AW(RegUnLoadKey)
+BOOL32 WINAPI ReleaseMutex(HANDLE32);
BOOL32 WINAPI ReleaseSemaphore(HANDLE32,LONG,LPLONG);
BOOL32 WINAPI ResetEvent(HANDLE32);
DWORD WINAPI ResumeThread(HANDLE32);
diff --git a/include/wine/obj_base.h b/include/wine/obj_base.h
new file mode 100644
index 0000000..d03d1e9
--- /dev/null
+++ b/include/wine/obj_base.h
@@ -0,0 +1,749 @@
+/*
+ * This file defines the macros and types necessary to define COM interfaces,
+ * and the three most basic COM interfaces: IUnknown, IMalloc and IClassFactory.
+ */
+
+#ifndef __WINE_WINE_OBJ_BASE_H
+#define __WINE_WINE_OBJ_BASE_H
+
+
+/*****************************************************************************
+ * Defines the basic types
+ */
+#include "wtypes.h"
+
+
+/*****************************************************************************
+ * Macros to declare the GUIDs
+ */
+#ifdef INITGUID
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ const GUID name = \
+ { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
+#else
+#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+ extern const GUID name
+#endif
+
+#define DEFINE_OLEGUID(name, l, w1, w2) \
+ DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
+
+#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2)
+
+
+/*****************************************************************************
+ * GUID API
+ */
+HRESULT WINAPI StringFromCLSID16(const CLSID *id, LPOLESTR16*);
+HRESULT WINAPI StringFromCLSID32(const CLSID *id, LPOLESTR32*);
+#define StringFromCLSID WINELIB_NAME(StringFromCLSID)
+HRESULT WINAPI CLSIDFromString16(LPCOLESTR16, CLSID *);
+HRESULT WINAPI CLSIDFromString32(LPCOLESTR32, CLSID *);
+#define CLSIDFromString WINELIB_NAME(CLSIDFromString)
+HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid);
+HRESULT WINAPI CLSIDFromProgID32(LPCOLESTR32 progid, LPCLSID riid);
+#define CLSIDFromProgID WINELIB_NAME(CLSIDFromProgID)
+
+INT32 WINAPI StringFromGUID2(REFGUID id, LPOLESTR32 str, INT32 cmax);
+
+BOOL16 WINAPI IsEqualGUID16(GUID* g1,GUID* g2);
+BOOL32 WINAPI IsEqualGUID32(REFGUID rguid1,REFGUID rguid2);
+/*#define IsEqualGUID WINELIB_NAME(IsEqualGUID)*/
+#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
+#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
+#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2)
+
+
+/*****************************************************************************
+ * Macros to define a COM interface
+ */
+/*
+ * The goal of the following set of definitions is to provide a way to use the same
+ * header file definitions to provide both a C interface and a C++ object oriented
+ * interface to COM interfaces. The type of interface is selected automatically
+ * depending on the language but it is always possible to get the C interface in C++
+ * by defining CINTERFACE.
+ *
+ * It is based on the following assumptions:
+ * - all COM interfaces derive from IUnknown, this should not be a problem.
+ * - the header file only defines the interface, the actual fields are defined
+ * separately in the C file implementing the interface.
+ *
+ * The natural approach to this problem would be to make sure we get a C++ class and
+ * virtual methods in C++ and a structure with a table of pointer to functions in C.
+ * Unfortunately the layout of the virtual table is compiler specific, the layout of
+ * g++ virtual tables is not the same as that of an egcs virtual table which is not the
+ * same as that generated by Visual C+. There are workarounds to make the virtual tables
+ * compatible via padding but unfortunately the one which is imposed to the WINE emulator
+ * by the Windows binaries, i.e. the Visual C++ one, is the most compact of all.
+ *
+ * So the solution I finally adopted does not use virtual tables. Instead I use inline
+ * non virtual methods that dereference the method pointer themselves and perform the call.
+ *
+ * Let's take Direct3D as an example:
+ *
+ * #define ICOM_INTERFACE IDirect3D
+ * ICOM_BEGIN(IDirect3D,IUnknown)
+ * ICOM_METHOD1(HRESULT,Initialize, REFIID,);
+ * ICOM_METHOD2(HRESULT,EnumDevices, LPD3DENUMDEVICESCALLBACK,, LPVOID,);
+ * ICOM_METHOD2(HRESULT,CreateLight, LPDIRECT3DLIGHT*,, IUnknown*,);
+ * ICOM_METHOD2(HRESULT,CreateMaterial,LPDIRECT3DMATERIAL*,, IUnknown*,);
+ * ICOM_METHOD2(HRESULT,CreateViewport,LPDIRECT3DVIEWPORT*,, IUnknown*,);
+ * ICOM_METHOD2(HRESULT,FindDevice, LPD3DFINDDEVICESEARCH,, LPD3DFINDDEVICERESULT,);
+ * ICOM_END(IDirect3D)
+ * #undef ICOM_INTERFACE
+ *
+ * #if !defined(__cplusplus) || defined(CINTERFACE)
+ * // *** IUnknown methods *** //
+ * #define IDirect3D_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+ * #define IDirect3D_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+ * #define IDirect3D_Release(p) ICOM_ICALL (IUnknown,Release,p)
+ * // *** IDirect3D methods *** //
+ * #define IDirect3D_Initialize(p,a) ICOM_CALL1(Initialize,p,a)
+ * #define IDirect3D_EnumDevices(p,a,b) ICOM_CALL2(EnumDevice,p,a,b)
+ * #define IDirect3D_CreateLight(p,a,b) ICOM_CALL2(CreateLight,p,a,b)
+ * #define IDirect3D_CreateMaterial(p,a,b) ICOM_CALL2(CreateMaterial,p,a,b)
+ * #define IDirect3D_CreateViewport(p,a,b) ICOM_CALL2(CreateViewport,p,a,b)
+ * #define IDirect3D_FindDevice(p,a,b) ICOM_CALL2(FindDevice,p,a,b)
+ * #endif
+ *
+ * Comments:
+ * - The ICOM_INTERFACE is used in the ICOM_METHOD macros for the 'this' pointer and to cast
+ * pointers. Defining this macro here saves us the trouble of having to repeat the interface
+ * name everywhere. Note haowever that because of the way macros work a macro like ICOM_METHOD1
+ * cannot use 'ICOM_INTERFACE##_VTABLE' because this would give 'ICOM_INTERFACE_VTABLE' and not
+ * 'IDirect3D_VTABLE'.
+ * - ICOM_BEGIN and ICOM_END are responsible for generating whatever structure is appropriate for
+ * representing the interface in the current language. In C this is a couple of structs in C++
+ * it's a class. The first parameter is the interface name and the second one is the interface
+ * we inherit from. The reason why you have to repeat the interface name is because that's the
+ * only way these macro can successfully output "IDirect3D_VTABLE'. Trying to use ICOM_INTERFACE
+ * would, as in ICOM_METHOD, only yield 'ICOM_INTERFACE_VTABLE'.
+ * - With the way ICOM_BEGIN works you don't have to repeat the definitions of the methods of the
+ * parent interface. They are automatically inherited both in C and in C++.
+ * - In C++ the ICOM_METHOD macros generate a function prototype and a call to a function pointer
+ * method. This means using once 't1 p1, t2 p2, ...' and once 'p1, p2' without the types. The
+ * only way I found to handle this is to have one ICOM_METHOD macro per number of parameters and
+ * to have it take only the type information (with const if necessary) as parameters.
+ * The 'undef ICOM_INTERFACE' is here to remind you that using ICOM_INTERFACE in the following
+ * macros will not work. This time it's because the ICOM_CALL macro expansion is done only once
+ * the 'IDirect3D_Xxx' macro is expanded. And by that time ICOM_INTERFACE will be long gone
+ * anyway.
+ * - You may have noticed the double commas after each parameter type. This allows you to put the
+ * name of that parameter which I think is good for documentation. It is not required and since
+ * I did not know what to put there for this example (I could only find doc about IDirect3D2),
+ * I left them blank.
+ * - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access
+ * to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate
+ * the inherited method definitions there. We must use ICOM_ICALL to invoke inherited methods,
+ * because in C we have to cast the virtual table pointer, and we should use the ICOM_CALL
+ * method in the other cases. This time I could have used a trick to use only one macro whatever
+ * the number of parameters but I prefered to have it work the same way as above.
+ * - You probably have noticed that we don't define the fields we need to actually implement this
+ * interface: reference count, pointer to other resources and miscellaneous fields. That's
+ * because it's not needed, and the user will anyway only manipulate pointers to this structure
+ * so he does not need to know its real size. Of course on the implementation side we have the
+ * real definition of the interface structure and they should match what the macros yield in
+ * each language (or conversely).
+ *
+ *
+ * In C this gives:
+ * typedef struct IDirect3D_VTABLE IDirect3D_VTABLE;
+ * struct IDirect3D {
+ * IDirect3D_VTABLE* lpvtbl;
+ * };
+ * struct IDirect3D_VTABLE {
+ * IUnknown_VTABLE bvt;
+ * HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
+ * HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
+ * HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
+ * HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
+ * HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
+ * HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
+ * };
+ *
+ * #if !defined(__cplusplus) || defined(CINTERFACE)
+ * // *** IUnknown methods *** //
+ * #define IDirect3D_QueryInterface(p,a,b) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnQueryInterface((IUnknown*)p,a,b)
+ * #define IDirect3D_AddRef(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnAddRef((IUnknown*)p)
+ * #define IDirect3D_Release(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnRelease((IUnknown*)p)
+ * // *** IDirect3D methods *** //
+ * #define IDirect3D_Initialize(p,a) (p)->lpvtbl->fnInitialize(p,a)
+ * #define IDirect3D_EnumDevices(p,a,b) (p)->lpvtbl->fnEnumDevice(p,a,b)
+ * #define IDirect3D_CreateLight(p,a,b) (p)->lpvtbl->fnCreateLight(p,a,b)
+ * #define IDirect3D_CreateMaterial(p,a,b) (p)->lpvtbl->fnCreateMaterial(p,a,b)
+ * #define IDirect3D_CreateViewport(p,a,b) (p)->lpvtbl->fnCreateViewport(p,a,b)
+ * #define IDirect3D_FindDevice(p,a,b) (p)->lpvtbl->fnFindDevice(p,a,b)
+ * #endif
+ *
+ * Comments:
+ * - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing
+ * the user needs to know to use the interface. Of course the structure we will define to
+ * implement this interface will have more fields but the first one will match this pointer.
+ * - The code generated by ICOM_BEGIN goes up to the bvt field in the IDirect3D virtual table.
+ * This bvt field is what saves us from having to duplicate the inherited method definitions.
+ * It's a shame that C (gcc) will not allow unnamed structs. If this was possible we could
+ * seamlessly inherit and use the parent's interface function pointers.
+ * - What follows is just a bunch of function pointer definitions generated by the ICOM_METHOD
+ * macros. The implementation will fill this jump table with appropriate values in a static
+ * variable and initialize the lpvtbl field to point to this variable.
+ * - The IDirect3D_Xxx macros then just derefence the lpvtbl pointer and use the function pointer
+ * corresponding to the macro name. This emulates the behavior of a virtual table and should be
+ * about as fast. In the case of inherited methods we have some additional casting to do to
+ * because the inherited methods are defined in the bvt field or maybe further imbricated. Since
+ * the effect of the bvt field is that we inherit the parent virtual table fields this cast is
+ * relatively inocuous. A similar cast must be performed on the interface pointer before the
+ * invoked method will accept it. Despite all these casts there is little chance that you call a
+ * method on the wrong type of interface because the function names still have to match. But this
+ * is the only thing that will make the compilation fail.
+ *
+ *
+ * And in C++ (with gcc's g++):
+ *
+ * typedef struct IDirect3D: public IUnknown {
+ * private: HRESULT (*fnInitialize)(IDirect3D* me, REFIID a);
+ * public: inline HRESULT Initialize(REFIID a) { return ((IDirect3D*)t.lpvtbl)->fnInitialize(this,a); };
+ * private: HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b);
+ * public: inline HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b)
+ * { return ((IDirect3D*)t.lpvtbl)->fnEnumDevices(this,a,b); };
+ * private: HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b);
+ * public: inline HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b)
+ * { return ((IDirect3D*)t.lpvtbl)->fnCreateLight(this,a,b); };
+ * private: HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b);
+ * public: inline HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b)
+ * { return ((IDirect3D*)t.lpvtbl)->fnCreateMaterial(this,a,b); };
+ * private: HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b);
+ * public: inline HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b)
+ * { return ((IDirect3D*)t.lpvtbl)->fnCreateViewport(this,a,b); };
+ * private: HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b);
+ * public: inline HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b)
+ * { return ((IDirect3D*)t.lpvtbl)->fnFindDevice(this,a,b); };
+ * };
+ *
+ * Comments:
+ * - In C++ IDirect3D does double duty as both the virtual/jump table and as the interface
+ * definition. The reason for this is to avoid having to duplicate the mehod definitions: once
+ * to have the function pointers in the jump table and once to have the methods in the interface
+ * class. Here one macro can generate both. This means though that the first pointer, t.lpvtbl
+ * defined in IUnknown, must be interpreted as the jump table pointer if we interpret the
+ * structure as the the interface class, and as the function pointer to the QueryInterface
+ * method, t.fnQueryInterface, if we interpret the structure as the jump table. Fortunately this
+ * gymnastic is entirely taken care of in the header of IUnknown.
+ * - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions.
+ * - Since IDirect3D does double duty, each ICOM_METHOD macro defines both a function pointer and
+ * a non-vritual inline method which dereferences it and calls it. This way this method behaves
+ * just like a virtual method but does not create a true C++ virtual table which would break the
+ * structure layout. If you look at the implementation of these methods you'll notice that they
+ * would not work for void functions. We have to return something and fortunately this seems to
+ * be what all the COM methods do (otherwise we would need another set of macros).
+ * - Note how the ICOM_METHOD generates both function prototypes mixing types and formal parameter
+ * names and the method invocation using only the formal parameter name. This is the reason why
+ * we need different macros to handle different numbers of parameters.
+ * - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE
+ * macro is defined in which case we would not be here.
+ *
+ *
+ * Implementing a COM interface.
+ *
+ * This continues the above example.I assume the implementation is in C but it would probably
+ * be similar in C++.
+ *
+ * typedef struct _IDirect3D {
+ * void* lpvtbl;
+ * // ...
+ *
+ * } _IDirect3D;
+ *
+ * static ICOM_VTABLE(IDirect3D) d3dvt;
+ *
+ * // implement the IDirect3D methods here
+ *
+ * int IDirect3D_fnQueryInterface(LPUNKNOWN me)
+ * {
+ * ICOM_THIS(IDirect3D,me);
+ * // ...
+ * }
+ *
+ * // ...
+ *
+ * static ICOM_VTABLE(IDirect3D) d3dvt = {
+ * {
+ * IDirect3D_fnQueryInterface,
+ * IUnknown_fnAdd,
+ * IUnknown_fnAdd2
+ * },
+ * IDirect3D_fnInitialize,
+ * IDirect3D_fnSetWidth
+ * };
+ *
+ * Comments:
+ * - We first define what the interface really contains. This is th e_IDirect3D structure. The
+ * first field must of course be the virtual table pointer. Everything else is free.
+ * - Then we predeclare our static virtual table variable, we will need its address in some
+ * methods to initialize the virtual table pointer of the returned interface objects.
+ * - Then we implement the interface methods. To match what has been declared in the header file
+ * they must take a pointer to a IDirect3D structure so we must cast it to an _IDirect3D so that
+ * we can manipulate the fields. This is performed by the ICOM_THIS macro.
+ * - Finally we initialize the virtual table. The inherited methods must be in curly brackets to
+ * match the parent interface's virtual table definition.
+ */
+
+
+#define ICOM_VTABLE(iface) iface##_VTABLE
+
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+/* C++ interface */
+
+#define ICOM_BEGIN(iface,ibase) \
+ typedef struct iface: public ibase {
+
+
+#define ICOM_METHOD(ret,xfn) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \
+ public: inline ret (CALLBACK xfn)(void) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
+
+#define ICOM_METHOD1(ret,xfn,ta,na) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); \
+ public: inline ret (CALLBACK xfn)(ta a) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
+
+#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
+
+#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
+
+#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
+
+#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
+
+#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
+
+#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
+
+
+#define ICOM_CMETHOD(ret,xfn) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); \
+ public: inline ret (CALLBACK xfn)(void) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
+
+#define ICOM_CMETHOD1(ret,xfn,ta,na) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); \
+ public: inline ret (CALLBACK xfn)(ta a) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
+
+#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
+
+#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
+
+#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
+
+#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
+
+#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
+
+#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
+ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
+
+
+#define ICOM_VMETHOD(xfn) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \
+ public: inline void (CALLBACK xfn)(void) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
+
+#define ICOM_VMETHOD1(xfn,ta,na) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); \
+ public: inline void (CALLBACK xfn)(ta a) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
+
+#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); \
+ public: inline void (CALLBACK xfn)(ta a,tb b) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
+
+#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
+
+#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
+
+#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
+
+#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
+
+#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
+
+
+#define ICOM_CVMETHOD(xfn) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); \
+ public: inline void (CALLBACK xfn)(void) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); };
+
+#define ICOM_CVMETHOD1(xfn,ta,na) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); \
+ public: inline void (CALLBACK xfn)(ta a) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); };
+
+#define ICOM_CVMETHOD2(xfn,ta,na,tb,nb) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); \
+ public: inline void (CALLBACK xfn)(ta a,tb b) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); };
+
+#define ICOM_CVMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); };
+
+#define ICOM_CVMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); };
+
+#define ICOM_CVMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); };
+
+#define ICOM_CVMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); };
+
+#define ICOM_CVMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \
+ public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); };
+
+
+#define ICOM_END(iface) \
+ };
+
+#define ICOM_ICALL(ibase, xfn, p) this_is_a_syntax_error
+#define ICOM_ICALL1(ibase, xfn, p,a) this_is_a_syntax_error
+#define ICOM_ICALL2(ibase, xfn, p,a,b) this_is_a_syntax_error
+#define ICOM_ICALL3(ibase, xfn, p,a,b,c) this_is_a_syntax_error
+#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) this_is_a_syntax_error
+#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) this_is_a_syntax_error
+#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) this_is_a_syntax_error
+#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error
+
+#define ICOM_CALL(xfn, p) this_is_a_syntax_error
+#define ICOM_CALL1(xfn, p,a) this_is_a_syntax_error
+#define ICOM_CALL2(xfn, p,a,b) this_is_a_syntax_error
+#define ICOM_CALL3(xfn, p,a,b,c) this_is_a_syntax_error
+#define ICOM_CALL4(xfn, p,a,b,c,d) this_is_a_syntax_error
+#define ICOM_CALL5(xfn, p,a,b,c,d,e) this_is_a_syntax_error
+#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) this_is_a_syntax_error
+#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error
+
+
+#else
+/* C interface */
+
+
+#define ICOM_BEGIN(iface,ibase) \
+ typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \
+ struct iface { \
+ const ICOM_VTABLE(iface)* lpvtbl; \
+ }; \
+ struct ICOM_VTABLE(iface) { \
+ ICOM_VTABLE(ibase) bvt;
+
+
+#define ICOM_METHOD(ret,xfn) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me);
+
+#define ICOM_METHOD1(ret,xfn,ta,na) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a);
+
+#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b);
+
+#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
+
+#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
+
+#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
+
+#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
+
+#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
+
+
+#define ICOM_CMETHOD(ret,xfn) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me);
+
+#define ICOM_CMETHOD1(ret,xfn,ta,na) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a);
+
+#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b);
+
+#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c);
+
+#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
+
+#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
+
+#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
+
+#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
+
+
+#define ICOM_VMETHOD(xfn) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me);
+
+#define ICOM_VMETHOD1(xfn,ta,na) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a);
+
+#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b);
+
+#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c);
+
+#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
+
+#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
+
+#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
+
+#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
+
+
+#define ICOM_CVMETHOD(xfn) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me);
+
+#define ICOM_CVMETHOD1(xfn,ta,na) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a);
+
+#define ICOM_CVMETHOD2(xfn,ta,na,tb,nb) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b);
+
+#define ICOM_CVMETHOD3(xfn,ta,na,tb,nb,tc,nc) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c);
+
+#define ICOM_CVMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d);
+
+#define ICOM_CVMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e);
+
+#define ICOM_CVMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f);
+
+#define ICOM_CVMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \
+ void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g);
+
+
+#define ICOM_END(iface) \
+ };
+
+#define ICOM_ICALL(ibase, xfn, p) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p)
+#define ICOM_ICALL1(ibase, xfn, p,a) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a)
+#define ICOM_ICALL2(ibase, xfn, p,a,b) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b)
+#define ICOM_ICALL3(ibase, xfn, p,a,b,c) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c)
+#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d)
+#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e)
+#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f)
+#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f,g)
+
+#define ICOM_CALL(xfn, p) (p)->lpvtbl->fn##xfn(p)
+#define ICOM_CALL1(xfn, p,a) (p)->lpvtbl->fn##xfn(p,a)
+#define ICOM_CALL2(xfn, p,a,b) (p)->lpvtbl->fn##xfn(p,a,b)
+#define ICOM_CALL3(xfn, p,a,b,c) (p)->lpvtbl->fn##xfn(p,a,b,c)
+#define ICOM_CALL4(xfn, p,a,b,c,d) (p)->lpvtbl->fn##xfn(p,a,b,c,d)
+#define ICOM_CALL5(xfn, p,a,b,c,d,e) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e)
+#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f)
+#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f,g)
+
+
+#define ICOM_THIS(iface,me) struct _##iface* this=(struct _##iface*)me
+#define ICOM_CTHIS(iface,me) const _##iface* this=(const _##iface*)me
+
+#endif
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IClassFactory, 0x00000001L, 0, 0);
+typedef struct IClassFactory IClassFactory, *LPCLASSFACTORY;
+
+DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0);
+typedef struct IMalloc16 IMalloc16,*LPMALLOC16;
+typedef struct IMalloc32 IMalloc32,*LPMALLOC32;
+DECL_WINELIB_TYPE(IMalloc)
+DECL_WINELIB_TYPE(LPMALLOC)
+
+DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0);
+typedef struct IUnknown IUnknown, *LPUNKNOWN;
+
+
+/*****************************************************************************
+ * IUnknown interface
+ */
+#define ICOM_INTERFACE IUnknown
+#if defined(__cplusplus) && !defined(CINTERFACE)
+struct IUnknown {
+ union {
+ const void* lpvtbl;
+ HRESULT (CALLBACK *fnQueryInterface)(IUnknown* me, REFIID riid, LPVOID* ppvObj);
+ } t;
+ inline int QueryInterface(REFIID a, LPVOID* b) { return ((IUnknown*)t.lpvtbl)->t.fnQueryInterface(this,a,b); }
+#else
+typedef struct ICOM_VTABLE(IUnknown) ICOM_VTABLE(IUnknown);
+struct IUnknown {
+ ICOM_VTABLE(IUnknown)* lpvtbl;
+};
+struct ICOM_VTABLE(IUnknown) {
+ ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj)
+#endif
+
+ ICOM_METHOD (ULONG,AddRef)
+ ICOM_METHOD (ULONG,Release)
+#ifdef __WRC__
+}; /* FIXME: WRC does not support function macros and it is ICOM_END that is supposed to close the class */
+#else
+ICOM_END(IUnknown)
+#endif
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IUnknown_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
+#define IUnknown_AddRef(p) ICOM_CALL (AddRef,p)
+#define IUnknown_Release(p) ICOM_CALL (Release,p)
+#endif
+
+
+/*****************************************************************************
+ * IClassFactory interface
+ */
+#define ICOM_INTERFACE IClassFactory
+ICOM_BEGIN(IClassFactory,IUnknown)
+ ICOM_METHOD3(HRESULT,CreateInstance, LPUNKNOWN,pUnkOuter, REFIID,riid, LPVOID*,ppvObject);
+ ICOM_METHOD1(HRESULT,LockServer, BOOL32,fLock);
+ICOM_END(IClassFactory)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IClassFactory_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IClassFactory_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IClassFactory_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IClassFactory methods ***/
+#define IClassFactory_CreateInstance(p,a,b,c) ICOM_CALL3(CreateInstance,p,a,b,c)
+#define IClassFactory_LockServer(p,a) ICOM_CALL1(LockServer,p,a)
+#endif
+
+
+/*****************************************************************************
+ * IMalloc interface
+ */
+#define ICOM_INTERFACE IMalloc16
+ICOM_BEGIN(IMalloc16,IUnknown)
+ ICOM_METHOD1 (LPVOID,Alloc, DWORD,cb);
+ ICOM_METHOD2 (LPVOID,Realloc, LPVOID,pv, DWORD,cb);
+ ICOM_VMETHOD1( Free, LPVOID,pv);
+ ICOM_CMETHOD1(DWORD, GetSize, LPVOID,pv);
+ ICOM_CMETHOD1(INT16, DidAlloc, LPVOID,pv);
+ ICOM_METHOD (LPVOID,HeapMinimize);
+ICOM_END(IMalloc16)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IMalloc16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IMalloc16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IMalloc16_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IMalloc16 methods ***/
+#define IMalloc16_Alloc(p,a) ICOM_CALL1(Alloc,p,a)
+#define IMalloc16_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b)
+#define IMalloc16_Free(p,a) ICOM_CALL1(Free,p,a)
+#define IMalloc16_GetSize(p,a) ICOM_CALL1(GetSize,p,a)
+#define IMalloc16_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a)
+#define IMalloc16_HeapMinimize(p) ICOM_CALL (HeapMinimize,p)
+#endif
+
+
+#define ICOM_INTERFACE IMalloc32
+ICOM_BEGIN(IMalloc32,IUnknown)
+ ICOM_METHOD1 (LPVOID,Alloc, DWORD,cb);
+ ICOM_METHOD2 (LPVOID,Realloc, LPVOID,pv, DWORD,cb);
+ ICOM_VMETHOD1( Free, LPVOID,pv);
+ ICOM_CMETHOD1(DWORD, GetSize, LPVOID,pv);
+ ICOM_CMETHOD1(INT32, DidAlloc, LPVOID,pv);
+ ICOM_METHOD (LPVOID,HeapMinimize);
+ICOM_END(IMalloc32)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IMalloc32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IMalloc32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IMalloc32_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IMalloc32 methods ***/
+#define IMalloc32_Alloc(p,a) ICOM_CALL1(Alloc,p,a)
+#define IMalloc32_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b)
+#define IMalloc32_Free(p,a) ICOM_CALL1(Free,p,a)
+#define IMalloc32_GetSize(p,a) ICOM_CALL1(GetSize,p,a)
+#define IMalloc32_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a)
+#define IMalloc32_HeapMinimize(p) ICOM_CALL (HeapMinimize,p)
+
+#ifndef __WINE__
+/* Duplicated for WINELIB */
+/*** IUnknown methods ***/
+#define IMalloc_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IMalloc_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IMalloc_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IMalloc methods ***/
+#define IMalloc_Alloc(p,a) ICOM_CALL1(Alloc,p,a)
+#define IMalloc_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b)
+#define IMalloc_Free(p,a) ICOM_CALL1(Free,p,a)
+#define IMalloc_GetSize(p,a) ICOM_CALL1(GetSize,p,a)
+#define IMalloc_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a)
+#define IMalloc_HeapMinimize(p) ICOM_CALL (HeapMinimize,p)
+#endif
+#endif
+
+
+HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, LPMALLOC16* lpMalloc);
+#define CoCreateStandardMalloc WINELIB_NAME(CoCreateStandardMalloc)
+
+HRESULT WINAPI CoGetMalloc16(DWORD dwMemContext,LPMALLOC16* lpMalloc);
+HRESULT WINAPI CoGetMalloc32(DWORD dwMemContext,LPMALLOC32* lpMalloc);
+#define CoGetMalloc WINELIB_NAME(CoGetMalloc)
+
+
+#endif /* __WINE_WINE_OBJ_BASE_H */
diff --git a/include/wine/obj_channel.h b/include/wine/obj_channel.h
new file mode 100644
index 0000000..e6372c4
--- /dev/null
+++ b/include/wine/obj_channel.h
@@ -0,0 +1,60 @@
+/*
+ * Defines undocumented Microsoft COM interfaces and APIs seemingly related to some 'channel' notion.
+ *
+ * Depends on 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_CHANNEL_H
+#define __WINE_WINE_OBJ_CHANNEL_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_GUID (IID_IChannelHook, 0x1008c4a0L, 0x7613, 0x11cf, 0x9a, 0xf1, 0x00, 0x20, 0xaf, 0x6e, 0x72, 0xf4);
+typedef struct IChannelHook IChannelHook,*LPCHANNELHOOK;
+
+DEFINE_GUID (IID_IPSFactoryBuffer, 0xd5f569d0L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a);
+typedef struct IPSFactoryBuffer IPSFactoryBuffer,*LPPSFACTORYBUFFER;
+
+DEFINE_GUID (IID_IRpcChannelBuffer, 0xd5f56b60L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a);
+typedef struct IRpcChannelBuffer IRpcChannelBuffer,*LPRPCCHANNELBUFFER;
+
+DEFINE_GUID (IID_IRpcProxyBuffer, 0xd5f56a34L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a);
+typedef struct IRpcProxyBuffer IRpcProxyBuffer,*LPRPCPROXYBUFFER;
+
+DEFINE_GUID (IID_IRpcStubBuffer, 0xd5f56afcL, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a);
+typedef struct IRpcStubBuffer IRpcStubBuffer,*LPRPCSTUBBUFFER;
+
+
+/*****************************************************************************
+ * IChannelHook interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IPSFactoryBuffer interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRpcChannelBuffer interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRpcProxyBuffer interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRpcStubBuffer interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_CHANNEL_H */
diff --git a/include/wine/obj_clientserver.h b/include/wine/obj_clientserver.h
new file mode 100644
index 0000000..81aa7c9
--- /dev/null
+++ b/include/wine/obj_clientserver.h
@@ -0,0 +1,57 @@
+/*
+ * Defines the COM interfaces and APIs related to client/server aspects.
+ *
+ * Depends on 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_CLIENTSERVER_H
+#define __WINE_WINE_OBJ_CLIENTSERVER_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IClientSecurity, 0x0000013dL, 0, 0);
+typedef struct IClientSecurity IClientSecurity,*LPCLIENTSECURITY;
+
+DEFINE_OLEGUID(IID_IExternalConnection, 0x00000019L, 0, 0);
+typedef struct IExternalConnection IExternalConnection,*LPEXTERNALCONNECTION;
+
+DEFINE_OLEGUID(IID_IMessageFilter, 0x00000016L, 0, 0);
+typedef struct IMessageFilter IMessageFilter,*LPMESSAGEFILTER;
+
+DEFINE_OLEGUID(IID_IServerSecurity, 0x0000013eL, 0, 0);
+typedef struct IServerSecurity IServerSecurity,*LPSERVERSECURITY;
+
+
+/*****************************************************************************
+ * IClientSecurity interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IExternalConnection interface
+ */
+/* FIXME: not implemented */
+
+HRESULT WINAPI CoDisconnectObject(LPUNKNOWN lpUnk, DWORD reserved);
+
+
+/*****************************************************************************
+ * IMessageFilter interface
+ */
+/* FIXME: not implemented */
+
+HRESULT WINAPI CoRegisterMessageFilter16(LPMESSAGEFILTER lpMessageFilter,LPMESSAGEFILTER *lplpMessageFilter);
+HRESULT WINAPI CoRegisterMessageFilter32(LPMESSAGEFILTER lpMessageFilter,LPMESSAGEFILTER *lplpMessageFilter);
+#define CoRegisterMessageFilter WINELIB_NAME(CoRegisterMessageFilter)
+
+
+/*****************************************************************************
+ * IServerSecurity interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_CLIENTSERVER_H */
diff --git a/include/wine/obj_dataobject.h b/include/wine/obj_dataobject.h
new file mode 100644
index 0000000..4bc3bac
--- /dev/null
+++ b/include/wine/obj_dataobject.h
@@ -0,0 +1,192 @@
+/*
+ * Defines the COM interfaces and APIs related to IDataObject.
+ *
+ * Depends on 'obj_moniker.h', 'obj_storage.h' and 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_DATAOBJECT_H
+#define __WINE_WINE_OBJ_DATAOBJECT_H
+
+
+/*****************************************************************************
+ * Predeclare the structures
+ */
+typedef struct DVTARGETDEVICE32 DVTARGETDEVICE32, *LPDVTARGETDEVICE32;
+DECL_WINELIB_TYPE(DVTARGETDEVICE)
+DECL_WINELIB_TYPE(LPDVTARGETDEVICE)
+
+typedef struct FORMATETC32 FORMATETC32, *LPFORMATETC32;
+DECL_WINELIB_TYPE(FORMATETC)
+DECL_WINELIB_TYPE(LPFORMATETC)
+
+typedef struct STGMEDIUM32 STGMEDIUM32, *LPSTGMEDIUM32;
+DECL_WINELIB_TYPE(STGMEDIUM)
+DECL_WINELIB_TYPE(LPSTGMEDIUM)
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IAdviseSink, 0x0000010fL, 0, 0);
+typedef struct IAdviseSink IAdviseSink,*LPADVISESINK;
+
+DEFINE_OLEGUID(IID_IAdviseSink2, 0x00000125L, 0, 0);
+typedef struct IAdviseSink2 IAdviseSink2,*LPADVISESINK2;
+
+DEFINE_OLEGUID(IID_IDataAdviseHolder, 0x00000110L, 0, 0);
+typedef struct IDataAdviseHolder IDataAdviseHolder,*LPDATAADVISEHOLDER;
+
+DEFINE_OLEGUID(IID_IDataObject, 0x0000010EL, 0, 0);
+typedef struct IDataObject IDataObject,*LPDATAOBJECT;
+
+DEFINE_OLEGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0);
+typedef struct IEnumFORMATETC IEnumFORMATETC,*LPENUMFORMATETC;
+
+DEFINE_OLEGUID(IID_IEnumSTATDATA, 0x00000105L, 0, 0);
+typedef struct IEnumSTATDATA IEnumSTATDATA,*LPENUMSTATDATA;
+
+
+/*****************************************************************************
+ * DVTARGETDEVICE structure
+ */
+struct DVTARGETDEVICE32
+{
+ DWORD tdSize;
+ WORD tdDriverNameOffset;
+ WORD tdDeviceNameOffset;
+ WORD tdPortNameOffset;
+ WORD tdExtDevmodeOffset;
+ BYTE tdData[1];
+};
+
+
+/*****************************************************************************
+ * FORMATETC structure
+ */
+/* wished data format */
+struct FORMATETC32
+{
+ CLIPFORMAT32 cfFormat;
+ DVTARGETDEVICE32* ptd;
+ DWORD dwAspect;
+ LONG lindex;
+ DWORD tymed;
+};
+
+
+/*****************************************************************************
+ * STGMEDIUM structure
+ */
+typedef enum tagTYMED
+{ TYMED_HGLOBAL = 1,
+ TYMED_FILE = 2,
+ TYMED_ISTREAM = 4,
+ TYMED_ISTORAGE = 8,
+ TYMED_GDI = 16,
+ TYMED_MFPICT = 32,
+ TYMED_ENHMF = 64,
+ TYMED_NULL = 0
+} TYMED;
+
+/* dataobject as answer to a request */
+struct STGMEDIUM32
+{
+ DWORD tymed;
+ union {
+ HBITMAP32 hBitmap;
+ HMETAFILEPICT32 hMetaFilePict;
+ HENHMETAFILE32 hEnhMetaFile;
+ HGLOBAL32 hGlobal;
+ LPOLESTR32 lpszFileName;
+ IStream32 *pstm;
+ IStorage32 *pstg;
+ } u;
+ IUnknown *pUnkForRelease;
+};
+
+
+/*****************************************************************************
+ * IAdviseSink interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IAdviseSink2 interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IDataAdviseHolder interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IDataObject interface
+ */
+#define ICOM_INTERFACE IDataObject
+ICOM_BEGIN(IDataObject,IUnknown)
+ ICOM_METHOD2(HRESULT,GetData, LPFORMATETC32,pformatetcIn, STGMEDIUM32*,pmedium);
+ ICOM_METHOD2(HRESULT,GetDataHere, LPFORMATETC32,pformatetc, STGMEDIUM32*,pmedium);
+ ICOM_METHOD1(HRESULT,QueryGetData, LPFORMATETC32,pformatetc);
+ ICOM_METHOD2(HRESULT,GetCanonicalFormatEtc, LPFORMATETC32,pformatectIn, LPFORMATETC32,pformatetcOut);
+ ICOM_METHOD3(HRESULT,SetData, LPFORMATETC32,pformatetc, STGMEDIUM32*,pmedium, BOOL32,fRelease);
+ ICOM_METHOD2(HRESULT,EnumFormatEtc, DWORD,dwDirection, IEnumFORMATETC**,ppenumFormatEtc);
+ ICOM_METHOD4(HRESULT,DAdvise, LPFORMATETC32*,pformatetc, DWORD,advf, IAdviseSink*,pAdvSink, DWORD*,pdwConnection);
+ ICOM_METHOD1(HRESULT,DUnadvise, DWORD,dwConnection);
+ ICOM_METHOD1(HRESULT,EnumDAdvise, IEnumSTATDATA**,ppenumAdvise);
+ICOM_END(IDataObject)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IDataObject_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IDataObject_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IDataObject_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IDataObject methods ***/
+#define IDataObject_GetData(p,a,b) ICOM_CALL2(GetData,p,a,b)
+#define IDataObject_GetDataHere(p,a,b) ICOM_CALL2(GetDataHere,p,a,b)
+#define IDataObject_QueryGetData(p,a) ICOM_CALL1(QueryGetData,p,a)
+#define IDataObject_GetCanonicalFormatEtc(p,a,b) ICOM_CALL2(GetCanonicalFormatEtc,p,a,b)
+#define IDataObject_SetData(p,a,b,c) ICOM_CALL3(SetData,p,a,b,c)
+#define IDataObject_EnumFormatEtc(p,a,b) ICOM_CALL2(EnumFormatEtc,p,a,b)
+#define IDataObject_DAdvise(p,a,b,c,d) ICOM_CALL4(DAdvise,p,a,b,c,d)
+#define IDataObject_DUnadvise(p,a) ICOM_CALL1(DUnadvise,p,a)
+#define IDataObject_EnumDAdvise(p,a) ICOM_CALL1(EnumDAdvise,p,a)
+#endif
+
+
+/*****************************************************************************
+ * IEnumFORMATETC interface
+ */
+#define ICOM_INTERFACE IEnumFORMATETC
+ICOM_BEGIN(IEnumFORMATETC,IUnknown)
+ ICOM_METHOD3(HRESULT,Next, ULONG,celt, FORMATETC32*,rgelt, ULONG*,pceltFethed);
+ ICOM_METHOD1(HRESULT,Skip, ULONG,celt);
+ ICOM_METHOD (HRESULT,Reset);
+ ICOM_METHOD1(HRESULT,Clone, IEnumFORMATETC**,ppenum);
+ICOM_END(IEnumFORMATETC)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IEnumFORMATETC_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IEnumFORMATETC_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IEnumFORMATETC_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IEnumFORMATETC methods ***/
+#define IEnumFORMATETC_Next(p,a,b,c) ICOM_CALL3(Next,p,a,b,c)
+#define IEnumFORMATETC_Skip(p,a) ICOM_CALL1(Skip,p,a)
+#define IEnumFORMATETC_Reset(p) ICOM_CALL (Reset,p)
+#define IEnumFORMATETC_Clone(p,a) ICOM_CALL1(Clone,p,a)
+#endif
+
+
+/*****************************************************************************
+ * IEnumSTATDATA interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_DATAOBJECT_H */
diff --git a/include/wine/obj_marshal.h b/include/wine/obj_marshal.h
new file mode 100644
index 0000000..92fc243
--- /dev/null
+++ b/include/wine/obj_marshal.h
@@ -0,0 +1,34 @@
+/*
+ * Defines the COM interfaces and APIs that allow an interface to
+ * specify a custom marshaling for its objects.
+ *
+ * Depends on 'obj_storage.h' and 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_MARSHAL_H
+#define __WINE_WINE_OBJ_MARSHAL_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IMarshal, 0x00000003L, 0, 0);
+typedef struct IMarshal IMarshal,*LPMARSHAL;
+
+DEFINE_OLEGUID(IID_IStdMarshalInfo, 0x00000018L, 0, 0);
+typedef struct IStdMarshalInfo IStdMarshalInfo,*LPSTDMARSHALINFO;
+
+
+/*****************************************************************************
+ * IMarshal interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IStdMarshalInfo interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_MARSHAL_H */
diff --git a/include/wine/obj_misc.h b/include/wine/obj_misc.h
new file mode 100644
index 0000000..98dc1e4
--- /dev/null
+++ b/include/wine/obj_misc.h
@@ -0,0 +1,54 @@
+/*
+ * Defines miscellaneous COM interfaces and APIs defined in objidl.h.
+ * These did not really fit into the other categories, whould have
+ * required their own specific category or are too rarely used to be
+ * put in 'obj_base.h'.
+ *
+ * Depends on 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_MISC_H
+#define __WINE_WINE_OBJ_MISC_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IEnumString, 0x00000101L, 0, 0);
+typedef struct IEnumString IEnumString,*LPENUMSTRING;
+
+DEFINE_OLEGUID(IID_IEnumUnknown, 0x00000100L, 0, 0);
+typedef struct IEnumUnknown IEnumUnknown,*LPENUMUNKNOWN;
+
+DEFINE_OLEGUID(IID_IMallocSpy, 0x0000001dL, 0, 0);
+typedef struct IMallocSpy IMallocSpy,*LPMALLOCSPY;
+
+DEFINE_OLEGUID(IID_IMultiQI, 0x00000020L, 0, 0);
+typedef struct IMultiQI IMultiQI,*LPMULTIQI;
+
+
+/*****************************************************************************
+ * IEnumString interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IEnumUnknown interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IMallocSpy interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IMultiQI interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_MISC_H */
diff --git a/include/wine/obj_moniker.h b/include/wine/obj_moniker.h
new file mode 100644
index 0000000..194ddd0
--- /dev/null
+++ b/include/wine/obj_moniker.h
@@ -0,0 +1,87 @@
+/*
+ * Defines the COM interfaces and APIs related to the moniker functionality.
+ *
+ * This file depends on 'obj_storage.h' and 'obj_base.h'.
+ */
+
+
+#ifndef __WINE_WINE_OBJ_MONIKER_H
+#define __WINE_WINE_OBJ_MONIKER_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IBindCtx,0xe,0,0);
+typedef struct IBindCtx IBindCtx,*LPBINDCTX;
+typedef LPBINDCTX LPBC;
+
+DEFINE_OLEGUID(IID_IClassActivator, 0x00000140L, 0, 0);
+typedef struct IClassActivator IClassActivator,*LPCLASSACTIVATOR;
+
+DEFINE_OLEGUID(IID_IEnumMoniker, 0x00000102L, 0, 0);
+typedef struct IEnumMoniker IEnumMoniker,*LPENUMMONIKER;
+
+DEFINE_OLEGUID(IID_IMoniker, 0x0000000fL, 0, 0);
+typedef struct IMoniker IMoniker,*LPMONIKER;
+
+DEFINE_GUID (IID_IROTData, 0xf29f6bc0L, 0x5021, 0x11ce, 0xaa, 0x15, 0x00, 0x00, 0x69, 0x01, 0x29, 0x3f);
+typedef struct IROTData IROTData,*LPROTDATA;
+
+DEFINE_OLEGUID(IID_IRunnableObject, 0x00000126L, 0, 0);
+typedef struct IRunnableObject IRunnableObject,*LPRUNNABLEOBJECT;
+
+DEFINE_OLEGUID(IID_IRunningObjectTable, 0x00000010L, 0, 0);
+typedef struct IRunningObjectTable IRunningObjectTable,*LPRUNNINGOBJECTTABLE;
+
+
+/*****************************************************************************
+ * IBindCtx interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IClassActivator interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IEnumMoniker interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IMoniker interface
+ */
+/* FIXME: not implemented */
+
+HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName,LPMONIKER* ppmk);
+HRESULT WINAPI CreateFileMoniker32(LPCOLESTR32 lpszPathName,LPMONIKER* ppmk);
+#define CreateFileMoniker WINELIB_NAME(CreateFileMoniker)
+
+HRESULT WINAPI CreateItemMoniker32(LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem,LPMONIKER* ppmk);
+#define CreateItemMoniker WINELIB_NAME(CreateItemMoniker)
+
+
+/*****************************************************************************
+ * IROTData interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRunnableObject interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRunningObjectTable interface
+ */
+/* FIXME: not implemented */
+
+
+#endif /* __WINE_WINE_OBJ_MONIKER_H */
diff --git a/include/wine/obj_propertystorage.h b/include/wine/obj_propertystorage.h
new file mode 100644
index 0000000..837daa1
--- /dev/null
+++ b/include/wine/obj_propertystorage.h
@@ -0,0 +1,52 @@
+/*
+ * Defines the COM interfaces and APIs related to saving properties to file.
+ *
+ * Depends on 'obj_storage.h' and 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_PROPERTYSTORAGE_H
+#define __WINE_WINE_OBJ_PROPERTYSTORAGE_H
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IEnumSTATPROPSETSTG, 0x0000013bL, 0, 0);
+typedef struct IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG,*LPENUMSTATPROPSETSTG;
+
+DEFINE_OLEGUID(IID_IEnumSTATPROPSTG, 0x00000139L, 0, 0);
+typedef struct IEnumSTATPROPSTG IEnumSTATPROPSTG,*LPENUMSTATPROPSTG;
+
+DEFINE_OLEGUID(IID_IPropertySetStorage, 0x0000013aL, 0, 0);
+typedef struct IPropertySetStorage IPropertySetStorage,*LPPROPERTYSETSTORAGE;
+
+DEFINE_OLEGUID(IID_IPropertyStorage, 0x00000138L, 0, 0);
+typedef struct IPropertyStorage IPropertyStorage,*LPPROPERTYSTORAGE;
+
+
+/*****************************************************************************
+ * IEnumSTATPROPSETSTG interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IEnumSTATPROPSTG interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IPropertySetStorage interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IPropertyStorage interface
+ */
+/* FIXME: not implemented */
+
+
+
+#endif /* __WINE_WINE_OBJ_PROPERTYSTORAGE_H */
diff --git a/include/wine/obj_storage.h b/include/wine/obj_storage.h
new file mode 100644
index 0000000..88797d6
--- /dev/null
+++ b/include/wine/obj_storage.h
@@ -0,0 +1,459 @@
+/*
+ * Defines the COM interfaces and APIs related to structured data storage.
+ *
+ * Depends on 'obj_base.h'.
+ */
+
+#ifndef __WINE_WINE_OBJ_STORAGE_H
+#define __WINE_WINE_OBJ_STORAGE_H
+
+
+#include "winnt.h"
+
+
+/*****************************************************************************
+ * Predeclare the structures
+ */
+typedef LPOLESTR16 *SNB16;
+typedef LPOLESTR32 *SNB32;
+DECL_WINELIB_TYPE(SNB)
+
+typedef struct STATSTG STATSTG;
+
+
+/*****************************************************************************
+ * Predeclare the interfaces
+ */
+DEFINE_OLEGUID(IID_IEnumSTATSTG, 0x0000000dL, 0, 0);
+typedef struct IEnumSTATSTG IEnumSTATSTG,*LPENUMSTATSTG;
+
+DEFINE_GUID (IID_IFillLockBytes, 0x99caf010L, 0x415e, 0x11cf, 0x88, 0x14, 0x00, 0xaa, 0x00, 0xb5, 0x69, 0xf5);
+typedef struct IFillLockBytes IFillLockBytes,*LPFILLLOCKBYTES;
+
+DEFINE_GUID (IID_ILayoutStorage, 0x0e6d4d90L, 0x6738, 0x11cf, 0x96, 0x08, 0x00, 0xaa, 0x00, 0x68, 0x0d, 0xb4);
+typedef struct ILayoutStorage ILayoutStorage,*LPLAYOUTSTORAGE;
+
+DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0);
+typedef struct ILockBytes ILockBytes,*LPLOCKBYTES;
+
+DEFINE_OLEGUID(IID_IPersist, 0x0000010cL, 0, 0);
+typedef struct IPersist IPersist,*LPPERSIST;
+
+DEFINE_OLEGUID(IID_IPersistFile, 0x0000010bL, 0, 0);
+typedef struct IPersistFile IPersistFile,*LPPERSISTFILE;
+
+DEFINE_OLEGUID(IID_IPersistStorage, 0x0000010aL, 0, 0);
+typedef struct IPersistStorage IPersistStorage,*LPPERSISTSTORAGE;
+
+DEFINE_OLEGUID(IID_IPersistStream, 0x00000109L, 0, 0);
+typedef struct IPersistStream IPersistStream,*LPPERSISTSTREAM;
+
+DEFINE_GUID (IID_IProgressNotify, 0xa9d758a0L, 0x4617, 0x11cf, 0x95, 0xfc, 0x00, 0xaa, 0x00, 0x68, 0x0d, 0xb4);
+typedef struct IProgressNotify IProgressNotify,*LPPROGRESSNOTIFY;
+
+DEFINE_OLEGUID(IID_IRootStorage, 0x00000012L, 0, 0);
+typedef struct IRootStorage IRootStorage,*LPROOTSTORAGE;
+
+DEFINE_GUID (IID_ISequentialStream, 0x0c733a30L, 0x2a1c, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);
+typedef struct ISequentialStream ISequentialStream,*LPSEQUENTIALSTREAM;
+
+DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0);
+typedef struct IStorage16 IStorage16,*LPSTORAGE16;
+typedef struct IStorage32 IStorage32,*LPSTORAGE32;
+DECL_WINELIB_TYPE(IStorage)
+DECL_WINELIB_TYPE(LPSTORAGE)
+
+DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0);
+typedef struct IStream16 IStream16,*LPSTREAM16;
+typedef struct IStream32 IStream32,*LPSTREAM32;
+DECL_WINELIB_TYPE(IStream)
+DECL_WINELIB_TYPE(LPSTREAM)
+
+
+/*****************************************************************************
+ * STGM enumeration
+ *
+ * See IStorage and IStream
+ */
+#define STGM_DIRECT 0x00000000
+#define STGM_TRANSACTED 0x00010000
+#define STGM_SIMPLE 0x08000000
+#define STGM_READ 0x00000000
+#define STGM_WRITE 0x00000001
+#define STGM_READWRITE 0x00000002
+#define STGM_SHARE_DENY_NONE 0x00000040
+#define STGM_SHARE_DENY_READ 0x00000030
+#define STGM_SHARE_DENY_WRITE 0x00000020
+#define STGM_SHARE_EXCLUSIVE 0x00000010
+#define STGM_PRIORITY 0x00040000
+#define STGM_DELETEONRELEASE 0x04000000
+#define STGM_CREATE 0x00001000
+#define STGM_CONVERT 0x00020000
+#define STGM_FAILIFTHERE 0x00000000
+#define STGM_NOSCRATCH 0x00100000
+#define STGM_NOSNAPSHOT 0x00200000
+
+
+/*****************************************************************************
+ * STATSTG structure
+ */
+struct STATSTG {
+ LPOLESTR16 pwcsName;
+ DWORD type;
+ ULARGE_INTEGER cbSize;
+ FILETIME mtime;
+ FILETIME ctime;
+ FILETIME atime;
+ DWORD grfMode;
+ DWORD grfLocksSupported;
+ CLSID clsid;
+ DWORD grfStateBits;
+ DWORD reserved;
+};
+
+
+/*****************************************************************************
+ * IEnumSTATSTG interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IFillLockBytes interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * ILayoutStorage interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * ILockBytes interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IPersist interface
+ */
+#define ICOM_INTERFACE IPersist
+ICOM_BEGIN(IPersist,IUnknown)
+ ICOM_CMETHOD1(HRESULT,GetClassID, CLSID*,pClassID);
+ICOM_END(IPersist)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IPersist_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IPersist_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IPersist_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IPersist methods ***/
+#define IPersist_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a)
+#endif
+
+
+/*****************************************************************************
+ * IPersistFile interface
+ */
+#define ICOM_INTERFACE IPersistFile
+ICOM_BEGIN(IPersistFile,IPersist)
+ ICOM_CMETHOD (HRESULT,IsDirty);
+ ICOM_METHOD2 (HRESULT,Load, LPCOLESTR32,pszFileName, DWORD,dwMode);
+ ICOM_METHOD2 (HRESULT,Save, LPCOLESTR32,pszFileName, BOOL32,fRemember);
+ ICOM_METHOD1 (HRESULT,SaveCompleted, LPCOLESTR32,pszFileName);
+ ICOM_CMETHOD1(HRESULT,GetCurFile, LPOLESTR32*,ppszFileName);
+ICOM_END(IPersistFile)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IPersistFile_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IPersistFile_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IPersistFile_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IPersist methods ***/
+#define IPersistFile_GetClassID(p,a) ICOM_ICALL1(IPersist,GetClassID,p,a)
+/*** IPersistFile methods ***/
+#define IPersistFile_IsDirty(p) ICOM_CALL(IsDirty,p)
+#define IPersistFile_Load(p,a,b) ICOM_CALL(Load,p,a,b)
+#define IPersistFile_Save(p,a,b) ICOM_CALL(Save,p,a,b)
+#define IPersistFile_SaveCompleted(p,a) ICOM_CALL(SaveCompleted,p,a)
+#define IPersistFile_GetCurFile(p,a) ICOM_CALL(GetCurFile,p,a)
+#endif
+
+
+/*****************************************************************************
+ * IPersistStorage interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IPersistStream interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IProgressNotify interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * IRootStorage interface
+ */
+/* FIXME: not implemented */
+
+
+/*****************************************************************************
+ * ISequentialStream interface
+ */
+#define ICOM_INTERFACE ISequentialStream
+ICOM_BEGIN(ISequentialStream,IUnknown)
+ ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead);
+ ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten);
+ICOM_END(ISequentialStream)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define ISequentialStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define ISequentialStream_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define ISequentialStream_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** ISequentialStream methods ***/
+#define ISequentialStream_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c)
+#define ISequentialStream_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c)
+#endif
+
+
+/*****************************************************************************
+ * IStorage interface
+ */
+#define ICOM_INTERFACE IStorage16
+ICOM_BEGIN(IStorage16,IUnknown)
+ ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm)
+ ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm)
+ ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg)
+ ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg)
+ ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest)
+ ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags)
+ ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags)
+ ICOM_METHOD (HRESULT,Revert)
+ ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum)
+ ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName)
+ ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName)
+ ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime)
+ ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid)
+ ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask)
+ ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag)
+ICOM_END(IStorage16)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IStorage16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStorage16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStorage16_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IStorage16 methods ***/
+#define IStorage16_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e)
+#define IStorage16_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e)
+#define IStorage16_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e)
+#define IStorage16_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f)
+#define IStorage16_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d)
+#define IStorage16_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d)
+#define IStorage16_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStorage16_Revert(p) ICOM_CALL (Revert,p)
+#define IStorage16_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d)
+#define IStorage16_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a)
+#define IStorage16_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b)
+#define IStorage16_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d)
+#define IStorage16_SetClass(p,a) ICOM_CALL1(SetClass,p,a)
+#define IStorage16_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b)
+#define IStorage16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+#endif
+
+
+#define ICOM_INTERFACE IStorage32
+ICOM_BEGIN(IStorage32,IUnknown)
+ ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm);
+ ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm);
+ ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg);
+ ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg);
+ ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest);
+ ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags);
+ ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags);
+ ICOM_METHOD (HRESULT,Revert);
+ ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum);
+ ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName);
+ ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName);
+ ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime);
+ ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid);
+ ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask);
+ ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag);
+ICOM_END(IStorage32)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IStorage32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStorage32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStorage32_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IStorage32 methods ***/
+#define IStorage32_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e)
+#define IStorage32_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e)
+#define IStorage32_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e)
+#define IStorage32_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f)
+#define IStorage32_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d)
+#define IStorage32_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d)
+#define IStorage32_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStorage32_Revert(p) ICOM_CALL (Revert,p)
+#define IStorage32_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d)
+#define IStorage32_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a)
+#define IStorage32_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b)
+#define IStorage32_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d)
+#define IStorage32_SetClass(p,a) ICOM_CALL1(SetClass,p,a)
+#define IStorage32_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b)
+#define IStorage32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+
+#ifndef __WINE__
+/* Duplicated for WINELIB */
+/*** IUnknown methods ***/
+#define IStorage_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStorage_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStorage_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** IStorage methods ***/
+#define IStorage_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e)
+#define IStorage_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e)
+#define IStorage_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e)
+#define IStorage_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f)
+#define IStorage_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d)
+#define IStorage_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d)
+#define IStorage_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStorage_Revert(p) ICOM_CALL (Revert,p)
+#define IStorage_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d)
+#define IStorage_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a)
+#define IStorage_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b)
+#define IStorage_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d)
+#define IStorage_SetClass(p,a) ICOM_CALL1(SetClass,p,a)
+#define IStorage_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b)
+#define IStorage_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+#endif
+#endif
+
+
+/*****************************************************************************
+ * IStream interface
+ */
+#define ICOM_INTERFACE IStream16
+ICOM_BEGIN(IStream16,ISequentialStream)
+ ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition);
+ ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize);
+ ICOM_METHOD4(HRESULT,CopyTo, IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten);
+ ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags);
+ ICOM_METHOD (HRESULT,Revert);
+ ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
+ ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
+ ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag);
+ ICOM_METHOD1(HRESULT,Clone, IStream16**,ppstm);
+ICOM_END(IStream16)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IStream16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStream16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStream16_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** ISequentialStream methods ***/
+#define IStream16_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
+#define IStream16_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+/*** IStream16 methods ***/
+#define IStream16_Seek(p) ICOM_CALL3(Seek,p)
+#define IStream16_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b)
+#define IStream16_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d)
+#define IStream16_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStream16_Revert(p) ICOM_CALL (Revert,p)
+#define IStream16_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c)
+#define IStream16_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
+#define IStream16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+#define IStream16_Clone(p,a) ICOM_CALL1(Clone,p,a)
+#endif
+
+
+#define ICOM_INTERFACE IStream32
+ICOM_BEGIN(IStream32,ISequentialStream)
+ ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition);
+ ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize);
+ ICOM_METHOD4(HRESULT,CopyTo, IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten);
+ ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags);
+ ICOM_METHOD (HRESULT,Revert);
+ ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
+ ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType);
+ ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag);
+ ICOM_METHOD1(HRESULT,Clone, IStream32**,ppstm);
+ICOM_END(IStream32)
+#undef ICOM_INTERFACE
+
+#if !defined(__cplusplus) || defined(CINTERFACE)
+/*** IUnknown methods ***/
+#define IStream32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStream32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStream32_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** ISequentialStream methods ***/
+#define IStream32_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
+#define IStream32_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+/*** IStream32 methods ***/
+#define IStream32_Seek(p) ICOM_CALL3(Seek,p)
+#define IStream32_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b)
+#define IStream32_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d)
+#define IStream32_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStream32_Revert(p) ICOM_CALL (Revert,p)
+#define IStream32_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c)
+#define IStream32_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
+#define IStream32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+#define IStream32_Clone(p,a) ICOM_CALL1(Clone,p,a)
+
+#ifndef __WINE__
+/* Duplicated for WINELIB */
+/*** IUnknown methods ***/
+#define IStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b)
+#define IStream_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p)
+#define IStream_Release(p) ICOM_ICALL (IUnknown,Release,p)
+/*** ISequentialStream methods ***/
+#define IStream_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c)
+#define IStream_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c)
+/*** IStream methods ***/
+#define IStream_Seek(p) ICOM_CALL3(Seek,p)
+#define IStream_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b)
+#define IStream_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d)
+#define IStream_Commit(p,a) ICOM_CALL1(Commit,p,a)
+#define IStream_Revert(p) ICOM_CALL (Revert,p)
+#define IStream_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c)
+#define IStream_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c)
+#define IStream_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b)
+#define IStream_Clone(p,a) ICOM_CALL1(Clone,p,a)
+#endif
+#endif
+
+
+/*****************************************************************************
+ * StgXXX API
+ */
+/* FIXME: many functions are missing */
+HRESULT WINAPI StgCreateDocFile16(LPCOLESTR16 pwcsName,DWORD grfMode,DWORD reserved,IStorage16 **ppstgOpen);
+HRESULT WINAPI StgCreateDocfile32(LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved,IStorage32 **ppstgOpen);
+#define StgCreateDocfile WINELIB_NAME(StgCreateDocfile)
+
+HRESULT WINAPI StgIsStorageFile16(LPCOLESTR16 fn);
+HRESULT WINAPI StgIsStorageFile32(LPCOLESTR32 fn);
+#define StgIsStorageFile WINELIB_NAME(StgIsStorageFile)
+
+HRESULT WINAPI StgOpenStorage16(const OLECHAR16* pwcsName,IStorage16* pstgPriority,DWORD grfMode,SNB16 snbExclude,DWORD reserved,IStorage16**ppstgOpen);
+HRESULT WINAPI StgOpenStorage32(const OLECHAR32* pwcsName,IStorage32* pstgPriority,DWORD grfMode,SNB32 snbExclude,DWORD reserved,IStorage32**ppstgOpen);
+#define StgOpenStorage WINELIB_NAME(StgOpenStorage)
+
+
+
+#endif /* __WINE_WINE_OBJ_STORAGE_H */
diff --git a/include/winerror.h b/include/winerror.h
index da07d75..b7fdcbb 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -145,8 +145,9 @@
/* HRESULT values for OLE, SHELL and other Interface stuff */
/* the codes 4000-40ff are reserved for OLE */
-#define NOERROR 0
-#define S_OK 0
+#define NOERROR 0L
+#define S_OK ((HRESULT)0L)
+#define S_FALSE ((HRESULT)1L)
#define DISP_E_BADVARTYPE 0x80020008L
#define DISP_E_OVERFLOW 0x8002000AL
diff --git a/include/wtypes.h b/include/wtypes.h
new file mode 100644
index 0000000..8d21349
--- /dev/null
+++ b/include/wtypes.h
@@ -0,0 +1,68 @@
+/*
+ * Defines the basic types used by COM interfaces.
+ */
+
+#ifndef __WINE_WTYPES_H
+#define __WINE_WTYPES_H
+
+
+#include "wintypes.h"
+
+
+typedef WORD CLIPFORMAT32, *LPCLIPFORMAT32;
+DECL_WINELIB_TYPE(CLIPFORMAT)
+
+typedef CHAR OLECHAR16;
+typedef WCHAR OLECHAR32;
+DECL_WINELIB_TYPE(OLECHAR)
+
+typedef LPSTR LPOLESTR16;
+typedef LPWSTR LPOLESTR32;
+DECL_WINELIB_TYPE(LPOLESTR)
+
+typedef LPCSTR LPCOLESTR16;
+typedef LPCWSTR LPCOLESTR32;
+DECL_WINELIB_TYPE(LPCOLESTR)
+
+typedef OLECHAR16 *BSTR16;
+typedef OLECHAR32 *BSTR32;
+DECL_WINELIB_TYPE(BSTR)
+
+typedef BSTR16 *LPBSTR16;
+typedef BSTR32 *LPBSTR32;
+DECL_WINELIB_TYPE(LPBSTR)
+
+struct _GUID
+{
+ DWORD Data1;
+ WORD Data2;
+ WORD Data3;
+ BYTE Data4[8];
+};
+
+typedef struct _GUID GUID,*LPGUID,*REFGUID;
+typedef struct _GUID CLSID,*LPCLSID,*REFCLSID;
+typedef struct _GUID IID,*REFIID,*LPIID;
+
+#define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32
+DECLARE_HANDLE(HMETAFILEPICT);
+#undef DECLARE_HANDLE
+
+typedef enum tagCLSCTX
+{
+ CLSCTX_INPROC_SERVER = 0x1,
+ CLSCTX_INPROC_HANDLER = 0x2,
+ CLSCTX_LOCAL_SERVER = 0x4,
+ CLSCTX_INPROC_SERVER16 = 0x8,
+ CLSCTX_REMOTE_SERVER = 0x10,
+ CLSCTX_INPROC_HANDLER16 = 0x20,
+ CLSCTX_INPROC_SERVERX86 = 0x40,
+ CLSCTX_INPROC_HANDLERX86 = 0x80
+} CLSCTX;
+
+#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER)
+#define CLSCTX_ALL (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)
+#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)
+
+
+#endif /* __WINE_WTYPES_H */
diff --git a/include/x11drv.h b/include/x11drv.h
index 01dfb7a..1e89604 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -272,6 +272,8 @@
extern UINT16 X11DRV_KEYBOARD_MapVirtualKey(UINT16 wCode, UINT16 wMapType);
extern INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize);
extern INT16 X11DRV_KEYBOARD_ToAscii(UINT16 virtKey, UINT16 scanCode, LPBYTE lpKeyState, LPVOID lpChar, UINT16 flags);
+extern void KEYBOARD_HandleEvent( WND *pWnd, XKeyEvent *event );
+extern void KEYBOARD_UpdateState ( void );
/* X11 mouse driver */