144 lines
3.6 KiB
C++
144 lines
3.6 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows NT Security
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1999
|
||
|
//
|
||
|
// File: util.cpp
|
||
|
//
|
||
|
// Contents: Miscellaneous utility functions
|
||
|
//
|
||
|
// History: 12-May-97 kirtd Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#include <stdpch.h>
|
||
|
|
||
|
#include <urlmon.h>
|
||
|
#include <hlink.h>
|
||
|
|
||
|
#include "unicode.h"
|
||
|
|
||
|
//
|
||
|
// The following are stolen from SOFTPUB
|
||
|
//
|
||
|
void TUIGoLink(HWND hwndParent, WCHAR *pszWhere)
|
||
|
{
|
||
|
HCURSOR hcursPrev;
|
||
|
HMODULE hURLMon;
|
||
|
|
||
|
|
||
|
//
|
||
|
// since we're a model dialog box, we want to go behind IE once it comes up!!!
|
||
|
//
|
||
|
SetWindowPos(hwndParent, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
|
||
|
|
||
|
hcursPrev = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
||
|
|
||
|
hURLMon = (HMODULE)LoadLibraryU(L"urlmon.dll");
|
||
|
|
||
|
if (!(hURLMon))
|
||
|
{
|
||
|
//
|
||
|
// The hyperlink module is unavailable, go to fallback plan
|
||
|
//
|
||
|
//
|
||
|
// This works in test cases, but causes deadlock problems when used from withing
|
||
|
// the Internet Explorer itself. The dialog box is up (that is, IE is in a modal
|
||
|
// dialog loop) and in comes this DDE request...).
|
||
|
//
|
||
|
DWORD cb;
|
||
|
LPSTR psz;
|
||
|
|
||
|
cb = WideCharToMultiByte(
|
||
|
0,
|
||
|
0,
|
||
|
pszWhere,
|
||
|
-1,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
if (NULL == (psz = new char[cb]))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
WideCharToMultiByte(
|
||
|
0,
|
||
|
0,
|
||
|
pszWhere,
|
||
|
-1,
|
||
|
psz,
|
||
|
cb,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
ShellExecute(hwndParent, "open", psz, NULL, NULL, SW_SHOWNORMAL);
|
||
|
|
||
|
delete[] psz;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// The hyperlink module is there. Use it
|
||
|
//
|
||
|
if (SUCCEEDED(CoInitialize(NULL))) // Init OLE if no one else has
|
||
|
{
|
||
|
//
|
||
|
// allow com to fully init...
|
||
|
//
|
||
|
MSG msg;
|
||
|
|
||
|
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); // peek but not remove
|
||
|
|
||
|
typedef void (WINAPI *pfnHlinkSimpleNavigateToString)(LPCWSTR, LPCWSTR, LPCWSTR, IUnknown *,
|
||
|
IBindCtx *, IBindStatusCallback *,
|
||
|
DWORD, DWORD);
|
||
|
|
||
|
pfnHlinkSimpleNavigateToString pProcAddr;
|
||
|
|
||
|
pProcAddr = (pfnHlinkSimpleNavigateToString)GetProcAddress(hURLMon, TEXT("HlinkSimpleNavigateToString"));
|
||
|
|
||
|
if (pProcAddr)
|
||
|
{
|
||
|
IBindCtx *pbc;
|
||
|
|
||
|
pbc = NULL;
|
||
|
|
||
|
CreateBindCtx( 0, &pbc );
|
||
|
|
||
|
(*pProcAddr)(pszWhere, NULL, NULL, NULL, pbc, NULL, HLNF_OPENINNEWWINDOW, NULL);
|
||
|
|
||
|
if (pbc)
|
||
|
{
|
||
|
pbc->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CoUninitialize();
|
||
|
}
|
||
|
|
||
|
FreeLibrary(hURLMon);
|
||
|
}
|
||
|
|
||
|
SetCursor(hcursPrev);
|
||
|
}
|
||
|
|
||
|
WCHAR *GetGoLink(SPC_LINK *psLink)
|
||
|
{
|
||
|
if (!(psLink))
|
||
|
{
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
switch (psLink->dwLinkChoice)
|
||
|
{
|
||
|
case SPC_URL_LINK_CHOICE: return(psLink->pwszUrl);
|
||
|
case SPC_FILE_LINK_CHOICE: return(psLink->pwszFile);
|
||
|
case SPC_MONIKER_LINK_CHOICE: return(NULL); // TBDTBD!!!
|
||
|
}
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
|