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