windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkitrust/trustui/util.cpp
2020-09-26 16:20:57 +08:00

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);
}