- Timestamp:
- Sep 17, 2000, 12:31:07 PM (25 years ago)
- Location:
- trunk/src/ole32
- Files:
-
- 1 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ole32/datacache.cpp
r3167 r4274 1 /* $Id: datacache.cpp,v 1. 2 2000-03-19 15:33:05davidr Exp $ */1 /* $Id: datacache.cpp,v 1.3 2000-09-17 10:31:02 davidr Exp $ */ 2 2 /* 3 3 * OLE 2 Data cache … … 64 64 DWORD unknown6; 65 65 DWORD unknown7; 66 DWORD objectExtentX;67 DWORD objectExtentY;68 DWORD unknown8;66 DWORD dwObjectExtentX; 67 DWORD dwObjectExtentY; 68 DWORD dwSize; 69 69 } PresentationDataHeader; 70 70 … … 1006 1006 } 1007 1007 1008 /************************************************************************ 1009 * DataCache_GetData 1010 * 1011 * Get Data from a source dataobject using format pformatetcIn->cfFormat 1012 * See Windows documentation for more details on GetData. 1013 * TODO: Currently only CF_METAFILEPICT is implemented 1014 */ 1008 1015 static HRESULT WINAPI DataCache_GetData( 1009 1016 IDataObject* iface, … … 1011 1018 STGMEDIUM* pmedium) 1012 1019 { 1013 FIXME("stub\n"); 1020 HRESULT hr = 0; 1021 HRESULT hrRet = E_UNEXPECTED; 1022 IPersistStorage *pPersistStorage = 0; 1023 IStorage *pStorage = 0; 1024 IStream *pStream = 0; 1025 OLECHAR name[]={ 2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; 1026 HGLOBAL hGlobalMF = 0; 1027 void *mfBits = 0; 1028 PresentationDataHeader pdh; 1029 METAFILEPICT *mfPict; 1030 HMETAFILE hMetaFile = 0; 1031 1032 if (pformatetcIn->cfFormat == CF_METAFILEPICT) 1033 { 1034 /* Get the Persist Storage */ 1035 1036 hr = IDataObject_QueryInterface(iface, &IID_IPersistStorage, (void**)&pPersistStorage); 1037 1038 if (hr != S_OK) 1039 goto cleanup; 1040 1041 /* Create a doc file to copy the doc to a storage */ 1042 1043 hr = StgCreateDocfile(NULL, STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &pStorage); 1044 1045 if (hr != S_OK) 1046 goto cleanup; 1047 1048 /* Save it to storage */ 1049 1050 hr = OleSave(pPersistStorage, pStorage, FALSE); 1051 1052 if (hr != S_OK) 1053 goto cleanup; 1054 1055 /* Open the Presentation data srteam */ 1056 1057 hr = IStorage_OpenStream(pStorage, name, 0, STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &pStream); 1058 1059 if (hr != S_OK) 1060 goto cleanup; 1061 1062 /* Read the presentation header */ 1063 1064 hr = IStream_Read(pStream, &pdh, sizeof(PresentationDataHeader), NULL); 1065 1066 if (hr != S_OK) 1067 goto cleanup; 1068 1069 mfBits = HeapAlloc(GetProcessHeap(), 0, pdh.dwSize); 1070 1071 /* Read the Metafile bits */ 1072 1073 hr = IStream_Read(pStream, mfBits, pdh.dwSize, NULL); 1074 1075 if (hr != S_OK) 1076 goto cleanup; 1077 1078 /* Create the metafile and place it in the STGMEDIUM structure */ 1079 1080 hMetaFile = SetMetaFileBitsEx(pdh.dwSize, (BYTE *)mfBits); 1081 1082 hGlobalMF = GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE, sizeof(METAFILEPICT)); 1083 mfPict = (METAFILEPICT *)GlobalLock(hGlobalMF); 1084 mfPict->hMF = hMetaFile; 1085 1086 GlobalUnlock(hGlobalMF); 1087 1088 pmedium->u.hGlobal = hGlobalMF; 1089 pmedium->tymed = TYMED_MFPICT; 1090 hrRet = S_OK; 1091 1092 cleanup: 1093 1094 if (mfBits) 1095 HeapFree(GetProcessHeap(), 0, mfBits); 1096 1097 if (pStream) 1098 IStream_Release(pStream); 1099 1100 if (pStorage) 1101 IStorage_Release(pStorage); 1102 1103 if (pPersistStorage) 1104 IPersistStorage_Release(pPersistStorage); 1105 1106 return hrRet; 1107 } 1108 1109 /* TODO: Other formats are not implemented */ 1110 1014 1111 return E_NOTIMPL; 1015 1112 } … … 1485 1582 1486 1583 SetWindowExtEx(hdcDraw, 1487 presData. objectExtentX,1488 presData. objectExtentY,1584 presData.dwObjectExtentX, 1585 presData.dwObjectExtentY, 1489 1586 &oldWindowExt); 1490 1587 … … 1705 1802 if (SUCCEEDED(hres)) 1706 1803 { 1707 lpsizel->cx = presData. objectExtentX;1708 lpsizel->cy = presData. objectExtentY;1804 lpsizel->cx = presData.dwObjectExtentX; 1805 lpsizel->cy = presData.dwObjectExtentY; 1709 1806 } 1710 1807 -
trunk/src/ole32/defaulthandler.cpp
r1033 r4274 1 /* $Id: defaulthandler.cpp,v 1. 1 1999-09-24 21:49:43 davidr Exp $ */1 /* $Id: defaulthandler.cpp,v 1.2 2000-09-17 10:31:03 davidr Exp $ */ 2 2 /* 3 3 * OLE 2 default object handler … … 101 101 * Name of the container and object contained 102 102 */ 103 BSTR containerApp;104 BSTR containerObj;103 LPWSTR containerApp; 104 LPWSTR containerObj; 105 105 106 106 }; … … 830 830 * Be sure to cleanup before re-assinging the strings. 831 831 */ 832 if (This->containerApp !=NULL)833 { 834 SysFreeString(This->containerApp);832 if (This->containerApp != NULL) 833 { 834 HeapFree( GetProcessHeap(), 0, This->containerApp ); 835 835 This->containerApp = NULL; 836 836 } 837 837 838 if (This->containerObj !=NULL)839 { 840 SysFreeString(This->containerObj);838 if (This->containerObj != NULL) 839 { 840 HeapFree( GetProcessHeap(), 0, This->containerObj ); 841 841 This->containerObj = NULL; 842 842 } … … 846 846 */ 847 847 if (szContainerApp != NULL) 848 This->containerApp = SysAllocString(szContainerApp); 848 { 849 if ((This->containerApp = (LPWSTR)HeapAlloc( GetProcessHeap(), 0, 850 (lstrlenW(szContainerApp) + 1) * sizeof(WCHAR) )) != NULL) 851 lstrcpyW( This->containerApp, szContainerApp ); 852 } 849 853 850 854 if (szContainerObj != NULL) 851 This->containerObj = SysAllocString(szContainerObj); 852 855 { 856 if ((This->containerObj = (LPWSTR)HeapAlloc( GetProcessHeap(), 0, 857 (lstrlenW(szContainerObj) + 1) * sizeof(WCHAR) )) != NULL) 858 lstrcpyW( This->containerObj, szContainerObj ); 859 } 860 853 861 return S_OK; 854 862 } … … 1307 1315 } 1308 1316 1317 /************************************************************************ 1318 * DefaultHandler_GetData 1319 * 1320 * Get Data from a source dataobject using format pformatetcIn->cfFormat 1321 * See Windows documentation for more details on GetData. 1322 * Default handler's implementation of this method delegates to the cache. 1323 */ 1309 1324 static HRESULT WINAPI DefaultHandler_GetData( 1310 IDataObject* iface, 1311 LPFORMATETC pformatetcIn, 1312 STGMEDIUM* pmedium) 1313 { 1314 FIXME(": Stub\n"); 1315 return E_NOTIMPL; 1325 IDataObject* iface, 1326 LPFORMATETC pformatetcIn, 1327 STGMEDIUM* pmedium) 1328 { 1329 IDataObject* cacheDataObject = NULL; 1330 HRESULT hres; 1331 1332 _ICOM_THIS_From_IDataObject(DefaultHandler, iface); 1333 1334 TRACE("(%p, %p, %p)\n", iface, pformatetcIn, pmedium); 1335 1336 hres = IUnknown_QueryInterface(This->dataCache, 1337 &IID_IDataObject, 1338 (void**)&cacheDataObject); 1339 1340 if (FAILED(hres)) 1341 return E_UNEXPECTED; 1342 1343 hres = IDataObject_GetData(cacheDataObject, 1344 pformatetcIn, 1345 pmedium); 1346 1347 IDataObject_Release(cacheDataObject); 1348 1349 return hres; 1316 1350 } 1317 1351 -
trunk/src/ole32/filemoniker.cpp
r3167 r4274 1 /* $Id: filemoniker.cpp,v 1. 2 2000-03-19 15:33:06davidr Exp $ */1 /* $Id: filemoniker.cpp,v 1.3 2000-09-17 10:31:03 davidr Exp $ */ 2 2 /* 3 3 * FileMonikers functions. … … 17 17 #include "winnls.h" 18 18 19 DEFAULT_DEBUG_CHANNEL( ole)19 DEFAULT_DEBUG_CHANNEL(moniker) 20 20 21 21 /********************************************************************************/ … … 63 63 /* IROTData prototype function */ 64 64 static HRESULT WINAPI FileMonikerROTDataImpl_GetComparaisonData(IROTData* iface,BYTE* pbData,ULONG cbMax,ULONG* pcbData); 65 66 65 67 66 /********************************************************************************/ … … 347 346 DWORD doubleLenHex; 348 347 int i=0; 349 WCHAR temp = 0;350 348 351 349 … … 421 419 * FileMoniker_GetSizeMax 422 420 ******************************************************************************/ 423 HRESULT WINAPI FileMonikerImpl_GetSizeMax(IMoniker* iface, 424 ULARGE_INTEGER* pcbSize)/* Pointer to size of stream needed to save object */ 421 HRESULT WINAPI FileMonikerImpl_GetSizeMax(IMoniker* iface,ULARGE_INTEGER* pcbSize) 425 422 { 426 423 ICOM_THIS(FileMonikerImpl,iface); 427 DWORD len=lstrlenW(This->filePathName);428 DWORD sizeMAx;429 430 TRACE("(%p,%p)\n",iface,pcbSize);431 424 432 425 if (pcbSize==NULL) 433 426 return E_POINTER; 434 427 435 /* for more details see FileMonikerImpl_Save coments */ 436 437 sizeMAx = sizeof(WORD) + /* first WORD is 0 */ 438 sizeof(DWORD)+ /* length of filePath including "\0" in the end of the string */ 439 (len+1)+ /* filePath string */ 440 sizeof(DWORD)+ /* constant : 0xDEADFFFF */ 441 10*sizeof(WORD)+ /* 10 zero WORD */ 442 sizeof(DWORD); /* size of the unicode filePath: "\0" not included */ 443 444 if(!This->bIsLongFileName) 445 { 446 447 sizeMAx += sizeof(DWORD)+ /* size of the unicode filePath: "\0" not included */ 448 sizeof(WORD)+ /* constant : 0x3 */ 449 len*sizeof(WCHAR); /* unicde filePath string */ 450 } 451 452 pcbSize->LowPart=sizeMAx; 453 pcbSize->HighPart=0; 454 428 /* GetSizeMax = SizeToSave + 2*len + 22 */ 429 FileMonikerImpl_GetSizeToSave(iface,pcbSize); 430 pcbSize->LowPart += 2 * lstrlenW(This->filePathName) + 22; 431 pcbSize->HighPart = 0; 432 433 TRACE("(iface:%p pcbSize:(LowPart:%ld - HighPart:0))\n",iface,pcbSize->LowPart); 455 434 return S_OK; 456 435 } 436 437 HRESULT FileMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize) 438 { 439 ICOM_THIS(FileMonikerImpl,iface); 440 DWORD len = lstrlenW(This->filePathName); 441 442 if (pcbSize==NULL) 443 return E_POINTER; 444 445 pcbSize->LowPart = sizeof(WORD) + /* first WORD is 0 */ 446 sizeof(DWORD) + /* length of filePath including "\0" in the end of the string */ 447 len + 1 + /* filePath string */ 448 sizeof(DWORD) + /* constant : 0xDEADFFFF */ 449 10 * sizeof(WORD) + /* 10 zero WORD */ 450 sizeof(DWORD) + /* size of the unicode filePath: "\0" not included */ 451 ((!This->bIsLongFileName) ? 452 sizeof(DWORD) + /* size of the unicode filePath: "\0" not included */ 453 sizeof(WORD) + /* constant : 0x3 */ 454 len * sizeof(WCHAR) : 0); /* unicde filePath string */ 455 pcbSize->HighPart = 0; 456 457 return S_OK; 458 } 459 457 460 458 461 void WINAPI FileMonikerImpl_CheckFileFormat(FileMonikerImpl* This, LPCOLESTR lpszPathName) … … 473 476 return; 474 477 } 478 475 479 len = lstrlenW(lpszPathName); 476 if(len == 0)477 {478 return;479 }480 481 480 if( len >= 2) 482 481 { -
trunk/src/ole32/filemoniker.h
r3167 r4274 1 /* $Id: filemoniker.h,v 1. 2 2000-03-19 15:35:14davidr Exp $ */1 /* $Id: filemoniker.h,v 1.3 2000-09-17 10:29:43 davidr Exp $ */ 2 2 /* 3 3 * … … 33 33 int WINAPI FileMonikerImpl_DecomposePath(LPOLESTR str, LPOLESTR** tabStr); 34 34 void WINAPI FileMonikerImpl_CheckFileFormat(FileMonikerImpl* iface, LPCOLESTR lpszPathName); 35 HRESULT FileMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize); 35 36 36 37 #endif /* FILEMONIKER_INCLUDED */ -
trunk/src/ole32/itemmoniker.cpp
r1033 r4274 1 /* $Id: itemmoniker.cpp,v 1. 1 1999-09-24 21:49:43davidr Exp $ */1 /* $Id: itemmoniker.cpp,v 1.2 2000-09-17 10:31:04 davidr Exp $ */ 2 2 /* 3 3 * ItemMonikers implementation … … 15 15 #include <assert.h> 16 16 17 DEFAULT_DEBUG_CHANNEL( ole)17 DEFAULT_DEBUG_CHANNEL(moniker) 18 18 19 19 /* ItemMoniker data structure */ … … 72 72 HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* iface, LPCOLESTR lpszDelim,LPCOLESTR lpszPathName); 73 73 HRESULT WINAPI ItemMonikerImpl_Destroy(ItemMonikerImpl* iface); 74 HRESULT ItemMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize); 74 75 75 76 /********************************************************************************/ … … 245 246 246 247 /* read item delimiter string */ 247 itemDelimiterA= (CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 248 res=IStream_Read(pStm,itemDelimiterA,delimiterLength,&bread); 249 if (bread != delimiterLength) 248 res=IStream_Read(pStm,&delimiterLength,sizeof(DWORD),&bread); 249 if (bread != sizeof(DWORD)) 250 250 return E_FAIL; 251 251 252 This->itemDelimiter= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemDelimiter,delimiterLength*sizeof(WCHAR)); 253 if (!This->itemDelimiter) 254 return E_OUTOFMEMORY; 255 256 lstrcpyAtoW(This->itemDelimiter,itemDelimiterA); 252 /* read item delimiter string */ 253 if (delimiterLength){ 254 itemDelimiterA=(CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 255 res=IStream_Read(pStm,itemDelimiterA,delimiterLength,&bread); 256 if (bread != delimiterLength) 257 return E_FAIL; 258 This->itemDelimiter=(WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemDelimiter,delimiterLength*sizeof(WCHAR)); 259 if (!This->itemDelimiter) 260 return E_OUTOFMEMORY; 261 262 lstrcpyAtoW(This->itemDelimiter,itemDelimiterA); 263 } 264 257 265 258 266 /* read item name string length + 1*/ … … 262 270 263 271 /* read item name string */ 264 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 265 res=IStream_Read(pStm,itemNameA,nameLength,&bread); 266 if (bread != nameLength) 267 return E_FAIL; 268 269 This->itemName= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemName,nameLength*sizeof(WCHAR)); 270 if (!This->itemName) 271 return E_OUTOFMEMORY; 272 273 lstrcpyAtoW(This->itemName,itemNameA); 272 if (nameLength) { 273 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 274 res=IStream_Read(pStm,itemNameA,nameLength,&bread); 275 if (bread != nameLength) 276 return E_FAIL; 277 278 This->itemName= (WCHAR *)HeapReAlloc(GetProcessHeap(),0,This->itemName,nameLength*sizeof(WCHAR)); 279 if (!This->itemName) 280 return E_OUTOFMEMORY; 281 282 lstrcpyAtoW(This->itemName,itemNameA); 283 } 274 284 275 285 return res; … … 285 295 ICOM_THIS(ItemMonikerImpl,iface); 286 296 HRESULT res; 287 DWORD delimiterLength =lstrlenW(This->itemDelimiter)+1;288 DWORD nameLength=lstrlenW(This->itemName)+1;289 CHAR *itemNameA ,*itemDelimiterA;297 DWORD delimiterLength = 0; 298 DWORD itemLength = 0; 299 CHAR *itemNameA = 0, *itemDelimiterA = 0; 290 300 291 301 /* data writen by this function are : 1) DWORD : size of item delimiter string ('\0' included ) */ … … 294 304 /* 4) String (type A): item name string ('\0' included) */ 295 305 296 itemNameA= (CHAR *)HeapAlloc(GetProcessHeap(),0,nameLength); 297 itemDelimiterA= (CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 298 lstrcpyWtoA(itemNameA,This->itemName); 299 lstrcpyWtoA(itemDelimiterA,This->itemDelimiter); 306 if (This->itemDelimiter){ 307 delimiterLength = lstrlenW(This->itemDelimiter) + 1; 308 itemDelimiterA=(CHAR *)HeapAlloc(GetProcessHeap(),0,delimiterLength); 309 lstrcpyWtoA(itemDelimiterA,This->itemDelimiter); 310 } 311 312 if (This->itemName){ 313 itemLength = lstrlenW(This->itemName) + 1; 314 itemNameA=(CHAR *)HeapAlloc(GetProcessHeap(),0,itemLength); 315 lstrcpyWtoA(itemNameA,This->itemName); 316 } 300 317 301 318 res=IStream_Write(pStm,&delimiterLength,sizeof(DWORD),NULL); 302 319 res=IStream_Write(pStm,itemDelimiterA,delimiterLength * sizeof(CHAR),NULL); 303 res=IStream_Write(pStm,&nameLength,sizeof(DWORD),NULL); 304 res=IStream_Write(pStm,itemNameA,nameLength * sizeof(CHAR),NULL); 320 res=IStream_Write(pStm,&itemLength,sizeof(DWORD),NULL); 321 res=IStream_Write(pStm,itemNameA,itemLength * sizeof(CHAR),NULL); 322 323 if (itemNameA) 324 HeapFree(GetProcessHeap(),0,itemNameA); 325 if (itemDelimiterA) 326 HeapFree(GetProcessHeap(),0,itemDelimiterA); 305 327 306 328 return res; … … 313 335 ULARGE_INTEGER* pcbSize)/* Pointer to size of stream needed to save object */ 314 336 { 315 ICOM_THIS(ItemMonikerImpl,iface); 316 DWORD delimiterLength=lstrlenW(This->itemDelimiter)+1; 317 DWORD nameLength=lstrlenW(This->itemName)+1; 318 319 TRACE("(%p,%p)\n",iface,pcbSize); 320 321 if (pcbSize!=NULL) 322 return E_POINTER; 323 324 /* for more details see ItemMonikerImpl_Save coments */ 325 326 pcbSize->LowPart = sizeof(DWORD) + /* DWORD witch contains delimiter length */ 327 delimiterLength + /* item delimiter string */ 328 sizeof(DWORD) + /* DWORD witch contains item name length */ 329 nameLength + /* item name string */ 330 34; /* this constant was added ! because when I tested this function it usually */ 331 /* returns 34 bytes more than the number of bytes used by IMoniker::Save function */ 332 pcbSize->HighPart=0; 333 337 if (pcbSize==NULL) 338 return E_POINTER; 339 340 /* SizeMax = 4 * SizeToSave - 6 */ 341 ItemMonikerImpl_GetSizeToSave(iface,pcbSize); 342 pcbSize->LowPart = 4 * pcbSize->LowPart - 6; 343 pcbSize->HighPart = 0; 344 345 TRACE("(iface:%p pcbSize:(LowPart:%ld - HighPart:0))\n",iface,pcbSize->LowPart); 334 346 return S_OK; 335 347 } 348 349 HRESULT ItemMonikerImpl_GetSizeToSave(IMoniker* iface,ULARGE_INTEGER* pcbSize) 350 { 351 ICOM_THIS(ItemMonikerImpl,iface); 352 DWORD delimiterLength = This->itemDelimiter ? lstrlenW(This->itemDelimiter) + 1 : 0; 353 DWORD itemLength = This->itemName ? lstrlenW(This->itemName) + 1 : 0; 354 355 if (pcbSize==NULL) 356 return E_POINTER; 357 358 pcbSize->LowPart = sizeof(DWORD) + /* DWORD witch contains delimiter length */ 359 delimiterLength + /* item delimiter string */ 360 sizeof(DWORD) + /* DWORD witch contains item name length */ 361 itemLength; /* item string */ 362 pcbSize->HighPart = 0; 363 364 return S_OK; 365 } 366 336 367 337 368 /****************************************************************************** … … 340 371 HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* This, LPCOLESTR lpszDelim,LPCOLESTR lpszItem) 341 372 { 342 343 int sizeStr1=lstrlenW(lpszItem); 344 int sizeStr2=lstrlenW(lpszDelim); 345 346 TRACE("(%p,%p)\n",This,lpszItem); 347 348 /* Initialize the virtual fgunction table. */ 373 /* Initialize the virtual function table. */ 349 374 This->lpvtbl1 = &VT_ItemMonikerImpl; 350 375 This->lpvtbl2 = &VT_ROTDataImpl; 351 376 This->ref = 0; 352 377 353 This->itemName= (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(sizeStr1+1)); 354 This->itemDelimiter= (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(sizeStr2+1)); 355 356 if ((This->itemName==NULL)||(This->itemDelimiter==NULL)) 357 return E_OUTOFMEMORY; 358 359 lstrcpyW(This->itemName,lpszItem); 360 lstrcpyW(This->itemDelimiter,lpszDelim); 361 378 This->itemName = 0; 379 This->itemDelimiter = 0; 380 381 if (lpszItem){ 382 This->itemName = (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(lpszItem)+1)); 383 if (!This->itemName) 384 return E_OUTOFMEMORY; 385 lstrcpyW(This->itemName,lpszItem); 386 } 387 if (lpszDelim){ 388 This->itemDelimiter = (WCHAR *)HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(lstrlenW(lpszDelim)+1)); 389 if (!This->itemDelimiter) 390 return E_OUTOFMEMORY; 391 lstrcpyW(This->itemDelimiter,lpszDelim); 392 } 362 393 return S_OK; 394 363 395 } 364 396 … … 801 833 return E_OUTOFMEMORY; 802 834 803 lstrcpyW(*ppszDisplayName,This->itemDelimiter); 804 lstrcatW(*ppszDisplayName,This->itemName); 835 if (This->itemDelimiter) lstrcatW(*ppszDisplayName,This->itemDelimiter); 836 if (This->itemName) lstrcatW(*ppszDisplayName,This->itemName); 837 838 TRACE("(iface:%p, pbc:%p, pmkToLeft:%p, ppszDisplayName:%s)\n",iface,pbc,pmkToLeft,debugstr_w(*ppszDisplayName)); 839 805 840 806 841 return S_OK; -
trunk/src/ole32/iunknown.cpp
r872 r4274 1 /* $Id: iunknown.cpp,v 1. 3 1999-09-08 11:29:27davidr Exp $ */1 /* $Id: iunknown.cpp,v 1.4 2000-09-17 10:31:05 davidr Exp $ */ 2 2 /* 3 3 * … … 23 23 // Local Data 24 24 // ====================================================================== 25 25 26 typedef struct 26 27 { 27 /* IUnknown fields */28 28 ICOM_VTABLE(IUnknown)* lpvtbl; 29 29 DWORD ref; 30 30 } IUnknownImpl; 31 31 32 static ULONG WIN32API IUnknown_fnAddRef(LPUNKNOWN iface); 33 static ULONG WIN32API IUnknown_fnRelease(LPUNKNOWN iface); 34 static HRESULT WIN32API IUnknown_fnQueryInterface(LPUNKNOWN iface, REFIID refiid, LPVOID * obj); 32 static ULONG WIN32API IUnknownImpl_AddRef(LPUNKNOWN iface); 33 static ULONG WIN32API IUnknownImpl_Release(LPUNKNOWN iface); 34 static HRESULT WIN32API IUnknownImpl_QueryInterface(LPUNKNOWN iface, 35 REFIID riid, LPVOID * ppvObject); 35 36 36 static ICOM_VTABLE(IUnknown) uvt =37 static ICOM_VTABLE(IUnknown) IUnknownVt = 37 38 { 38 IUnknown _fnQueryInterface,39 IUnknown _fnAddRef,40 IUnknown _fnRelease39 IUnknownImpl_QueryInterface, 40 IUnknownImpl_AddRef, 41 IUnknownImpl_Release 41 42 }; 42 43 … … 46 47 47 48 // ---------------------------------------------------------------------- 48 // IUnknown _fnAddRef49 // IUnknownImpl_AddRef 49 50 // ---------------------------------------------------------------------- 50 static ULONG WIN32API IUnknown _fnAddRef(LPUNKNOWN iface)51 static ULONG WIN32API IUnknownImpl_AddRef(LPUNKNOWN iface) 51 52 { 52 53 ICOM_THIS(IUnknownImpl, iface); 53 54 54 dprintf(("OLE32: (%p)->AddRef()", This));55 dprintf(("OLE32: IUnknown(%p)->AddRef()", This)); 55 56 56 57 return ++(This->ref); … … 58 59 59 60 // ---------------------------------------------------------------------- 60 // IUnknown _fnRelease61 // IUnknownImpl_Release 61 62 // ---------------------------------------------------------------------- 62 static ULONG WIN32API IUnknown _fnRelease(LPUNKNOWN iface)63 static ULONG WIN32API IUnknownImpl_Release(LPUNKNOWN iface) 63 64 { 64 65 ICOM_THIS(IUnknownImpl, iface); 65 66 66 dprintf(("OLE32: (%p)->Release()\n", This));67 dprintf(("OLE32: IUnknown(%p)->Release()\n", This)); 67 68 68 69 if (--(This->ref) == 0) … … 75 76 76 77 // ---------------------------------------------------------------------- 77 // I nitialize78 // IUnknownImpl_QueryInterface 78 79 // ---------------------------------------------------------------------- 79 static HRESULT WIN32API IUnknown _fnQueryInterface(LPUNKNOWN iface, REFIID refiid, LPVOID *obj)80 static HRESULT WIN32API IUnknownImpl_QueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID *ppvObject) 80 81 { 81 82 ICOM_THIS(IUnknownImpl, iface); 82 83 83 84 #ifdef DEBUG 84 oStringA tR efiid(refiid);85 dprintf(("OLE32: (%p)->QueryInterface(%s, %p)\n", This, (char *)tRefiid, obj));85 oStringA tRiid(riid); 86 dprintf(("OLE32: IUnknown(%p)->QueryInterface(%s)\n", This, (char *)tRiid)); 86 87 #endif 87 88 88 if ( !memcmp(&IID_IUnknown, refiid, sizeof(IID_IUnknown)))89 if (IsEqualIID(&IID_IUnknown, riid)) 89 90 { 90 *obj = This;91 return 0;91 dprintf((" ->IUnknown")); 92 *ppvObject = &(This->lpvtbl); 92 93 } 93 return OLE_E_ENUM_NOMORE; 94 else 95 { 96 dprintf((" ->E_NOINTERFACE")); 97 return E_NOINTERFACE; 98 } 99 100 // Query Interface always increases the reference count by one... 101 IUnknownImpl_AddRef(iface); 102 103 return S_OK; 94 104 } 95 105 96 106 // ---------------------------------------------------------------------- 97 // I nitialize107 // IUnknownImpl_Constructor 98 108 // ---------------------------------------------------------------------- 99 LPUNKNOWN IUnknown _Constructor()109 LPUNKNOWN IUnknownImpl_Constructor() 100 110 { 101 111 IUnknownImpl * unk; 102 112 103 113 unk = (IUnknownImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IUnknownImpl)); 104 unk->lpvtbl = & uvt;114 unk->lpvtbl = &IUnknownVt; 105 115 unk->ref = 1; 106 116 return (LPUNKNOWN)unk; -
trunk/src/ole32/library.cpp
r872 r4274 1 /* $Id: library.cpp,v 1. 2 1999-09-08 11:29:27davidr Exp $ */1 /* $Id: library.cpp,v 1.3 2000-09-17 10:31:05 davidr Exp $ */ 2 2 /* 3 3 * … … 58 58 dprintf(("OLE32: CoLoadLibrary(%s)", lpszLibName)); 59 59 60 hLibrary = LoadLibrary A(lpszLibName);60 hLibrary = LoadLibraryExA(lpszLibName, 0, LOAD_WITH_ALTERED_SEARCH_PATH); 61 61 62 62 if (!bAutoFree) -
trunk/src/ole32/makefile
r3864 r4274 1 # $Id: makefile,v 1.2 5 2000-07-19 19:05:12 sandervlExp $1 # $Id: makefile,v 1.26 2000-09-17 10:31:07 davidr Exp $ 2 2 3 3 # … … 38 38 $(OBJDIR)\itemmoniker.obj \ 39 39 $(OBJDIR)\iunknown.obj \ 40 $(OBJDIR)\imessagefilter.obj \ 40 41 $(OBJDIR)\library.obj \ 41 42 $(OBJDIR)\memlockbytes.obj \ -
trunk/src/ole32/ole2.cpp
r872 r4274 1 /* $Id: ole2.cpp,v 1. 2 1999-09-08 11:29:28davidr Exp $ */1 /* $Id: ole2.cpp,v 1.3 2000-09-17 10:31:05 davidr Exp $ */ 2 2 /* 3 3 * … … 21 21 #include "commctrl.h" 22 22 #include "oString.h" 23 #include "heapstring.h" 23 24 #include <assert.h> 24 25 … … 155 156 HKEY clsidKey; 156 157 LONG hres; 158 LPSTR buffer; 157 159 158 160 dprintf(("OLE32: OleRegGetUserType")); … … 180 182 181 183 // Allocate a buffer for the registry value. 182 *pszUserType = (LPOLESTR)CoTaskMemAlloc(cbData);183 184 if ( *pszUserType== NULL)184 buffer = (LPSTR)HeapAlloc(GetProcessHeap(), 0, cbData); 185 186 if (buffer == NULL) 185 187 { 186 188 RegCloseKey(clsidKey); … … 188 190 } 189 191 190 hres = RegQueryValueExA(HKEY_CLASSES_ROOT, "", NULL, &dwKeyType, (LPBYTE) *pszUserType, &cbData);192 hres = RegQueryValueExA(HKEY_CLASSES_ROOT, "", NULL, &dwKeyType, (LPBYTE)buffer, &cbData); 191 193 RegCloseKey(clsidKey); 192 194 if (hres != ERROR_SUCCESS) 193 195 { 194 CoTaskMemFree(*pszUserType); 195 *pszUserType = NULL; 196 HeapFree(GetProcessHeap(), 0, buffer); 196 197 return REGDB_E_READREGDB; 197 198 } 199 200 // Allocate a buffer for the return value. 201 *pszUserType = (LPOLESTR)CoTaskMemAlloc(cbData * 2); 202 203 if (*pszUserType == NULL) 204 { 205 HeapFree(GetProcessHeap(), 0, buffer); 206 return E_OUTOFMEMORY; 207 } 208 209 // Copy & convert to unicode... 210 lstrcpyAtoW(*pszUserType, buffer); 211 HeapFree(GetProcessHeap(), 0, buffer); 198 212 199 213 return S_OK; -
trunk/src/ole32/ole32.h
r3167 r4274 1 /* $Id: ole32.h,v 1.1 0 2000-03-19 15:35:14davidr Exp $ */1 /* $Id: ole32.h,v 1.11 2000-09-17 10:29:43 davidr Exp $ */ 2 2 /* 3 3 * … … 47 47 #include "wine/obj_cache.h" 48 48 49 #include "debugtools.h" 50 49 51 #endif -
trunk/src/ole32/oleClip.cpp
r1606 r4274 1 /* $Id: oleClip.cpp,v 1. 3 1999-11-05 09:15:51 sandervlExp $ */1 /* $Id: oleClip.cpp,v 1.4 2000-09-17 10:31:05 davidr Exp $ */ 2 2 /* 3 3 * … … 13 13 * 14 14 * Ported from Wine Implementation (2/9/99) 15 * Copyright 2000 Abey George <abey@macadamian.com> 15 16 * Copyright 1999 Noel Borthwick <noel@macadamian.com> 16 17 * … … 55 56 56 57 #include "ole32.h" 58 #include "olestd.h" 57 59 #include "commctrl.h" 58 60 #include "oString.h" 61 #include "heapstring.h" 62 #include "storage.h" 59 63 #include <assert.h> 60 64 … … 136 140 137 141 } IEnumFORMATETCImpl; 142 143 typedef struct PresentationDataHeader 144 { 145 BYTE unknown1[28]; 146 DWORD dwObjectExtentX; 147 DWORD dwObjectExtentY; 148 DWORD dwSize; 149 } PresentationDataHeader; 138 150 139 151 /* … … 153 165 static void OLEClipbrd_DestroyWindow(HWND hwnd); 154 166 LRESULT CALLBACK OLEClipbrd_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 155 static HRESULT OLEClipbrd_RenderFormat( LPFORMATETC pFormatetc);167 static HRESULT OLEClipbrd_RenderFormat( IDataObject *pIDataObject, LPFORMATETC pFormatetc ); 156 168 static HGLOBAL OLEClipbrd_GlobalDupMem( HGLOBAL hGlobalSrc ); 157 169 … … 472 484 HRESULT hr = S_OK; 473 485 BOOL bClipboardOpen = FALSE; 486 IDataObject* pIDataObjectSrc = NULL; 474 487 475 488 … … 486 499 487 500 /* 501 * Addref and save the source data object we are holding on to temporarily, 502 * since it will be released when we empty the clipboard. 503 */ 504 pIDataObjectSrc = theOleClipboard->pIDataObjectSrc; 505 IDataObject_AddRef(pIDataObjectSrc); 506 507 /* 488 508 * Open the Windows clipboard 489 509 */ … … 501 521 * the windows clipboard. 502 522 */ 503 if ( FAILED( hr = IDataObject_EnumFormatEtc( (IDataObject*)&(theOleClipboard->lpvtbl1),523 if ( FAILED( hr = IDataObject_EnumFormatEtc( pIDataObjectSrc, 504 524 DATADIR_GET, 505 525 &penumFormatetc) )) … … 510 530 while ( S_OK == IEnumFORMATETC_Next(penumFormatetc, 1, &rgelt, NULL) ) 511 531 { 512 if ( rgelt.tymed == TYMED_HGLOBAL)532 if (( rgelt.tymed == TYMED_HGLOBAL ) || ( rgelt.tymed == TYMED_ISTORAGE )) 513 533 { 514 534 CHAR szFmtName[80]; … … 520 540 * Render the clipboard data 521 541 */ 522 if ( FAILED(OLEClipbrd_RenderFormat( &rgelt )) )542 if ( FAILED(OLEClipbrd_RenderFormat( pIDataObjectSrc, &rgelt )) ) 523 543 continue; 524 544 } 545 else 546 FIXME("(type of medium:%ld not supported yet !!)\n",rgelt.tymed); 525 547 } 526 548 … … 530 552 * Release the data object we are holding on to 531 553 */ 532 if ( theOleClipboard->pIDataObjectSrc ) 533 { 534 IDataObject_Release(theOleClipboard->pIDataObjectSrc); 535 theOleClipboard->pIDataObjectSrc = NULL; 536 } 554 IDataObject_Release(pIDataObjectSrc); 537 555 538 556 CLEANUP: … … 799 817 * (We must have a source data object or we wouldn't be in this WndProc) 800 818 */ 801 OLEClipbrd_RenderFormat( &rgelt );819 OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl1), &rgelt ); 802 820 803 821 break; … … 834 852 while ( S_OK == IEnumFORMATETC_Next(penumFormatetc, 1, &rgelt, NULL) ) 835 853 { 836 if ( rgelt.tymed == TYMED_HGLOBAL)854 if (( rgelt.tymed == TYMED_HGLOBAL ) || ( rgelt.tymed == TYMED_ISTORAGE )) 837 855 { 838 856 /* 839 857 * Render the clipboard data. 840 858 */ 841 if ( FAILED(OLEClipbrd_RenderFormat( &rgelt )) )859 if ( FAILED(OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl1), &rgelt )) ) 842 860 continue; 843 861 844 862 dprintf(("OLE32: OLEClipbrd_WndProc - WM_RENDERALLFORMATS(cfFormat=%d)\n", rgelt.cfFormat)); 845 863 } 864 else FIXME("(): WM_RENDERALLFORMATS(cfFormat=%d) not supported !!\n", rgelt.cfFormat); 846 865 } 847 866 … … 888 907 } 889 908 909 #define MAX_CLIPFORMAT_NAME 80 890 910 891 911 /*********************************************************************** … … 895 915 * Note: This function assumes it is passed an HGLOBAL format to render. 896 916 */ 897 static HRESULT OLEClipbrd_RenderFormat( LPFORMATETC pFormatetc)898 { 899 STGMEDIUM medium;917 static HRESULT OLEClipbrd_RenderFormat(IDataObject *pIDataObject, LPFORMATETC pFormatetc) 918 { 919 STGMEDIUM std; 900 920 HGLOBAL hDup; 901 921 HRESULT hr = S_OK; 902 903 if ( FAILED(hr = IDataObject_GetData((IDataObject*)&(theOleClipboard->lpvtbl1), 904 pFormatetc, &medium)) ) 905 { 906 dprintf(("OLE32: Warning : IDataObject_GetData failed to render clipboard data! (%lx)\n", hr)); 922 char szFmtName[MAX_CLIPFORMAT_NAME]; 923 ILockBytes *ptrILockBytes = 0; 924 HGLOBAL hStorage = 0; 925 926 GetClipboardFormatNameA(pFormatetc->cfFormat, szFmtName, MAX_CLIPFORMAT_NAME); 927 928 /* If embed source */ 929 if (!strcmp(szFmtName, CF_EMBEDSOURCE)) 930 { 931 memset(&std, 0, sizeof(STGMEDIUM)); 932 std.tymed = pFormatetc->tymed = TYMED_ISTORAGE; 933 934 hStorage = GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE, 0); 935 hr = CreateILockBytesOnHGlobal(hStorage, FALSE, &ptrILockBytes); 936 hr = StgCreateDocfileOnILockBytes(ptrILockBytes, STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, &std.u.pstg); 937 938 if (FAILED(hr = IDataObject_GetDataHere(pIDataObject, pFormatetc, &std))) 939 { 940 WARN("() : IDataObject_GetDataHere failed to render clipboard data! (%lx)\n", hr); 941 return hr; 942 } 943 944 //if (1) /* check whether the presentation data is already -not- present */ 945 { 946 FORMATETC fmt2; 947 STGMEDIUM std2; 948 METAFILEPICT *mfp = 0; 949 950 fmt2.cfFormat = CF_METAFILEPICT; 951 fmt2.ptd = 0; 952 fmt2.dwAspect = DVASPECT_CONTENT; 953 fmt2.lindex = -1; 954 fmt2.tymed = TYMED_MFPICT; 955 956 memset(&std2, 0, sizeof(STGMEDIUM)); 957 std2.tymed = TYMED_MFPICT; 958 959 /* Get the metafile picture out of it */ 960 961 if (!FAILED(hr = IDataObject_GetData(pIDataObject, &fmt2, &std2))) 962 { 963 mfp = (METAFILEPICT *)GlobalLock(std2.u.hMetaFilePict); 964 } 965 966 if (mfp) 967 { 968 OLECHAR name[]={ 2, 'O', 'l', 'e', 'P', 'r', 'e', 's', '0', '0', '0', 0}; 969 IStream *pStream = 0; 970 void *mfBits; 971 PresentationDataHeader pdh; 972 INT nSize; 973 CLSID clsID; 974 LPOLESTR strProgID; 975 CHAR strOleTypeName[51]; 976 BYTE OlePresStreamHeader [] = 977 { 978 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 979 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 980 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 981 0x00, 0x00, 0x00, 0x00 982 }; 983 984 nSize = GetMetaFileBitsEx(mfp->hMF, 0, NULL); 985 986 memset(&pdh, 0, sizeof(PresentationDataHeader)); 987 memcpy(&pdh, OlePresStreamHeader, sizeof(OlePresStreamHeader)); 988 989 pdh.dwObjectExtentX = mfp->xExt; 990 pdh.dwObjectExtentY = mfp->yExt; 991 pdh.dwSize = nSize; 992 993 hr = IStorage_CreateStream(std.u.pstg, name, STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE, 0, 0, &pStream); 994 995 hr = IStream_Write(pStream, &pdh, sizeof(PresentationDataHeader), NULL); 996 997 mfBits = HeapAlloc(GetProcessHeap(), 0, nSize); 998 nSize = GetMetaFileBitsEx(mfp->hMF, nSize, mfBits); 999 1000 hr = IStream_Write(pStream, mfBits, nSize, NULL); 1001 1002 IStream_Release(pStream); 1003 1004 HeapFree(GetProcessHeap(), 0, mfBits); 1005 1006 GlobalUnlock(std2.u.hMetaFilePict); 1007 1008 ReadClassStg(std.u.pstg, &clsID); 1009 ProgIDFromCLSID(&clsID, &strProgID); 1010 1011 lstrcpyWtoA(strOleTypeName, strProgID); 1012 OLECONVERT_CreateEmbeddedOleStream(std.u.pstg); 1013 OLECONVERT_CreateCompObjStream(std.u.pstg, strOleTypeName); 1014 } 1015 } 1016 } 1017 else 1018 { 1019 if (FAILED(hr = IDataObject_GetData(pIDataObject, pFormatetc, &std))) 1020 { 1021 WARN("() : IDataObject_GetData failed to render clipboard data! (%lx)\n", hr); 907 1022 return hr; 908 1023 } 1024 1025 /* To put a copy back on the clipboard */ 1026 switch (std.tymed) 1027 { 1028 case TYMED_HGLOBAL: 1029 hStorage = std.u.hGlobal; 1030 break; 1031 1032 case TYMED_ENHMF: 1033 case TYMED_FILE: 1034 case TYMED_ISTORAGE: 1035 case TYMED_ISTREAM: 1036 case TYMED_GDI: 1037 case TYMED_MFPICT: 1038 case TYMED_NULL: 1039 FIXME("Unsupported data format (tymed=%d)\n", (int) std.tymed); 1040 default: 1041 WARN("Unable to render clipboard data, unsupported data format (tymed=%d) \n", 1042 (int) std.tymed); 1043 } 1044 1045 } 909 1046 910 1047 /* … … 912 1049 */ 913 1050 914 if ( !(hDup = OLEClipbrd_GlobalDupMem( medium.u.hGlobal)) )1051 if ( !(hDup = OLEClipbrd_GlobalDupMem(hStorage)) ) 915 1052 HANDLE_ERROR( E_OUTOFMEMORY ); 916 1053 … … 918 1055 { 919 1056 GlobalFree(hDup); 920 dprintf(("OLE32: Warning : Failed to set rendered clipboard data into clipboard!\n"));1057 WARN("() : Failed to set rendered clipboard data into clipboard!\n"); 921 1058 } 922 1059 923 1060 CLEANUP: 924 1061 925 ReleaseStgMedium(& medium);1062 ReleaseStgMedium(&std); 926 1063 927 1064 return hr; -
trunk/src/ole32/oleMenu.cpp
r872 r4274 1 /* $Id: oleMenu.cpp,v 1. 2 1999-09-08 11:29:28davidr Exp $ */1 /* $Id: oleMenu.cpp,v 1.3 2000-09-17 10:31:06 davidr Exp $ */ 2 2 /* 3 3 * … … 95 95 if ( !(hOleMenu = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, 96 96 sizeof(OleMenuDescriptor) ) ) ) 97 return 0;97 return 0; 98 98 99 99 pOleMenuDescriptor = (OleMenuDescriptor *) GlobalLock( hOleMenu ); -
trunk/src/ole32/storage.h
r3167 r4274 1 /* $Id: storage.h,v 1. 2 2000-03-19 15:35:15davidr Exp $ */1 /* $Id: storage.h,v 1.3 2000-09-17 10:29:44 davidr Exp $ */ 2 2 /* 3 3 * Compound Storage (32 bit version) … … 865 865 SmallBlockChainStream* This); 866 866 867 // Temp 868 void OLECONVERT_CreateEmbeddedOleStream(LPSTORAGE pStorage); 869 HRESULT OLECONVERT_CreateCompObjStream(LPSTORAGE pStorage, LPCSTR strOleTypeName); 870 867 871 868 872 #endif /* __STORAGE32_H__ */ -
trunk/src/ole32/stubs.cpp
r3178 r4274 1 /* $Id: stubs.cpp,v 1.1 3 2000-03-21 00:38:38davidr Exp $ */1 /* $Id: stubs.cpp,v 1.14 2000-09-17 10:31:06 davidr Exp $ */ 2 2 /* 3 3 * Win32 COM/OLE stubs for OS/2 … … 174 174 //******************************************************************************* 175 175 //******************************************************************************* 176 HRESULT WIN32API CoRegisterMessageFilter(LPMESSAGEFILTER lpMessageFilter,177 LPMESSAGEFILTER *lplpMessageFilter)178 {179 dprintf(("OLE32: CoRegisterMessageFilter - stub"));180 if (lplpMessageFilter)181 *lplpMessageFilter = NULL;182 return S_FALSE;183 }184 //*******************************************************************************185 //*******************************************************************************186 176 HRESULT WIN32API CoReleaseMarshalData(IStream *pStm) 187 177 { -
trunk/src/ole32/taskmem.cpp
r1655 r4274 1 /* $Id: taskmem.cpp,v 1. 3 1999-11-09 10:47:45 birdExp $ */1 /* $Id: taskmem.cpp,v 1.4 2000-09-17 10:31:06 davidr Exp $ */ 2 2 /* 3 3 * … … 153 153 return S_OK; 154 154 } 155 return OLE_E_ENUM_NOMORE;155 return E_NOINTERFACE; 156 156 } 157 157
Note:
See TracChangeset
for help on using the changeset viewer.