static HRESULT WINAPI MSTASK_ITaskScheduler_Activate(ITaskScheduler *iface, LPCWSTR task_name, REFIID riid, IUnknown **unknown) { ITask *task; IPersistFile *pfile; HRESULT hr; TRACE("%p, %s, %s, %p\n", iface, debugstr_w(task_name), debugstr_guid(riid), unknown); hr = ITaskScheduler_NewWorkItem(iface, task_name, &CLSID_CTask, riid, (IUnknown **)&task); if (hr != S_OK) return hr; hr = ITask_QueryInterface(task, &IID_IPersistFile, (void **)&pfile); if (hr == S_OK) { WCHAR *curfile; hr = IPersistFile_GetCurFile(pfile, &curfile); if (hr == S_OK) { hr = IPersistFile_Load(pfile, curfile, STGM_READ | STGM_SHARE_DENY_WRITE); CoTaskMemFree(curfile); } IPersistFile_Release(pfile); } if (hr == S_OK) *unknown = (IUnknown *)task; else ITask_Release(task); return hr; }
/********************************************************************** * OpenURL (SHDOCVW.@) */ void WINAPI OpenURL(HWND hWnd, HINSTANCE hInst, LPCSTR lpcstrUrl, int nShowCmd) { InternetShortcut *shortcut; WCHAR* urlfilepath = NULL; shortcut = create_shortcut(); if (shortcut) { int len; len = MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, NULL, 0); urlfilepath = heap_alloc(len * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, lpcstrUrl, -1, urlfilepath, len); if(SUCCEEDED(IPersistFile_Load(&shortcut->persistFile, urlfilepath, 0))) { URLINVOKECOMMANDINFOW ici; memset( &ici, 0, sizeof ici ); ici.dwcbSize = sizeof ici; ici.dwFlags = IURL_INVOKECOMMAND_FL_USE_DEFAULT_VERB; ici.hwndParent = hWnd; if FAILED(UniformResourceLocatorW_InvokeCommand(&shortcut->uniformResourceLocatorW, (PURLINVOKECOMMANDINFOW) &ici)) TRACE("failed to open URL: %s\n.",debugstr_a(lpcstrUrl)); } heap_free(shortcut); heap_free(urlfilepath); }
static IShellLinkW *load_shelllink( const WCHAR *path ) { HRESULT hr; IShellLinkW *link; IPersistFile *file; hr = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (void **)&link ); if (FAILED( hr )) return NULL; hr = IShellLinkW_QueryInterface( link, &IID_IPersistFile, (void **)&file ); if (FAILED( hr )) { IShellLinkW_Release( link ); return NULL; } hr = IPersistFile_Load( file, path, 0 ); IPersistFile_Release( file ); if (FAILED( hr )) { IShellLinkW_Release( link ); return NULL; } return link; }
/****************************************************************************** * FileMoniker_BindToObject */ static HRESULT WINAPI FileMonikerImpl_BindToObject(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult) { FileMonikerImpl *This = impl_from_IMoniker(iface); HRESULT res=E_FAIL; CLSID clsID; IUnknown* pObj=0; IRunningObjectTable *prot=0; IPersistFile *ppf=0; IClassFactory *pcf=0; IClassActivator *pca=0; *ppvResult=0; TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult); if(pmkToLeft==NULL){ res=IBindCtx_GetRunningObjectTable(pbc,&prot); if (SUCCEEDED(res)){ /* if the requested class was loaded before ! we don't need to reload it */ res = IRunningObjectTable_GetObject(prot,iface,&pObj); if (res==S_FALSE){ /* first activation of this class */ res=GetClassFile(This->filePathName,&clsID); if (SUCCEEDED(res)){ res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(res)){ res=IPersistFile_Load(ppf,This->filePathName,STGM_READ); if (SUCCEEDED(res)){ pObj=(IUnknown*)ppf; IUnknown_AddRef(pObj); } } } } } } else{ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassFactory,(void**)&pcf); if (res==E_NOINTERFACE){ res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IClassActivator,(void**)&pca); if (res==E_NOINTERFACE) return MK_E_INTERMEDIATEINTERFACENOTSUPPORTED; } if (pcf!=NULL){ IClassFactory_CreateInstance(pcf,NULL,&IID_IPersistFile,(void**)&ppf); res=IPersistFile_Load(ppf,This->filePathName,STGM_READ); if (SUCCEEDED(res)){ pObj=(IUnknown*)ppf; IUnknown_AddRef(pObj); } } if (pca!=NULL){ FIXME("()\n"); /*res=GetClassFile(This->filePathName,&clsID); if (SUCCEEDED(res)){ res=IClassActivator_GetClassObject(pca,&clsID,CLSCTX_ALL,0,&IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(res)){ pObj=(IUnknown*)ppf; IUnknown_AddRef(pObj); } }*/ } } if (pObj!=NULL){ /* get the requested interface from the loaded class */ res= IUnknown_QueryInterface(pObj,riid,ppvResult); IBindCtx_RegisterObjectBound(pbc,*ppvResult); IUnknown_Release(pObj); } if (prot!=NULL) IRunningObjectTable_Release(prot); if (ppf!=NULL) IPersistFile_Release(ppf); if (pca!=NULL) IClassActivator_Release(pca); if (pcf!=NULL) IClassFactory_Release(pcf); return res; }
static void test_ReadAndWriteProperties(void) { HRESULT hr; IUniformResourceLocatorA *urlA; IUniformResourceLocatorA *urlAFromFile; WCHAR fileNameW[MAX_PATH]; static const WCHAR shortcutW[] = {'t','e','s','t','s','h','o','r','t','c','u','t','.','u','r','l',0}; WCHAR iconPath[] = {'f','i','l','e',':','/','/','/','C',':','/','a','r','b','i','t','r','a','r','y','/','i','c','o','n','/','p','a','t','h',0}; int iconIndex = 7; char testurl[] = "http://some/bogus/url.html"; PROPSPEC ps[2]; ps[0].ulKind = PRSPEC_PROPID; U(ps[0]).propid = PID_IS_ICONFILE; ps[1].ulKind = PRSPEC_PROPID; U(ps[1]).propid = PID_IS_ICONINDEX; /* Make sure we have a valid temporary directory */ GetTempPathW(MAX_PATH, fileNameW); lstrcatW(fileNameW, shortcutW); hr = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_ALL, &IID_IUniformResourceLocatorA, (void**)&urlA); if (hr == S_OK) { IPersistFile *pf; IPropertyStorage *pPropStgWrite; IPropertySetStorage *pPropSetStg; PROPVARIANT pv[2]; /* We need to set a URL -- IPersistFile refuses to save without one. */ hr = urlA->lpVtbl->SetURL(urlA, testurl, 0); ok(hr == S_OK, "Failed to set a URL. hr=0x%x\n", hr); /* Write this shortcut out to a file so that we can test reading it in again. */ hr = urlA->lpVtbl->QueryInterface(urlA, &IID_IPersistFile, (void **) &pf); ok(hr == S_OK, "Failed to get the IPersistFile for writing. hr=0x%x\n", hr); hr = IPersistFile_Save(pf, fileNameW, TRUE); ok(hr == S_OK, "Failed to save via IPersistFile. hr=0x%x\n", hr); IPersistFile_Release(pf); pv[0].vt = VT_LPWSTR; U(pv[0]).pwszVal = (void *) iconPath; pv[1].vt = VT_I4; U(pv[1]).iVal = iconIndex; hr = urlA->lpVtbl->QueryInterface(urlA, &IID_IPropertySetStorage, (void **) &pPropSetStg); ok(hr == S_OK, "Unable to get an IPropertySetStorage, hr=0x%x\n", hr); hr = IPropertySetStorage_Open(pPropSetStg, &FMTID_Intshcut, STGM_READWRITE | STGM_SHARE_EXCLUSIVE, &pPropStgWrite); ok(hr == S_OK, "Unable to get an IPropertyStorage for writing, hr=0x%x\n", hr); hr = IPropertyStorage_WriteMultiple(pPropStgWrite, 2, ps, pv, 0); ok(hr == S_OK, "Unable to set properties, hr=0x%x\n", hr); hr = IPropertyStorage_Commit(pPropStgWrite, STGC_DEFAULT); ok(hr == S_OK, "Failed to commit properties, hr=0x%x\n", hr); pPropStgWrite->lpVtbl->Release(pPropStgWrite); urlA->lpVtbl->Release(urlA); IPropertySetStorage_Release(pPropSetStg); } else skip("could not create a CLSID_InternetShortcut for property tests, hr=0x%x\n", hr); hr = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_ALL, &IID_IUniformResourceLocatorA, (void**)&urlAFromFile); if (hr == S_OK) { IPropertySetStorage *pPropSetStg; IPropertyStorage *pPropStgRead; PROPVARIANT pvread[2]; IPersistFile *pf; LPSTR url = NULL; /* Now read that .url file back in. */ hr = urlAFromFile->lpVtbl->QueryInterface(urlAFromFile, &IID_IPersistFile, (void **) &pf); ok(hr == S_OK, "Failed to get the IPersistFile for reading. hr=0x%x\n", hr); hr = IPersistFile_Load(pf, fileNameW, 0); ok(hr == S_OK, "Failed to load via IPersistFile. hr=0x%x\n", hr); IPersistFile_Release(pf); hr = urlAFromFile->lpVtbl->GetURL(urlAFromFile, &url); ok(hr == S_OK, "Unable to get url from file, hr=0x%x\n", hr); ok(lstrcmp(url, testurl) == 0, "Wrong url read from file: %s\n",url); hr = urlAFromFile->lpVtbl->QueryInterface(urlAFromFile, &IID_IPropertySetStorage, (void **) &pPropSetStg); ok(hr == S_OK, "Unable to get an IPropertySetStorage, hr=0x%x\n", hr); hr = IPropertySetStorage_Open(pPropSetStg, &FMTID_Intshcut, STGM_READ | STGM_SHARE_EXCLUSIVE, &pPropStgRead); ok(hr == S_OK, "Unable to get an IPropertyStorage for reading, hr=0x%x\n", hr); hr = IPropertyStorage_ReadMultiple(pPropStgRead, 2, ps, pvread); ok(hr == S_OK, "Unable to read properties, hr=0x%x\n", hr); todo_wine /* Wine doesn't yet support setting properties after save */ { ok(U(pvread[1]).iVal == iconIndex, "Read wrong icon index: %d\n", U(pvread[1]).iVal); ok(lstrcmpW(U(pvread[0]).pwszVal, iconPath) == 0, "Wrong icon path read: %s\n", wine_dbgstr_w(U(pvread[0]).pwszVal)); } PropVariantClear(&pvread[0]); PropVariantClear(&pvread[1]); IPropertyStorage_Release(pPropStgRead); IPropertySetStorage_Release(pPropSetStg); urlAFromFile->lpVtbl->Release(urlAFromFile); DeleteFileW(fileNameW); }