1 // This module just contains things that are needed but aren't in std.c.windows.com.
2 // This code is public domain.
3 
4 module dfl.internal.wincom;
5 
6 private import dfl.internal.winapi;
7 
8 
9 version(WINE)
10 version = _dfl_needcom;
11 
12 version(_dfl_needcom) {
13    private import dfl.internal.dlib;
14 
15    // Grabbed from std.c.windows.com:
16 
17    alias WCHAR OLECHAR;
18    alias OLECHAR *LPOLESTR;
19    alias OLECHAR *LPCOLESTR;
20 
21    enum {
22       rmm = 23,   // OLE 2 version number info
23       rup = 639,
24    }
25 
26    enum : int {
27       S_OK = 0,
28       S_FALSE = 0x00000001,
29       NOERROR = 0,
30       E_NOTIMPL     = cast(int)0x80004001,
31       E_NOINTERFACE = cast(int)0x80004002,
32       E_POINTER     = cast(int)0x80004003,
33       E_ABORT       = cast(int)0x80004004,
34       E_FAIL        = cast(int)0x80004005,
35       E_HANDLE      = cast(int)0x80070006,
36       CLASS_E_NOAGGREGATION = cast(int)0x80040110,
37       E_OUTOFMEMORY = cast(int)0x8007000E,
38       E_INVALIDARG  = cast(int)0x80070057,
39       E_UNEXPECTED  = cast(int)0x8000FFFF,
40    }
41 
42    struct GUID {          // size is 16
43       align(1):
44          DWORD Data1;
45          WORD  Data2;
46          WORD  Data3;
47          BYTE[8]  Data4;
48       }
49 
50       enum {
51       CLSCTX_INPROC_SERVER = 0x1,
52       CLSCTX_INPROC_HANDLER   = 0x2,
53       CLSCTX_LOCAL_SERVER  = 0x4,
54       CLSCTX_INPROC_SERVER16  = 0x8,
55       CLSCTX_REMOTE_SERVER = 0x10,
56       CLSCTX_INPROC_HANDLER16 = 0x20,
57       CLSCTX_INPROC_SERVERX86 = 0x40,
58       CLSCTX_INPROC_HANDLERX86 = 0x80,
59 
60       CLSCTX_INPROC = (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER),
61       CLSCTX_ALL = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER),
62       CLSCTX_SERVER = (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER),
63    }
64 
65    alias GUID IID;
66    alias GUID CLSID;
67 
68    extern (C) {
69       extern IID IID_IUnknown;
70       extern IID IID_IClassFactory;
71       extern IID IID_IMarshal;
72       extern IID IID_IMallocSpy;
73       extern IID IID_IStdMarshalInfo;
74       extern IID IID_IExternalConnection;
75       extern IID IID_IMultiQI;
76       extern IID IID_IEnumUnknown;
77       extern IID IID_IBindCtx;
78       extern IID IID_IEnumMoniker;
79       extern IID IID_IRunnableObject;
80       extern IID IID_IRunningObjectTable;
81       extern IID IID_IPersist;
82       extern IID IID_IPersistStream;
83       extern IID IID_IMoniker;
84       extern IID IID_IROTData;
85       extern IID IID_IEnumString;
86       extern IID IID_ISequentialStream;
87       extern IID IID_IStream;
88       extern IID IID_IEnumSTATSTG;
89       extern IID IID_IStorage;
90       extern IID IID_IPersistFile;
91       extern IID IID_IPersistStorage;
92       extern IID IID_ILockBytes;
93       extern IID IID_IEnumFORMATETC;
94       extern IID IID_IEnumSTATDATA;
95       extern IID IID_IRootStorage;
96       extern IID IID_IAdviseSink;
97       extern IID IID_IAdviseSink2;
98       extern IID IID_IDataObject;
99       extern IID IID_IDataAdviseHolder;
100       extern IID IID_IMessageFilter;
101       extern IID IID_IRpcChannelBuffer;
102       extern IID IID_IRpcProxyBuffer;
103       extern IID IID_IRpcStubBuffer;
104       extern IID IID_IPSFactoryBuffer;
105       extern IID IID_IPropertyStorage;
106       extern IID IID_IPropertySetStorage;
107       extern IID IID_IEnumSTATPROPSTG;
108       extern IID IID_IEnumSTATPROPSETSTG;
109       extern IID IID_IFillLockBytes;
110       extern IID IID_IProgressNotify;
111       extern IID IID_ILayoutStorage;
112       extern IID GUID_NULL;
113       extern IID IID_IRpcChannel;
114       extern IID IID_IRpcStub;
115       extern IID IID_IStubManager;
116       extern IID IID_IRpcProxy;
117       extern IID IID_IProxyManager;
118       extern IID IID_IPSFactory;
119       extern IID IID_IInternalMoniker;
120       extern IID IID_IDfReserved1;
121       extern IID IID_IDfReserved2;
122       extern IID IID_IDfReserved3;
123       extern IID IID_IStub;
124       extern IID IID_IProxy;
125       extern IID IID_IEnumGeneric;
126       extern IID IID_IEnumHolder;
127       extern IID IID_IEnumCallback;
128       extern IID IID_IOleManager;
129       extern IID IID_IOlePresObj;
130       extern IID IID_IDebug;
131       extern IID IID_IDebugStream;
132       extern IID IID_StdOle;
133       extern IID IID_ICreateTypeInfo;
134       extern IID IID_ICreateTypeInfo2;
135       extern IID IID_ICreateTypeLib;
136       extern IID IID_ICreateTypeLib2;
137       extern IID IID_IDispatch;
138       extern IID IID_IEnumVARIANT;
139       extern IID IID_ITypeComp;
140       extern IID IID_ITypeInfo;
141       extern IID IID_ITypeInfo2;
142       extern IID IID_ITypeLib;
143       extern IID IID_ITypeLib2;
144       extern IID IID_ITypeChangeEvents;
145       extern IID IID_IErrorInfo;
146       extern IID IID_ICreateErrorInfo;
147       extern IID IID_ISupportErrorInfo;
148       extern IID IID_IOleAdviseHolder;
149       extern IID IID_IOleCache;
150       extern IID IID_IOleCache2;
151       extern IID IID_IOleCacheControl;
152       extern IID IID_IParseDisplayName;
153       extern IID IID_IOleContainer;
154       extern IID IID_IOleClientSite;
155       extern IID IID_IOleObject;
156       extern IID IID_IOleWindow;
157       extern IID IID_IOleLink;
158       extern IID IID_IOleItemContainer;
159       extern IID IID_IOleInPlaceUIWindow;
160       extern IID IID_IOleInPlaceActiveObject;
161       extern IID IID_IOleInPlaceFrame;
162       extern IID IID_IOleInPlaceObject;
163       extern IID IID_IOleInPlaceSite;
164       extern IID IID_IContinue;
165       extern IID IID_IViewObject;
166       extern IID IID_IViewObject2;
167       extern IID IID_IDropSource;
168       extern IID IID_IDropTarget;
169       extern IID IID_IEnumOLEVERB;
170    }
171 
172    extern (Windows) {
173 
174       export {
175          DWORD   CoBuildVersion();
176 
177          int StringFromGUID2(GUID *rguid, LPOLESTR lpsz, int cbMax);
178 
179          /* init/uninit */
180 
181          HRESULT CoInitialize(LPVOID pvReserved);
182          void    CoUninitialize();
183          DWORD   CoGetCurrentProcess();
184 
185 
186          HRESULT CoCreateInstance(CLSID *rclsid, IUnknown UnkOuter,
187          DWORD dwClsContext, IID* riid, void* ppv);
188 
189          //HINSTANCE CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree);
190          void    CoFreeLibrary(HINSTANCE hInst);
191          void    CoFreeAllLibraries();
192          void    CoFreeUnusedLibraries();
193       }
194 
195       interface IUnknown {
196          HRESULT QueryInterface(IID* riid, void** pvObject);
197          ULONG AddRef();
198          ULONG Release();
199       }
200 
201    interface IClassFactory : IUnknown {
202          HRESULT CreateInstance(IUnknown UnkOuter, IID* riid, void** pvObject);
203          HRESULT LockServer(BOOL fLock);
204       }
205 
206       class ComObject : IUnknown {
207          extern (Windows):
208             HRESULT QueryInterface(IID* riid, void** ppv) {
209             if (*riid == IID_IUnknown) {
210                *ppv = cast(void*)cast(IUnknown)this;
211                AddRef();
212                return S_OK;
213             } else {
214                *ppv = null;
215                return E_NOINTERFACE;
216             }
217          }
218 
219          ULONG AddRef() {
220             return InterlockedIncrement(&count);
221          }
222 
223          ULONG Release() {
224             LONG lRef = InterlockedDecrement(&count);
225             if (lRef == 0) {
226                // free object
227 
228                // If we delete this object, then the postinvariant called upon
229                // return from Release() will fail.
230                // Just let the GC reap it.
231                //delete this;
232 
233                return 0;
234             }
235             return cast(ULONG)lRef;
236          }
237 
238          LONG count = 0;     // object reference count
239       }
240 
241    }
242 }
243 else {
244    public import std.c.windows.com;
245 }
246 
247 
248 extern(C) {
249    extern IID IID_IPicture;
250 
251    version(REDEFINE_UUIDS) {
252       // These are needed because uuid.lib is broken in DMC 8.46.
253       IID _IID_IUnknown= { 0, 0, 0, [ 192, 0, 0, 0, 0, 0, 0, 70] };
254       IID _IID_IDataObject = { 270, 0, 0, [192, 0, 0, 0, 0, 0, 0, 70 ] };
255       IID _IID_IPicture = { 2079852928, 48946, 4122, [139, 187, 0, 170, 0, 48, 12, 171] };
256       IID _IID_ISequentialStream = { 208878128, 10780, 4558, [ 173, 229, 0, 170, 0, 68, 119, 61 ] };
257       IID _IID_IStream = { 12, 0, 0, [ 192, 0, 0, 0, 0, 0, 0, 70 ] };
258       IID _IID_IDropTarget = { 290, 0, 0, [ 192, 0, 0, 0, 0, 0, 0, 70 ] };
259       IID _IID_IDropSource = { 289, 0, 0, [ 192, 0, 0, 0, 0, 0, 0, 70 ] };
260       IID _IID_IEnumFORMATETC = { 259, 0, 0, [ 192, 0, 0, 0, 0, 0, 0, 70 ] };
261    }
262    else {
263       alias IID_IUnknown _IID_IUnknown;
264       alias IID_IDataObject _IID_IDataObject;
265       alias IID_IPicture _IID_IPicture;
266       alias IID_ISequentialStream _IID_ISequentialStream;
267       alias IID_IStream _IID_IStream;
268       alias IID_IDropTarget _IID_IDropTarget;
269       alias IID_IDropSource _IID_IDropSource;
270       alias IID_IEnumFORMATETC _IID_IEnumFORMATETC;
271    }
272 }
273 
274 
275 extern(Windows):
276 
277 interface ISequentialStream: IUnknown {
278    extern(Windows):
279       HRESULT Read(void* pv, ULONG cb, ULONG* pcbRead);
280       HRESULT Write(void* pv, ULONG cb, ULONG* pcbWritten);
281    }
282 
283 
284    /// STREAM_SEEK
285    enum: DWORD {
286    STREAM_SEEK_SET = 0,
287    STREAM_SEEK_CUR = 1,
288    STREAM_SEEK_END = 2,
289 }
290 alias DWORD STREAM_SEEK;
291 
292 
293 // TODO: implement the enum`s used here.
294 struct STATSTG {
295    LPWSTR pwcsName;
296    DWORD type;
297    ULARGE_INTEGER cbSize;
298    FILETIME mtime;
299    FILETIME ctime;
300    FILETIME atime;
301    DWORD grfMode;
302    DWORD grfLocksSupported;
303    CLSID clsid;
304    DWORD grfStateBits;
305    DWORD reserved;
306 }
307 
308 
309 interface IStream: ISequentialStream {
310    extern(Windows):
311       HRESULT Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition);
312       HRESULT SetSize(ULARGE_INTEGER libNewSize);
313       HRESULT CopyTo(IStream pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten);
314       HRESULT Commit(DWORD grfCommitFlags);
315       HRESULT Revert();
316       HRESULT LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
317       HRESULT UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
318       HRESULT Stat(STATSTG* pstatstg, DWORD grfStatFlag);
319       HRESULT Clone(IStream* ppstm);
320    }
321    alias IStream* LPSTREAM;
322 
323 
324    alias UINT OLE_HANDLE;
325 
326    alias LONG OLE_XPOS_HIMETRIC;
327 
328    alias LONG OLE_YPOS_HIMETRIC;
329 
330    alias LONG OLE_XSIZE_HIMETRIC;
331 
332    alias LONG OLE_YSIZE_HIMETRIC;
333 
334 
335 interface IPicture: IUnknown {
336    extern(Windows):
337       HRESULT get_Handle(OLE_HANDLE* phandle);
338       HRESULT get_hPal(OLE_HANDLE* phpal);
339       HRESULT get_Type(short* ptype);
340       HRESULT get_Width(OLE_XSIZE_HIMETRIC* pwidth);
341       HRESULT get_Height(OLE_YSIZE_HIMETRIC* pheight);
342       HRESULT Render(HDC hdc, int x, int y, int cx, int cy, OLE_XPOS_HIMETRIC xSrc, OLE_YPOS_HIMETRIC ySrc, OLE_XSIZE_HIMETRIC cxSrc, OLE_YSIZE_HIMETRIC cySrc, LPCRECT prcWBounds);
343       HRESULT set_hPal(OLE_HANDLE hpal);
344       HRESULT get_CurDC(HDC* phdcOut);
345       HRESULT SelectPicture(HDC hdcIn, HDC* phdcOut, OLE_HANDLE* phbmpOut);
346       HRESULT get_KeepOriginalFormat(BOOL* pfkeep);
347       HRESULT put_KeepOriginalFormat(BOOL keep);
348       HRESULT PictureChanged();
349       HRESULT SaveAsFile(IStream pstream, BOOL fSaveMemCopy, LONG* pcbSize);
350       HRESULT get_Attributes(DWORD* pdwAttr);
351    }
352 
353    struct DVTARGETDEVICE {
354    DWORD tdSize;
355    WORD tdDriverNameOffset;
356    WORD tdDeviceNameOffset;
357    WORD tdPortNameOffset;
358    WORD tdExtDevmodeOffset;
359    BYTE[1] tdData;
360 }
361 
362 
363 struct FORMATETC {
364    CLIPFORMAT cfFormat;
365    DVTARGETDEVICE* ptd;
366    DWORD dwAspect;
367    LONG lindex;
368    DWORD tymed;
369 }
370 alias FORMATETC* LPFORMATETC;
371 
372 
373 struct STATDATA {
374    FORMATETC formatetc;
375    DWORD grfAdvf;
376    IAdviseSink pAdvSink;
377    DWORD dwConnection;
378 }
379 
380 
381 struct STGMEDIUM {
382    DWORD tymed;
383    union { //u
384       HBITMAP hBitmap;
385       //HMETAFILEPICT hMetaFilePict;
386       HENHMETAFILE hEnhMetaFile;
387       HGLOBAL hGlobal;
388       LPOLESTR lpszFileName;
389       IStream pstm;
390       //IStorage pstg;
391    }
392    IUnknown pUnkForRelease;
393 }
394 alias STGMEDIUM* LPSTGMEDIUM;
395 
396 
397 interface IDataObject: IUnknown {
398    extern(Windows):
399       HRESULT GetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium);
400       HRESULT GetDataHere(FORMATETC* pFormatetc, STGMEDIUM* pmedium);
401       HRESULT QueryGetData(FORMATETC* pFormatetc);
402       HRESULT GetCanonicalFormatEtc(FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut);
403       HRESULT SetData(FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOOL fRelease);
404       HRESULT EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC* ppenumFormatetc);
405       HRESULT DAdvise(FORMATETC* pFormatetc, DWORD advf, IAdviseSink pAdvSink, DWORD* pdwConnection);
406       HRESULT DUnadvise(DWORD dwConnection);
407       HRESULT EnumDAdvise(IEnumSTATDATA* ppenumAdvise);
408    }
409 
410 
411 interface IDropSource: IUnknown {
412    extern(Windows):
413       HRESULT QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState);
414       HRESULT GiveFeedback(DWORD dwEffect);
415    }
416 
417 
418 interface IDropTarget: IUnknown {
419    extern(Windows):
420       HRESULT DragEnter(IDataObject pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
421       HRESULT DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
422       HRESULT DragLeave();
423       HRESULT Drop(IDataObject pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect);
424    }
425 
426 
427 interface IEnumFORMATETC: IUnknown {
428    extern(Windows):
429       HRESULT Next(ULONG celt, FORMATETC* rgelt, ULONG* pceltFetched);
430       HRESULT Skip(ULONG celt);
431       HRESULT Reset();
432       HRESULT Clone(IEnumFORMATETC* ppenum);
433    }
434 
435 
436 interface IEnumSTATDATA: IUnknown {
437    extern(Windows):
438       HRESULT Next(ULONG celt, STATDATA* rgelt, ULONG* pceltFetched);
439       HRESULT Skip(ULONG celt);
440       HRESULT Reset();
441       HRESULT Clone(IEnumSTATDATA* ppenum);
442    }
443 
444 
445 interface IAdviseSink: IUnknown {
446    // TODO: finish.
447 }
448 
449 
450 interface IMalloc: IUnknown {
451    extern(Windows):
452       void* Alloc(ULONG cb);
453       void* Realloc(void *pv, ULONG cb);
454       void Free(void* pv);
455       ULONG GetSize(void* pv);
456       int DidAlloc(void* pv);
457       void HeapMinimize();
458    }
459    // Since an interface is a pointer..
460    alias IMalloc PMALLOC;
461    alias IMalloc LPMALLOC;
462 
463 
464    LONG MAP_LOGHIM_TO_PIX(LONG x, LONG logpixels) {
465    return MulDiv(logpixels, x, 2540);
466 }
467 
468 
469 enum: DWORD {
470    DVASPECT_CONTENT = 1,
471    DVASPECT_THUMBNAIL = 2,
472    DVASPECT_ICON = 4,
473    DVASPECT_DOCPRINT = 8,
474 }
475 alias DWORD DVASPECT;
476 
477 
478 enum: DWORD {
479    TYMED_HGLOBAL = 1,
480    TYMED_FILE = 2,
481    TYMED_ISTREAM = 4,
482    TYMED_ISTORAGE = 8,
483    TYMED_GDI = 16,
484    TYMED_MFPICT = 32,
485    TYMED_ENHMF = 64,
486    TYMED_NULL = 0
487 }
488 alias DWORD TYMED;
489 
490 
491 enum {
492    DATADIR_GET = 1,
493 }
494 
495 
496 enum: HRESULT {
497    DRAGDROP_S_DROP = 0x00040100,
498    DRAGDROP_S_CANCEL = 0x00040101,
499    DRAGDROP_S_USEDEFAULTCURSORS = 0x00040102,
500    V_E_LINDEX = cast(HRESULT)0x80040068,
501    STG_E_MEDIUMFULL = cast(HRESULT)0x80030070,
502    STG_E_INVALIDFUNCTION = cast(HRESULT)0x80030001,
503    DV_E_TYMED = cast(HRESULT)0x80040069,
504    DV_E_DVASPECT = cast(HRESULT)0x8004006B,
505    DV_E_FORMATETC = cast(HRESULT)0x80040064,
506    DV_E_LINDEX = cast(HRESULT)0x80040068,
507    DRAGDROP_E_ALREADYREGISTERED = cast(HRESULT)0x80040101,
508 }
509 
510 
511 alias HRESULT WINOLEAPI;
512 
513 
514 WINOLEAPI OleInitialize(LPVOID pvReserved);
515 WINOLEAPI DoDragDrop(IDataObject pDataObject, IDropSource pDropSource, DWORD dwOKEffect, DWORD* pdwEffect);
516 WINOLEAPI RegisterDragDrop(HWND hwnd, IDropTarget pDropTarget);
517 WINOLEAPI RevokeDragDrop(HWND hwnd);
518 WINOLEAPI OleGetClipboard(IDataObject* ppDataObj);
519 WINOLEAPI OleSetClipboard(IDataObject pDataObj);
520 WINOLEAPI OleFlushClipboard();
521 WINOLEAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM ppstm);
522 WINOLEAPI OleLoadPicture(IStream pStream, LONG lSize, BOOL fRunmode, IID* riid, void** ppv);
523