Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhlink_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
1.7.6.1
|