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