Changeset 6650 for trunk/src/shell32/shellole.c
- Timestamp:
- Sep 5, 2001, 3:54:53 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/shell32/shellole.c
r5618 r6650 1 /* $Id: shellole.c,v 1.3 2001-09-05 13:46:57 bird Exp $ */ 1 2 /* 2 * 3 * handling of SHELL32.DLL OLE-Objects 3 4 * 4 * Copyright 1997Marcus Meissner5 * Copyright 1998Juergen Schmied <juergen.schmied@metronet.de>5 * Copyright 1997 Marcus Meissner 6 * Copyright 1998 Juergen Schmied <juergen.schmied@metronet.de> 6 7 * 7 8 */ … … 24 25 DWORD WINAPI SHCLSIDFromStringA (LPSTR clsid, CLSID *id); 25 26 extern IShellFolder * IShellFolder_Constructor( 26 27 27 IShellFolder * psf, 28 LPITEMIDLIST pidl); 28 29 extern HRESULT IFSFolder_Constructor( 29 30 31 30 IUnknown * pUnkOuter, 31 REFIID riid, 32 LPVOID * ppv); 32 33 33 34 /************************************************************************* 34 35 * SHCoCreateInstance [SHELL32.102] 35 * 36 * 36 37 * NOTES 37 38 * exported by ordinal 38 39 */ 39 40 LRESULT WINAPI SHCoCreateInstance( 40 41 42 43 44 45 { 46 DWORDhres;47 IIDiid;48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 41 LPSTR aclsid, 42 REFCLSID clsid, 43 IUnknown * unknownouter, 44 REFIID refiid, 45 LPVOID *ppv) 46 { 47 DWORD hres; 48 IID iid; 49 CLSID * myclsid = (CLSID*)clsid; 50 51 if (!clsid) 52 { 53 if (!aclsid) return REGDB_E_CLASSNOTREG; 54 SHCLSIDFromStringA(aclsid, &iid); 55 myclsid = &iid; 56 } 57 58 TRACE("(%p,\n\tCLSID:\t%s, unk:%p\n\tIID:\t%s,%p)\n", 59 aclsid,debugstr_guid(myclsid),unknownouter,debugstr_guid(refiid),ppv); 60 61 if IsEqualCLSID(myclsid, &CLSID_ShellFSFolder) 62 { 63 hres = IFSFolder_Constructor(unknownouter, refiid, ppv); 64 } 65 else 66 { 67 hres = CoCreateInstance(myclsid, unknownouter, CLSCTX_INPROC_SERVER, refiid, ppv); 68 } 69 70 if(hres!=S_OK) 71 { 72 ERR("failed (0x%08lx) to create \n\tCLSID:\t%s\n\tIID:\t%s\n", 72 73 hres, debugstr_guid(myclsid), debugstr_guid(refiid)); 73 74 75 76 77 74 ERR("class not found in registry\n"); 75 } 76 77 TRACE("-- instance: %p\n",*ppv); 78 return hres; 78 79 } 79 80 … … 82 83 */ 83 84 HRESULT WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) 84 { HRESULThres = E_OUTOFMEMORY;85 86 87 88 89 90 91 if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop)|| 92 93 94 95 96 if(lpclf) 97 98 99 100 101 102 103 104 105 106 107 108 109 } 110 111 /************************************************************************* 112 * SHCLSIDFromString 85 { HRESULT hres = E_OUTOFMEMORY; 86 LPCLASSFACTORY lpclf; 87 88 TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); 89 90 *ppv = NULL; 91 92 if(IsEqualCLSID(rclsid, &CLSID_ShellDesktop)|| 93 IsEqualCLSID(rclsid, &CLSID_ShellLink)) 94 { 95 lpclf = IClassFactory_Constructor( rclsid ); 96 97 if(lpclf) 98 { 99 hres = IClassFactory_QueryInterface(lpclf,iid, ppv); 100 IClassFactory_Release(lpclf); 101 } 102 } 103 else 104 { 105 WARN("-- CLSID not found\n"); 106 hres = CLASS_E_CLASSNOTAVAILABLE; 107 } 108 TRACE("-- pointer to class factory: %p\n",*ppv); 109 return hres; 110 } 111 112 /************************************************************************* 113 * SHCLSIDFromString [SHELL32.147] 113 114 * 114 115 * NOTES … … 125 126 DWORD WINAPI SHCLSIDFromStringW (LPWSTR clsid, CLSID *id) 126 127 { 127 128 return CLSIDFromString(clsid, id); 128 TRACE("(%p(%s) %p)\n", clsid, debugstr_w(clsid), id); 129 return CLSIDFromString(clsid, id); 129 130 } 130 131 DWORD WINAPI SHCLSIDFromStringAW (LPVOID clsid, CLSID *id) 131 132 { 132 133 134 135 } 136 137 /************************************************************************* 138 * SHGetMalloc[SHELL32.220]133 if (SHELL_OsIsUnicode()) 134 return SHCLSIDFromStringW (clsid, id); 135 return SHCLSIDFromStringA (clsid, id); 136 } 137 138 /************************************************************************* 139 * SHGetMalloc [SHELL32.220] 139 140 * returns the interface to shell malloc. 140 141 * … … 145 146 * heap (ProcessHeap). 146 147 */ 147 DWORD WINAPI SHGetMalloc(LPMALLOC *lpmal) 148 { 149 150 151 } 152 153 /************************************************************************* 154 * SHGetDesktopFolder 148 DWORD WINAPI SHGetMalloc(LPMALLOC *lpmal) 149 { 150 TRACE("(%p)\n", lpmal); 151 return CoGetMalloc(MEMCTX_TASK, lpmal); 152 } 153 154 /************************************************************************* 155 * SHGetDesktopFolder [SHELL32.216] 155 156 */ 156 157 LPSHELLFOLDER pdesktopfolder=NULL; … … 158 159 DWORD WINAPI SHGetDesktopFolder(IShellFolder **psf) 159 160 { 160 HRESULThres = S_OK;161 162 163 164 165 166 if (!pdesktopfolder) 167 168 169 if(lpclf) 170 171 172 173 } 174 175 176 if (pdesktopfolder) 177 178 179 180 181 182 183 184 161 HRESULT hres = S_OK; 162 LPCLASSFACTORY lpclf; 163 TRACE("%p->(%p)\n",psf,*psf); 164 165 *psf=NULL; 166 167 if (!pdesktopfolder) 168 { 169 lpclf = IClassFactory_Constructor(&CLSID_ShellDesktop); 170 if(lpclf) 171 { 172 hres = IClassFactory_CreateInstance(lpclf,NULL,(REFIID)&IID_IShellFolder, (void*)&pdesktopfolder); 173 IClassFactory_Release(lpclf); 174 } 175 } 176 177 if (pdesktopfolder) 178 { 179 /* even if we create the folder, add a ref so the application canŽt destroy the folder*/ 180 IShellFolder_AddRef(pdesktopfolder); 181 *psf = pdesktopfolder; 182 } 183 184 TRACE("-- %p->(%p)\n",psf, *psf); 185 return hres; 185 186 } 186 187 … … 194 195 ICOM_VFIELD(IClassFactory); 195 196 DWORD ref; 196 CLSID 197 CLSID *rclsid; 197 198 } IClassFactoryImpl; 198 199 … … 205 206 LPCLASSFACTORY IClassFactory_Constructor(REFCLSID rclsid) 206 207 { 207 208 209 210 211 212 213 214 215 216 208 IClassFactoryImpl* lpclf; 209 210 lpclf= (IClassFactoryImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactoryImpl)); 211 lpclf->ref = 1; 212 ICOM_VTBL(lpclf) = &clfvt; 213 lpclf->rclsid = (CLSID*)rclsid; 214 215 TRACE("(%p)->()\n",lpclf); 216 InterlockedIncrement(&shell32_ObjCount); 217 return (LPCLASSFACTORY)lpclf; 217 218 } 218 219 /************************************************************************** … … 222 223 LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj) 223 224 { 224 225 226 227 228 229 230 { *ppvObj = This; 231 232 233 234 } 235 236 237 { IUnknown_AddRef((LPUNKNOWN)*ppvObj); 238 239 240 241 242 243 } 225 ICOM_THIS(IClassFactoryImpl,iface); 226 TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid)); 227 228 *ppvObj = NULL; 229 230 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 231 { *ppvObj = This; 232 } 233 else if(IsEqualIID(riid, &IID_IClassFactory)) /*IClassFactory*/ 234 { *ppvObj = (IClassFactory*)This; 235 } 236 237 if(*ppvObj) 238 { IUnknown_AddRef((LPUNKNOWN)*ppvObj); 239 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 240 return S_OK; 241 } 242 TRACE("-- Interface: %s E_NOINTERFACE\n", debugstr_guid(riid)); 243 return E_NOINTERFACE; 244 } 244 245 /****************************************************************************** 245 246 * IClassFactory_AddRef … … 247 248 static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface) 248 249 { 249 250 251 252 253 250 ICOM_THIS(IClassFactoryImpl,iface); 251 TRACE("(%p)->(count=%lu)\n",This,This->ref); 252 253 InterlockedIncrement(&shell32_ObjCount); 254 return InterlockedIncrement(&This->ref); 254 255 } 255 256 /****************************************************************************** … … 258 259 static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface) 259 260 { 260 261 262 263 264 if (!InterlockedDecrement(&This->ref)) 265 266 267 268 269 270 261 ICOM_THIS(IClassFactoryImpl,iface); 262 TRACE("(%p)->(count=%lu)\n",This,This->ref); 263 264 InterlockedDecrement(&shell32_ObjCount); 265 if (!InterlockedDecrement(&This->ref)) 266 { 267 TRACE("-- destroying IClassFactory(%p)\n",This); 268 HeapFree(GetProcessHeap(),0,This); 269 return 0; 270 } 271 return This->ref; 271 272 } 272 273 /****************************************************************************** … … 276 277 LPCLASSFACTORY iface, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) 277 278 { 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 } 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 279 ICOM_THIS(IClassFactoryImpl,iface); 280 IUnknown *pObj = NULL; 281 HRESULT hres; 282 283 TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnknown,debugstr_guid(riid),ppObject); 284 285 *ppObject = NULL; 286 287 if(pUnknown) 288 { 289 return(CLASS_E_NOAGGREGATION); 290 } 291 292 if (IsEqualCLSID(This->rclsid, &CLSID_ShellDesktop)) 293 { 294 pObj = (IUnknown *)ISF_Desktop_Constructor(); 295 } 296 else if (IsEqualCLSID(This->rclsid, &CLSID_ShellLink)) 297 { 298 pObj = (IUnknown *)IShellLink_Constructor(FALSE); 299 } 300 else 301 { 302 ERR("unknown IID requested\n\tIID:\t%s\n",debugstr_guid(riid)); 303 return(E_NOINTERFACE); 304 } 305 306 if (!pObj) 307 { 308 return(E_OUTOFMEMORY); 309 } 310 311 hres = IUnknown_QueryInterface(pObj,riid, ppObject); 312 IUnknown_Release(pObj); 313 314 TRACE("-- Object created: (%p)->%p\n",This,*ppObject); 315 316 return hres; 316 317 } 317 318 /****************************************************************************** … … 320 321 static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface, BOOL fLock) 321 322 { 322 323 324 325 } 326 327 static ICOM_VTABLE(IClassFactory) clfvt = 323 ICOM_THIS(IClassFactoryImpl,iface); 324 TRACE("%p->(0x%x), not implemented\n",This, fLock); 325 return E_NOTIMPL; 326 } 327 328 static ICOM_VTABLE(IClassFactory) clfvt = 328 329 { 329 330 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE … … 355 356 ICOM_VFIELD(IClassFactory); 356 357 DWORD ref; 357 CLSID 358 LPFNCREATEINSTANCE 359 const IID * 360 ULONG * 358 CLSID *rclsid; 359 LPFNCREATEINSTANCE lpfnCI; 360 const IID * riidInst; 361 ULONG * pcRefDll; /* pointer to refcounter in external dll (ugrrr...) */ 361 362 } IDefClFImpl; 362 363 … … 369 370 IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst) 370 371 { 371 372 373 374 375 376 377 378 379 380 381 382 383 384 372 IDefClFImpl* lpclf; 373 374 lpclf = (IDefClFImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(IDefClFImpl)); 375 lpclf->ref = 1; 376 ICOM_VTBL(lpclf) = &dclfvt; 377 lpclf->lpfnCI = lpfnCI; 378 lpclf->pcRefDll = pcRefDll; 379 380 if (pcRefDll) InterlockedIncrement(pcRefDll); 381 lpclf->riidInst = riidInst; 382 383 TRACE("(%p)\n\tIID:\t%s\n",lpclf, debugstr_guid(riidInst)); 384 InterlockedIncrement(&shell32_ObjCount); 385 return (LPCLASSFACTORY)lpclf; 385 386 } 386 387 /************************************************************************** … … 390 391 LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj) 391 392 { 392 393 394 395 396 397 398 399 { *ppvObj = This; 400 401 402 403 } 404 405 406 { IUnknown_AddRef((LPUNKNOWN)*ppvObj); 407 408 409 410 411 412 } 393 ICOM_THIS(IDefClFImpl,iface); 394 395 TRACE("(%p)->(\n\tIID:\t%s)\n",This,debugstr_guid(riid)); 396 397 *ppvObj = NULL; 398 399 if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ 400 { *ppvObj = This; 401 } 402 else if(IsEqualIID(riid, &IID_IClassFactory)) /*IClassFactory*/ 403 { *ppvObj = (IClassFactory*)This; 404 } 405 406 if(*ppvObj) 407 { IUnknown_AddRef((LPUNKNOWN)*ppvObj); 408 TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); 409 return S_OK; 410 } 411 TRACE("-- Interface: %s E_NOINTERFACE\n", debugstr_guid(riid)); 412 return E_NOINTERFACE; 413 } 413 414 /****************************************************************************** 414 415 * IDefClF_fnAddRef … … 416 417 static ULONG WINAPI IDefClF_fnAddRef(LPCLASSFACTORY iface) 417 418 { 418 419 420 421 422 419 ICOM_THIS(IDefClFImpl,iface); 420 TRACE("(%p)->(count=%lu)\n",This,This->ref); 421 422 InterlockedIncrement(&shell32_ObjCount); 423 return InterlockedIncrement(&This->ref); 423 424 } 424 425 /****************************************************************************** … … 427 428 static ULONG WINAPI IDefClF_fnRelease(LPCLASSFACTORY iface) 428 429 { 429 430 431 432 433 434 if (!InterlockedDecrement(&This->ref)) 435 { 436 437 438 439 440 441 442 430 ICOM_THIS(IDefClFImpl,iface); 431 TRACE("(%p)->(count=%lu)\n",This,This->ref); 432 433 InterlockedDecrement(&shell32_ObjCount); 434 435 if (!InterlockedDecrement(&This->ref)) 436 { 437 if (This->pcRefDll) InterlockedDecrement(This->pcRefDll); 438 439 TRACE("-- destroying IClassFactory(%p)\n",This); 440 HeapFree(GetProcessHeap(),0,This); 441 return 0; 442 } 443 return This->ref; 443 444 } 444 445 /****************************************************************************** … … 448 449 LPCLASSFACTORY iface, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject) 449 450 { 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 451 ICOM_THIS(IDefClFImpl,iface); 452 453 TRACE("%p->(%p,\n\tIID:\t%s,%p)\n",This,pUnkOuter,debugstr_guid(riid),ppvObject); 454 455 *ppvObject = NULL; 456 457 if(pUnkOuter) 458 return(CLASS_E_NOAGGREGATION); 459 460 if ( This->riidInst==NULL || 461 IsEqualCLSID(riid, This->riidInst) || 462 IsEqualCLSID(riid, &IID_IUnknown) ) 463 { 464 return This->lpfnCI(pUnkOuter, riid, ppvObject); 465 } 466 467 ERR("unknown IID requested\n\tIID:\t%s\n",debugstr_guid(riid)); 468 return E_NOINTERFACE; 468 469 } 469 470 /****************************************************************************** … … 472 473 static HRESULT WINAPI IDefClF_fnLockServer(LPCLASSFACTORY iface, BOOL fLock) 473 474 { 474 475 476 477 } 478 479 static ICOM_VTABLE(IClassFactory) dclfvt = 475 ICOM_THIS(IDefClFImpl,iface); 476 TRACE("%p->(0x%x), not implemented\n",This, fLock); 477 return E_NOTIMPL; 478 } 479 480 static ICOM_VTABLE(IClassFactory) dclfvt = 480 481 { 481 482 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE … … 488 489 489 490 /****************************************************************************** 490 * SHCreateDefClassObject 491 * SHCreateDefClassObject [SHELL32.70] 491 492 */ 492 493 HRESULT WINAPI SHCreateDefClassObject( 493 REFIID riid, 494 LPVOID* ppv, 495 LPFNCREATEINSTANCE lpfnCI,/* [in] create instance callback entry */496 PLONG pcRefDll,/* [in/out] ref count of the dll */497 REFIID riidInst)/* [in] optional interface to the instance */498 { 499 494 REFIID riid, 495 LPVOID* ppv, 496 LPFNCREATEINSTANCE lpfnCI, /* [in] create instance callback entry */ 497 PLONG pcRefDll, /* [in/out] ref count of the dll */ 498 REFIID riidInst) /* [in] optional interface to the instance */ 499 { 500 TRACE("\n\tIID:\t%s %p %p %p \n\tIIDIns:\t%s\n", 500 501 debugstr_guid(riid), ppv, lpfnCI, pcRefDll, debugstr_guid(riidInst)); 501 502 502 503 504 505 506 507 508 509 510 511 512 513 } 514 515 /************************************************************************* 516 * DragAcceptFiles 503 if ( IsEqualCLSID(riid, &IID_IClassFactory) ) 504 { 505 IClassFactory * pcf = IDefClF_fnConstructor(lpfnCI, pcRefDll, riidInst); 506 if (pcf) 507 { 508 *ppv = pcf; 509 return NOERROR; 510 } 511 return E_OUTOFMEMORY; 512 } 513 return E_NOINTERFACE; 514 } 515 516 /************************************************************************* 517 * DragAcceptFiles [SHELL32.54] 517 518 */ 518 519 void WINAPI DragAcceptFiles(HWND hWnd, BOOL b) 519 520 { 520 521 522 523 524 525 526 527 528 529 } 530 531 /************************************************************************* 532 * DragFinish 521 LONG exstyle; 522 523 if( !IsWindow(hWnd) ) return; 524 exstyle = GetWindowLongA(hWnd,GWL_EXSTYLE); 525 if (b) 526 exstyle |= WS_EX_ACCEPTFILES; 527 else 528 exstyle &= ~WS_EX_ACCEPTFILES; 529 SetWindowLongA(hWnd,GWL_EXSTYLE,exstyle); 530 } 531 532 /************************************************************************* 533 * DragFinish [SHELL32.80] 533 534 */ 534 535 void WINAPI DragFinish(HDROP h) 535 536 { 536 537 538 } 539 540 /************************************************************************* 541 * DragQueryPoint 537 TRACE("\n"); 538 GlobalFree((HGLOBAL)h); 539 } 540 541 /************************************************************************* 542 * DragQueryPoint [SHELL32.135] 542 543 */ 543 544 BOOL WINAPI DragQueryPoint(HDROP hDrop, POINT *p) 544 545 { 545 546 DROPFILES *lpDropFileStruct; 546 547 548 549 550 547 BOOL bRet; 548 549 TRACE("\n"); 550 551 lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); 551 552 552 553 *p = lpDropFileStruct->pt; 553 554 555 556 557 } 558 559 /************************************************************************* 560 * DragQueryFileA 554 bRet = lpDropFileStruct->fNC; 555 556 GlobalUnlock(hDrop); 557 return bRet; 558 } 559 560 /************************************************************************* 561 * DragQueryFileA [SHELL32.81] [shell32.82] 561 562 */ 562 563 UINT WINAPI DragQueryFileA( 563 564 565 566 567 { 568 569 570 571 572 TRACE("(%08x, %x, %p, %u)\n",hDrop,lFile,lpszFile,lLength);573 574 575 576 577 578 579 580 581 if (!*lpDrop) 582 583 i = (lFile == 0xFFFFFFFF) ? i : 0; 584 585 586 587 588 589 590 591 592 564 HDROP hDrop, 565 UINT lFile, 566 LPSTR lpszFile, 567 UINT lLength) 568 { 569 LPSTR lpDrop; 570 UINT i = 0; 571 DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); 572 573 TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszFile,lLength); 574 575 if(!lpDropFileStruct) goto end; 576 577 lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->pFiles; 578 579 while (i++ < lFile) 580 { 581 while (*lpDrop++); /* skip filename */ 582 if (!*lpDrop) 583 { 584 i = (lFile == 0xFFFFFFFF) ? i : 0; 585 goto end; 586 } 587 } 588 589 i = strlen(lpDrop); 590 i++; 591 if (!lpszFile ) goto end; /* needed buffer size */ 592 i = (lLength > i) ? i : lLength; 593 lstrcpynA (lpszFile, lpDrop, i); 593 594 end: 594 595 596 } 597 598 /************************************************************************* 599 * DragQueryFileW 595 GlobalUnlock(hDrop); 596 return i; 597 } 598 599 /************************************************************************* 600 * DragQueryFileW [shell32.133] 600 601 */ 601 602 UINT WINAPI DragQueryFileW( 602 603 604 605 606 { 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 if (!*lpwDrop) 622 623 i = (lFile == 0xFFFFFFFF) ? i : 0; 624 625 626 627 628 629 630 631 632 633 603 HDROP hDrop, 604 UINT lFile, 605 LPWSTR lpszwFile, 606 UINT lLength) 607 { 608 LPWSTR lpwDrop; 609 UINT i = 0; 610 DROPFILES *lpDropFileStruct = (DROPFILES *) GlobalLock(hDrop); 611 612 TRACE("(%08x, %x, %p, %u)\n", hDrop,lFile,lpszwFile,lLength); 613 614 if(!lpDropFileStruct) goto end; 615 616 lpwDrop = (LPWSTR) lpDropFileStruct + lpDropFileStruct->pFiles; 617 618 i = 0; 619 while (i++ < lFile) 620 { 621 while (*lpwDrop++); /* skip filename */ 622 if (!*lpwDrop) 623 { 624 i = (lFile == 0xFFFFFFFF) ? i : 0; 625 goto end; 626 } 627 } 628 629 i = strlenW(lpwDrop); 630 i++; 631 if ( !lpszwFile) goto end; /* needed buffer size */ 632 633 i = (lLength > i) ? i : lLength; 634 lstrcpynW (lpszwFile, lpwDrop, i); 634 635 end: 635 636 637 } 636 GlobalUnlock(hDrop); 637 return i; 638 }
Note:
See TracChangeset
for help on using the changeset viewer.