ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

hlink_main.c
Go to the documentation of this file.
00001 /*
00002  * Implementation of hyperlinking (hlink.dll)
00003  *
00004  * Copyright 2005 Aric Stewart for CodeWeavers
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU Lesser General Public
00008  * License as published by the Free Software Foundation; either
00009  * version 2.1 of the License, or (at your option) any later version.
00010  *
00011  * This library is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * Lesser General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU Lesser General Public
00017  * License along with this library; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00019  */
00020 
00021 #include "hlink_private.h"
00022 
00023 #include "winreg.h"
00024 #include "rpcproxy.h"
00025 #include "hlguids.h"
00026 
00027 #include "wine/debug.h"
00028 
00029 WINE_DEFAULT_DEBUG_CHANNEL(hlink);
00030 
00031 static HINSTANCE instance;
00032 
00033 typedef HRESULT (*LPFNCREATEINSTANCE)(IUnknown*, REFIID, LPVOID*);
00034 
00035 typedef struct
00036 {
00037     IClassFactory      IClassFactory_iface;
00038     LPFNCREATEINSTANCE lpfnCI;
00039 } CFImpl;
00040 
00041 static inline CFImpl *impl_from_IClassFactory(IClassFactory *iface)
00042 {
00043     return CONTAINING_RECORD(iface, CFImpl, IClassFactory_iface);
00044 }
00045 
00046 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
00047 {
00048     TRACE("%p %d %p\n", hinstDLL, fdwReason, lpvReserved);
00049 
00050     switch (fdwReason)
00051     {
00052     case DLL_PROCESS_ATTACH:
00053         instance = hinstDLL;
00054         DisableThreadLibraryCalls(hinstDLL);
00055         break;
00056     case DLL_PROCESS_DETACH:
00057         break;
00058     }
00059     return TRUE;
00060 }
00061 
00062 /***********************************************************************
00063  *             DllCanUnloadNow (HLINK.@)
00064  */
00065 HRESULT WINAPI DllCanUnloadNow( void )
00066 {
00067     return S_OK;
00068 }
00069 
00070 /***********************************************************************
00071  *             HlinkCreateFromMoniker (HLINK.@)
00072  */
00073 HRESULT WINAPI HlinkCreateFromMoniker( IMoniker *pimkTrgt, LPCWSTR pwzLocation,
00074         LPCWSTR pwzFriendlyName, IHlinkSite* pihlsite, DWORD dwSiteData,
00075         IUnknown* piunkOuter, REFIID riid, void** ppvObj)
00076 {
00077     IHlink *hl = NULL;
00078     HRESULT r = S_OK;
00079 
00080     TRACE("%p %s %s %p %i %p %s %p\n", pimkTrgt, debugstr_w(pwzLocation),
00081             debugstr_w(pwzFriendlyName), pihlsite, dwSiteData, piunkOuter,
00082             debugstr_guid(riid), ppvObj);
00083 
00084     r = CoCreateInstance(&CLSID_StdHlink, piunkOuter, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&hl);
00085     if (FAILED(r))
00086         return r;
00087 
00088     IHlink_SetMonikerReference(hl, HLINKSETF_LOCATION | HLINKSETF_TARGET, pimkTrgt, pwzLocation);
00089 
00090     if (pwzFriendlyName)
00091         IHlink_SetFriendlyName(hl, pwzFriendlyName);
00092     if (pihlsite)
00093         IHlink_SetHlinkSite(hl, pihlsite, dwSiteData);
00094 
00095     *ppvObj = hl;
00096 
00097     TRACE("Returning %i\n",r);
00098 
00099     return r;
00100 }
00101 
00102 /***********************************************************************
00103  *             HlinkCreateFromString (HLINK.@)
00104  */
00105 HRESULT WINAPI HlinkCreateFromString( LPCWSTR pwzTarget, LPCWSTR pwzLocation,
00106         LPCWSTR pwzFriendlyName, IHlinkSite* pihlsite, DWORD dwSiteData,
00107         IUnknown* piunkOuter, REFIID riid, void** ppvObj)
00108 {
00109     IHlink *hl = NULL;
00110     HRESULT r = S_OK;
00111     WCHAR *hash, *tgt;
00112     const WCHAR *loc;
00113 
00114     TRACE("%s %s %s %p %i %p %s %p\n", debugstr_w(pwzTarget),
00115             debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), pihlsite,
00116             dwSiteData, piunkOuter, debugstr_guid(riid), ppvObj);
00117 
00118     r = CoCreateInstance(&CLSID_StdHlink, piunkOuter, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&hl);
00119     if (FAILED(r))
00120         return r;
00121 
00122     if (pwzTarget)
00123     {
00124         hash = strchrW(pwzTarget, '#');
00125         if (hash)
00126         {
00127             if (hash == pwzTarget)
00128                 tgt = NULL;
00129             else
00130             {
00131                 int tgt_len = hash - pwzTarget;
00132                 tgt = heap_alloc((tgt_len + 1) * sizeof(WCHAR));
00133                 if (!tgt)
00134                     return E_OUTOFMEMORY;
00135                 memcpy(tgt, pwzTarget, tgt_len * sizeof(WCHAR));
00136                 tgt[tgt_len] = 0;
00137             }
00138             if (!pwzLocation)
00139                 loc = hash + 1;
00140             else
00141                 loc = pwzLocation;
00142         }
00143         else
00144         {
00145             tgt = hlink_strdupW(pwzTarget);
00146             if (!tgt)
00147                 return E_OUTOFMEMORY;
00148             loc = pwzLocation;
00149         }
00150     }
00151     else
00152     {
00153         tgt = NULL;
00154         loc = pwzLocation;
00155     }
00156 
00157     IHlink_SetStringReference(hl, HLINKSETF_TARGET | HLINKSETF_LOCATION, tgt, loc);
00158 
00159     heap_free(tgt);
00160 
00161     if (pwzFriendlyName)
00162         IHlink_SetFriendlyName(hl, pwzFriendlyName);
00163 
00164     if (pihlsite)
00165         IHlink_SetHlinkSite(hl, pihlsite, dwSiteData);
00166 
00167     TRACE("Returning %i\n",r);
00168     *ppvObj = hl;
00169 
00170     return r;
00171 }
00172 
00173 
00174 /***********************************************************************
00175  *             HlinkCreateBrowseContext (HLINK.@)
00176  */
00177 HRESULT WINAPI HlinkCreateBrowseContext( IUnknown* piunkOuter, REFIID riid, void** ppvObj)
00178 {
00179     HRESULT r = S_OK;
00180 
00181     TRACE("%p %s %p\n", piunkOuter, debugstr_guid(riid), ppvObj);
00182 
00183     r = CoCreateInstance(&CLSID_StdHlinkBrowseContext, piunkOuter, CLSCTX_INPROC_SERVER, riid, ppvObj);
00184 
00185     TRACE("returning %i\n",r);
00186 
00187     return r;
00188 }
00189 
00190 /***********************************************************************
00191  *             HlinkNavigate (HLINK.@)
00192  */
00193 HRESULT WINAPI HlinkNavigate(IHlink *phl, IHlinkFrame *phlFrame,
00194         DWORD grfHLNF, LPBC pbc, IBindStatusCallback *pbsc,
00195         IHlinkBrowseContext *phlbc)
00196 {
00197     HRESULT r = S_OK;
00198 
00199     TRACE("%p %p %i %p %p %p\n", phl, phlFrame, grfHLNF, pbc, pbsc, phlbc);
00200 
00201     if (phlFrame)
00202         r = IHlinkFrame_Navigate(phlFrame, grfHLNF, pbc, pbsc, phl);
00203     else if (phl)
00204         r = IHlink_Navigate(phl, grfHLNF, pbc, pbsc, phlbc);
00205 
00206     return r;
00207 }
00208 
00209 /***********************************************************************
00210  *             HlinkOnNavigate (HLINK.@)
00211  */
00212 HRESULT WINAPI HlinkOnNavigate( IHlinkFrame *phlFrame,
00213         IHlinkBrowseContext* phlbc, DWORD grfHLNF, IMoniker *pmkTarget,
00214         LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, ULONG* puHLID)
00215 {
00216     HRESULT r = S_OK;
00217 
00218     TRACE("%p %p %i %p %s %s %p\n",phlFrame, phlbc, grfHLNF, pmkTarget,
00219             debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), puHLID);
00220 
00221     r = IHlinkBrowseContext_OnNavigateHlink(phlbc, grfHLNF, pmkTarget,
00222             pwzLocation, pwzFriendlyName, puHLID);
00223 
00224     if (phlFrame)
00225         r = IHlinkFrame_OnNavigate(phlFrame,grfHLNF,pmkTarget, pwzLocation,
00226                 pwzFriendlyName, 0);
00227 
00228     return r;
00229 }
00230 
00231 /***********************************************************************
00232  *             HlinkCreateFromData (HLINK.@)
00233  */
00234 HRESULT WINAPI HlinkCreateFromData(IDataObject *piDataObj,
00235         IHlinkSite *pihlsite, DWORD dwSiteData, IUnknown *piunkOuter,
00236         REFIID riid, void **ppvObj)
00237 {
00238     FIXME("%p %p %d %p %p %p\n",
00239           piDataObj, pihlsite, dwSiteData, piunkOuter, riid, ppvObj);
00240     *ppvObj = NULL;
00241     return E_NOTIMPL;
00242 }
00243 
00244 /***********************************************************************
00245  *             HlinkQueryCreateFromData (HLINK.@)
00246  */
00247 HRESULT WINAPI HlinkQueryCreateFromData(IDataObject* piDataObj)
00248 {
00249     FIXME("%p\n", piDataObj);
00250     return E_NOTIMPL;
00251 }
00252 
00253 /***********************************************************************
00254  *             HlinkNavigateToStringReference (HLINK.@)
00255  */
00256 HRESULT WINAPI HlinkNavigateToStringReference( LPCWSTR pwzTarget,
00257         LPCWSTR pwzLocation, IHlinkSite *pihlsite, DWORD dwSiteData,
00258         IHlinkFrame *pihlframe, DWORD grfHLNF, LPBC pibc,
00259         IBindStatusCallback *pibsc, IHlinkBrowseContext *pihlbc)
00260 {
00261     HRESULT r;
00262     IHlink *hlink = NULL;
00263 
00264     TRACE("%s %s %p %08x %p %08x %p %p %p\n",
00265           debugstr_w(pwzTarget), debugstr_w(pwzLocation), pihlsite,
00266           dwSiteData, pihlframe, grfHLNF, pibc, pibsc, pihlbc);
00267 
00268     r = HlinkCreateFromString( pwzTarget, pwzLocation, NULL, pihlsite,
00269                                dwSiteData, NULL, &IID_IHlink, (LPVOID*) &hlink );
00270     if (SUCCEEDED(r)) {
00271         r = HlinkNavigate(hlink, pihlframe, grfHLNF, pibc, pibsc, pihlbc);
00272         IHlink_Release(hlink);
00273     }
00274 
00275     return r;
00276 }
00277 
00278 /***********************************************************************
00279  *             HlinkIsShortcut (HLINK.@)
00280  */
00281 HRESULT WINAPI HlinkIsShortcut(LPCWSTR pwzFileName)
00282 {
00283     int len;
00284 
00285     static const WCHAR url_ext[] = {'.','u','r','l',0};
00286 
00287     TRACE("(%s)\n", debugstr_w(pwzFileName));
00288 
00289     if(!pwzFileName)
00290         return E_INVALIDARG;
00291 
00292     len = strlenW(pwzFileName)-4;
00293     if(len < 0)
00294         return S_FALSE;
00295 
00296     return strcmpiW(pwzFileName+len, url_ext) ? S_FALSE : S_OK;
00297 }
00298 
00299 /***********************************************************************
00300  *             HlinkGetSpecialReference (HLINK.@)
00301  */
00302 HRESULT WINAPI HlinkGetSpecialReference(ULONG uReference, LPWSTR *ppwzReference)
00303 {
00304     DWORD res, type, size = 100;
00305     LPCWSTR value_name;
00306     WCHAR *buf;
00307     HKEY hkey;
00308 
00309     static const WCHAR start_pageW[] = {'S','t','a','r','t',' ','P','a','g','e',0};
00310     static const WCHAR search_pageW[] = {'S','e','a','r','c','h',' ','P','a','g','e',0};
00311 
00312     static const WCHAR ie_main_keyW[] =
00313         {'S','o','f','t','w','a','r','e',
00314          '\\','M','i','c','r','o','s','o','f','t','\\',
00315          'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r',
00316          '\\','M','a','i','n',0};
00317 
00318     TRACE("(%u %p)\n", uReference, ppwzReference);
00319 
00320     *ppwzReference = NULL;
00321 
00322     switch(uReference) {
00323     case HLSR_HOME:
00324         value_name = start_pageW;
00325         break;
00326     case HLSR_SEARCHPAGE:
00327         value_name = search_pageW;
00328         break;
00329     case HLSR_HISTORYFOLDER:
00330         return E_NOTIMPL;
00331     default:
00332         return E_INVALIDARG;
00333     }
00334 
00335     res = RegOpenKeyW(HKEY_CURRENT_USER, ie_main_keyW, &hkey);
00336     if(res != ERROR_SUCCESS) {
00337         WARN("Could not open key: %u\n", res);
00338         return HRESULT_FROM_WIN32(res);
00339     }
00340 
00341     buf = CoTaskMemAlloc(size);
00342     res = RegQueryValueExW(hkey, value_name, NULL, &type, (PBYTE)buf, &size);
00343     buf = CoTaskMemRealloc(buf, size);
00344     if(res == ERROR_MORE_DATA)
00345         res = RegQueryValueExW(hkey, value_name, NULL, &type, (PBYTE)buf, &size);
00346     RegCloseKey(hkey);
00347     if(res != ERROR_SUCCESS) {
00348         WARN("Could not query value %s: %u\n", debugstr_w(value_name), res);
00349         CoTaskMemFree(buf);
00350         return HRESULT_FROM_WIN32(res);
00351     }
00352 
00353     *ppwzReference = buf;
00354     return S_OK;
00355 }
00356 
00357 /***********************************************************************
00358  *             HlinkTranslateURL (HLINK.@)
00359  */
00360 HRESULT WINAPI HlinkTranslateURL(LPCWSTR pwzURL, DWORD grfFlags, LPWSTR *ppwzTranslatedURL)
00361 {
00362     FIXME("(%s %08x %p)\n", debugstr_w(pwzURL), grfFlags, ppwzTranslatedURL);
00363     return E_NOTIMPL;
00364 }
00365 
00366 /***********************************************************************
00367  *             HlinkUpdateStackItem (HLINK.@)
00368  */
00369 HRESULT WINAPI HlinkUpdateStackItem(IHlinkFrame *pihlframe, IHlinkBrowseContext *pihlbc,
00370         ULONG uHLID, IMoniker *pimkTrgt, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
00371 {
00372     FIXME("(%p %p %u %p %s %s)\n", pihlframe, pihlbc, uHLID, pimkTrgt, debugstr_w(pwzLocation),
00373           debugstr_w(pwzFriendlyName));
00374     return E_NOTIMPL;
00375 }
00376 
00377 /***********************************************************************
00378  *             HlinkParseDisplayName (HLINK.@)
00379  */
00380 HRESULT WINAPI HlinkParseDisplayName(LPBC pibc, LPCWSTR pwzDisplayName, BOOL fNoForceAbs,
00381         ULONG *pcchEaten, IMoniker **ppimk)
00382 {
00383     HRESULT hres;
00384 
00385     TRACE("(%p %s %x %p %p)\n", pibc, debugstr_w(pwzDisplayName), fNoForceAbs, pcchEaten, ppimk);
00386 
00387     if(fNoForceAbs)
00388         FIXME("Unsupported fNoForceAbs\n");
00389 
00390     hres = MkParseDisplayNameEx(pibc, pwzDisplayName, pcchEaten, ppimk);
00391     if(SUCCEEDED(hres))
00392         return hres;
00393 
00394     hres = MkParseDisplayName(pibc, pwzDisplayName, pcchEaten, ppimk);
00395     if(SUCCEEDED(hres))
00396         return hres;
00397 
00398     hres = CreateFileMoniker(pwzDisplayName, ppimk);
00399     if(SUCCEEDED(hres))
00400         *pcchEaten = strlenW(pwzDisplayName);
00401 
00402     return hres;
00403 }
00404 
00405 /***********************************************************************
00406  *             HlinkResolveMonikerForData (HLINK.@)
00407  */
00408 HRESULT WINAPI HlinkResolveMonikerForData(LPMONIKER pimkReference, DWORD reserved, LPBC pibc,
00409         ULONG cFmtetc, FORMATETC *rgFmtetc, IBindStatusCallback *pibsc, LPMONIKER pimkBase)
00410 {
00411     LPOLESTR name = NULL;
00412     IBindCtx *bctx;
00413     DWORD mksys = 0;
00414     void *obj = NULL;
00415     HRESULT hres;
00416 
00417     TRACE("(%p %x %p %d %p %p %p)\n", pimkReference, reserved, pibc, cFmtetc, rgFmtetc, pibsc, pimkBase);
00418 
00419     if(cFmtetc || rgFmtetc || pimkBase)
00420         FIXME("Unsupported args\n");
00421 
00422     hres = RegisterBindStatusCallback(pibc, pibsc, NULL /* FIXME */, 0);
00423     if(FAILED(hres))
00424         return hres;
00425 
00426     hres = IMoniker_IsSystemMoniker(pimkReference, &mksys);
00427     if(SUCCEEDED(hres) && mksys != MKSYS_URLMONIKER)
00428         WARN("sysmk = %x\n", mksys);
00429 
00430     /* FIXME: What is it for? */
00431     CreateBindCtx(0, &bctx);
00432     hres = IMoniker_GetDisplayName(pimkReference, bctx, NULL, &name);
00433     IBindCtx_Release(bctx);
00434     if(SUCCEEDED(hres)) {
00435         TRACE("got display name %s\n", debugstr_w(name));
00436         CoTaskMemFree(name);
00437     }
00438 
00439     return IMoniker_BindToStorage(pimkReference, pibc, NULL, &IID_IUnknown, &obj);
00440 }
00441 
00442 /***********************************************************************
00443  *             HlinkClone (HLINK.@)
00444  */
00445 HRESULT WINAPI HlinkClone(IHlink *hlink, REFIID riid, IHlinkSite *hls,
00446         DWORD site_data, void **obj)
00447 {
00448     IMoniker *mk, *clone_mk = NULL;
00449     WCHAR *loc, *name = NULL;
00450     HRESULT hres;
00451 
00452     if(!hlink || !riid || !obj)
00453         return E_INVALIDARG;
00454 
00455     *obj = NULL;
00456 
00457     hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &mk, &loc);
00458     if(FAILED(hres))
00459         return hres;
00460 
00461     if(mk) {
00462         IStream *strm;
00463         LARGE_INTEGER lgint;
00464 
00465         hres = CreateStreamOnHGlobal(NULL, TRUE, &strm);
00466         if(FAILED(hres)) {
00467             IMoniker_Release(mk);
00468             goto cleanup;
00469         }
00470 
00471         hres = OleSaveToStream((IPersistStream*)mk, strm);
00472         if(FAILED(hres)) {
00473             IStream_Release(strm);
00474             IMoniker_Release(mk);
00475             goto cleanup;
00476         }
00477         IMoniker_Release(mk);
00478 
00479         lgint.QuadPart = 0;
00480         hres = IStream_Seek(strm, lgint, STREAM_SEEK_SET, NULL);
00481         if(FAILED(hres)) {
00482             IStream_Release(strm);
00483             goto cleanup;
00484         }
00485 
00486         hres = OleLoadFromStream(strm, &IID_IMoniker, (void**)&clone_mk);
00487         IStream_Release(strm);
00488         if(FAILED(hres))
00489             goto cleanup;
00490     }
00491 
00492     hres = IHlink_GetFriendlyName(hlink, HLFNAMEF_DEFAULT, &name);
00493     if(FAILED(hres))
00494         goto cleanup;
00495 
00496     hres = HlinkCreateFromMoniker(clone_mk, loc, name, hls, site_data, NULL,
00497             &IID_IHlink, obj);
00498 
00499 cleanup:
00500     if(clone_mk)
00501         IMoniker_Release(clone_mk);
00502     CoTaskMemFree(loc);
00503     CoTaskMemFree(name);
00504     return hres;
00505 }
00506 
00507 static HRESULT WINAPI HLinkCF_fnQueryInterface ( LPCLASSFACTORY iface,
00508         REFIID riid, LPVOID *ppvObj)
00509 {
00510     CFImpl *This = impl_from_IClassFactory(iface);
00511 
00512     TRACE("(%p)->(%s)\n",This,debugstr_guid(riid));
00513 
00514     *ppvObj = NULL;
00515 
00516     if (IsEqualIID(riid, &IID_IUnknown) ||
00517         IsEqualIID(riid, &IID_IClassFactory))
00518     {
00519         *ppvObj = This;
00520         return S_OK;
00521     }
00522 
00523     TRACE("-- E_NOINTERFACE\n");
00524     return E_NOINTERFACE;
00525 }
00526 
00527 static ULONG WINAPI HLinkCF_fnAddRef (LPCLASSFACTORY iface)
00528 {
00529     return 2;
00530 }
00531 
00532 static ULONG WINAPI HLinkCF_fnRelease(LPCLASSFACTORY iface)
00533 {
00534     return 1;
00535 }
00536 
00537 static HRESULT WINAPI HLinkCF_fnCreateInstance( LPCLASSFACTORY iface,
00538         LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject)
00539 {
00540     CFImpl *This = impl_from_IClassFactory(iface);
00541 
00542     TRACE("%p->(%p,%s,%p)\n", This, pUnkOuter, debugstr_guid(riid), ppvObject);
00543 
00544     *ppvObject = NULL;
00545 
00546     return This->lpfnCI(pUnkOuter, riid, ppvObject);
00547 }
00548 
00549 static HRESULT WINAPI HLinkCF_fnLockServer(LPCLASSFACTORY iface, BOOL fLock)
00550 {
00551     FIXME("%p %d\n", iface, fLock);
00552     return E_NOTIMPL;
00553 }
00554 
00555 static const IClassFactoryVtbl hlcfvt =
00556 {
00557     HLinkCF_fnQueryInterface,
00558     HLinkCF_fnAddRef,
00559     HLinkCF_fnRelease,
00560     HLinkCF_fnCreateInstance,
00561     HLinkCF_fnLockServer
00562 };
00563 
00564 static CFImpl HLink_cf = { { &hlcfvt }, HLink_Constructor };
00565 static CFImpl HLinkBrowseContext_cf = { { &hlcfvt }, HLinkBrowseContext_Constructor };
00566 
00567 /***********************************************************************
00568  *             DllGetClassObject (HLINK.@)
00569  */
00570 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
00571 {
00572     IClassFactory   *pcf = NULL;
00573 
00574     TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv);
00575 
00576     if (!ppv)
00577         return E_INVALIDARG;
00578     *ppv = NULL;
00579 
00580     if (IsEqualIID(rclsid, &CLSID_StdHlink))
00581         pcf = &HLink_cf.IClassFactory_iface;
00582     else if (IsEqualIID(rclsid, &CLSID_StdHlinkBrowseContext))
00583         pcf = &HLinkBrowseContext_cf.IClassFactory_iface;
00584     else
00585         return CLASS_E_CLASSNOTAVAILABLE;
00586 
00587     return IClassFactory_QueryInterface(pcf, iid, ppv);
00588 }
00589 
00590 /***********************************************************************
00591  *      DllRegisterServer (HLINK.@)
00592  */
00593 HRESULT WINAPI DllRegisterServer(void)
00594 {
00595     return __wine_register_resources( instance );
00596 }
00597 
00598 /***********************************************************************
00599  *      DllUnregisterServer (HLINK.@)
00600  */
00601 HRESULT WINAPI DllUnregisterServer(void)
00602 {
00603     return __wine_unregister_resources( instance );
00604 }

Generated on Fri May 25 2012 04:22:03 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.