windows-nt/Source/XPSP1/NT/enduser/stuff/hhctrl/darwin.cpp
2020-09-26 16:20:57 +08:00

90 lines
2.4 KiB
C++

// Copyright (C) 1997-1998 Microsoft Corporation. All rights reserved.
#include "header.h"
#include <msi.h>
extern HMODULE g_hmodMSI; // msi.dll module handle
static const char txtMsiProvideQualifiedComponent[] = "MsiProvideQualifiedComponentA";
static const char txtMsiDll[] = "Msi.dll";
UINT (WINAPI *pMsiProvideQualifiedComponent)(LPCSTR szCategory, LPCSTR szQualifier, DWORD dwInstallMode, LPSTR lpPathBuf, DWORD *pcchPathBuf);
/***************************************************************************
FUNCTION: FindDarwinURL
PURPOSE: Given a GUID and CHM filename, find the full path to the
CHM file using Darwin.
PARAMETERS:
pszGUID
pszChmFile
cszResult
RETURNS:
COMMENTS:
MODIFICATION DATES:
01-Dec-1997 [ralphw]
***************************************************************************/
BOOL FindDarwinURL(PCSTR pszGUID, PCSTR pszChmFile, CStr* pcszResult)
{
if (!pMsiProvideQualifiedComponent) {
if (!g_hmodMSI) {
g_hmodMSI = LoadLibrary(txtMsiDll);
ASSERT_COMMENT(g_hmodMSI, "Cannot load msi.dll");
if (!g_hmodMSI)
return FALSE;
}
(FARPROC&) pMsiProvideQualifiedComponent = GetProcAddress(g_hmodMSI,
txtMsiProvideQualifiedComponent);
ASSERT_COMMENT(pMsiProvideQualifiedComponent, "Cannot find the MsiProvideQualifiedComponent in msi.dll");
if (!pMsiProvideQualifiedComponent)
return FALSE;
}
char szPath[MAX_PATH];
DWORD cb = sizeof(szPath);
// Office passes in the LCID on the end of the GUID. Ick. Parse out the LCID.
CStr szGUID(pszGUID) ;
CStr szLCID;
// Check last character for the ending bracket.
int len = szGUID.strlen() ;
if (szGUID.psz[len-1] != '}')
{
// No bracket. Assume we have a LCID.
char* pLcid = strchr(szGUID.psz, '}') ;
if (pLcid)
{
// Copy the LCID.
pLcid++ ;
szLCID = pLcid;
// Remove from the guid.
*pLcid = '\0' ;
}
}
else
{
ASSERT(0) ;
return FALSE ;
}
// Prepend the LCID to the CHM file name.
CStr szQualifier ;
szQualifier = szLCID.psz ;
szQualifier += "\\" ;
szQualifier += pszChmFile ;
// Ask for the file.
if (pMsiProvideQualifiedComponent(szGUID, szQualifier/*pszChmFile*/, INSTALLMODE_EXISTING,
szPath, &cb) != ERROR_SUCCESS)
return FALSE;
*pcszResult = szPath;
return TRUE;
}