595 lines
14 KiB
C++
595 lines
14 KiB
C++
//
|
|
// Author: DebiM
|
|
// Date: March 97. Revised for Beta2 in Nov 97.
|
|
// File: csdrtgc.cxx
|
|
//
|
|
// Class Store DRTs
|
|
//
|
|
// This source file contains DRTs for Class Store App Access
|
|
// CClassAccess::IClassAccess
|
|
//
|
|
//
|
|
// It tests the following Class Store functionality
|
|
//
|
|
// GetAppInfo()
|
|
// CsEnumApps()
|
|
//
|
|
//
|
|
//
|
|
//---------------------------------------------------------------------
|
|
|
|
#include "csdrt.hxx"
|
|
extern BOOL fVerbose;
|
|
extern BOOL fMultiStore;
|
|
extern IClassAccess *pIClassAccess;
|
|
|
|
extern GUID TestClsid1, TestClsid2, TestClsid3, TestClsid4, TestClsid5;
|
|
extern Sname TestPackName4, TestFileExt1, TestFileExt4, TestMimeType2;
|
|
extern Sname TestOtherProgID2, TestProgId1, TestProgId3;
|
|
extern WCHAR szLookupPackageName [];
|
|
|
|
extern BOOL fClassInfoVerify;
|
|
|
|
|
|
//
|
|
// Routines to verify that the App Package returned is as expected.
|
|
//
|
|
HRESULT AssertPackage(INSTALLINFO *pInstallInfo)
|
|
{
|
|
// Code Path should be present
|
|
VerifyPackage (pInstallInfo->pszScriptPath != NULL, L"Script Path Missing");
|
|
// Script should be present
|
|
#if 0
|
|
VerifyPackage (pInstallInfo->cScriptLen != 0, L"Script Missing");
|
|
for (UINT i=0; i < pInstallInfo->cScriptLen; i++)
|
|
{
|
|
VerifyPackage (pInstallInfo->pScript[i] == i%128, L"Script Content Wrong");
|
|
}
|
|
#endif
|
|
|
|
// ReleaseInstallInfo(pInstallInfo);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void ReleaseObj(PACKAGEDISPINFO obj)
|
|
{
|
|
ReleasePackageInfo(&obj);
|
|
}
|
|
|
|
void VerbosePrintObj(PACKAGEDISPINFO obj)
|
|
{
|
|
}
|
|
|
|
|
|
//
|
|
// Routine to call GetAppInfo() with different class spec.
|
|
//
|
|
HRESULT CallClassSpecInfo (uCLSSPEC *pclsspec,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
QUERYCONTEXT QryContext;
|
|
HRESULT hr;
|
|
|
|
QryContext.dwContext = CLSCTX_INPROC_SERVER + CLSCTX_LOCAL_SERVER;
|
|
QryContext.Locale = GetThreadLocale();
|
|
GetDefaultPlatform(&QryContext.Platform);
|
|
QryContext.dwVersionHi = 0;
|
|
QryContext.dwVersionLo = 0;
|
|
|
|
hr = pIClassAccess->GetAppInfo(
|
|
pclsspec,
|
|
&QryContext,
|
|
pInstallInfo);
|
|
|
|
if (!SUCCEEDED(hr))
|
|
return hr;
|
|
|
|
PrintInstallInfo(pInstallInfo);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//
|
|
// This routine calls GetAppInfo() for a FileExtension
|
|
//
|
|
|
|
HRESULT LookupByFileext (LPOLESTR pExt,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_FILEEXT;
|
|
clsspec.tagged_union.pFileExt = pExt;
|
|
|
|
hr = CallClassSpecInfo(&clsspec, pInstallInfo);
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (EXT=%S) returned 0x%x\n", pExt, hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// This routine calls GetAppInfo() for a Clsid
|
|
//
|
|
|
|
HRESULT LookupByClsid (GUID Clsid,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_CLSID;
|
|
memcpy(&clsspec.tagged_union.clsid, &Clsid, sizeof(GUID));
|
|
|
|
hr = CallClassSpecInfo(&clsspec, pInstallInfo);
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (CLSID=) returned 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// This routine calls GetAppInfo() for a MimeType
|
|
//
|
|
HRESULT LookupByMimeType (LPOLESTR pMimeType,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_MIMETYPE;
|
|
clsspec.tagged_union.pMimeType = pMimeType;
|
|
|
|
hr = CallClassSpecInfo(&clsspec, pInstallInfo);
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (MimeType=%S) returned 0x%x\n", pMimeType, hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// This routine calls GetAppInfo() for a Progid
|
|
//
|
|
HRESULT LookupByProgid (LPOLESTR pProgId,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_PROGID;
|
|
clsspec.tagged_union.pProgId = pProgId;
|
|
|
|
hr = CallClassSpecInfo (&clsspec, pInstallInfo);
|
|
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (ProgId=%S) returned 0x%x\n", pProgId, hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// This routine calls GetAppInfo() by Name of Package
|
|
//
|
|
HRESULT LookupByName (LPOLESTR pName,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_PACKAGENAME;
|
|
clsspec.tagged_union.pPackageName = pName;
|
|
|
|
hr = CallClassSpecInfo (&clsspec, pInstallInfo);
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (PackageName=%S) returned 0x%x\n", pName, hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// This routine calls GetClassInfo() for a TypeLib
|
|
//
|
|
HRESULT LookupByTlbid (GUID TlbId,
|
|
INSTALLINFO *pInstallInfo)
|
|
{
|
|
HRESULT hr;
|
|
uCLSSPEC clsspec;
|
|
|
|
clsspec.tyspec = TYSPEC_TYPELIB;
|
|
memcpy(&clsspec.tagged_union.typelibID, &TlbId, sizeof(GUID));
|
|
|
|
hr = CallClassSpecInfo (&clsspec, pInstallInfo);
|
|
if (!SUCCEEDED(hr))
|
|
{
|
|
VerbosePrint("....... GetClassSpecInfo (Tlb) returned 0x%x\n", hr);
|
|
return hr;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
void HandleEnumResult(UINT cElt, UINT cFound, HRESULT hr, PACKAGEDISPINFO PackageInfo[])
|
|
{
|
|
if (fVerbose)
|
|
{
|
|
if ((hr != S_OK) && (hr != S_FALSE))
|
|
{
|
|
printf ("..........Next(%d) returned error = 0x%x.\n", cElt, hr);
|
|
}
|
|
else
|
|
{
|
|
printf ("..........Next(%d) returned %d packages. hr = 0x%x.\n", cElt, cFound, hr);
|
|
for (UINT i = 0; i < cFound; i++)
|
|
{
|
|
printf ("..........PackageInfo[%d].pszPackageName = %S, Flags=%d\n",
|
|
i,
|
|
PackageInfo[i].pszPackageName,
|
|
PackageInfo[i].dwActFlags);
|
|
ReleasePackageInfo(&PackageInfo[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
PACKAGEDISPINFO PackageDisp[3];
|
|
|
|
// DoCoEnumApps Test
|
|
HRESULT DoCoEnumAppsTest()
|
|
{
|
|
PACKAGEDISPINFO PackageInfo[30];
|
|
ULONG cFound;
|
|
HRESULT hr;
|
|
IEnumPackage *pIEnumPackage = NULL;
|
|
|
|
VerbosePrint("...... CsEnumApps(All Platform & Locale).\n");
|
|
hr = CsEnumApps(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
APPINFO_ALLLOCALE | APPINFO_ALLPLATFORM,
|
|
&pIEnumPackage
|
|
);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
printf ("CsEnumApps returned error = 0x%x.\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
memset (&PackageInfo[0], 0, sizeof(PACKAGEDISPINFO) * 30);
|
|
|
|
VerbosePrint("......... Next(6)\n");
|
|
hr = pIEnumPackage->Next(6, &PackageInfo[0], &cFound );
|
|
HandleEnumResult(6, cFound, hr, &PackageInfo[0]);
|
|
|
|
VerbosePrint("......... Next(4)\n");
|
|
hr = pIEnumPackage->Next(4, &PackageInfo[0], &cFound );
|
|
HandleEnumResult(4, cFound, hr, &PackageInfo[0]);
|
|
|
|
pIEnumPackage->Release();
|
|
|
|
pIEnumPackage = NULL;
|
|
|
|
VerbosePrint("...... CsEnumApps(All Platform & Locale, Wildcard=*2*2*)\n");
|
|
hr = CsEnumApps(
|
|
L"*2*2*",
|
|
NULL,
|
|
NULL,
|
|
APPINFO_ALLLOCALE | APPINFO_ALLPLATFORM,
|
|
&pIEnumPackage
|
|
);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
printf ("CsEnumApps returned error = 0x%x.\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
if (fClassInfoVerify) {
|
|
DWORD cgot;
|
|
EnumTests(pIEnumPackage, 3, &cgot, PackageDisp, 3, TRUE);
|
|
}
|
|
else {
|
|
memset (&PackageInfo[0], 0, sizeof(PACKAGEDISPINFO) * 30);
|
|
|
|
VerbosePrint("......... Next(6)\n");
|
|
hr = pIEnumPackage->Next(6, &PackageInfo[0], &cFound );
|
|
HandleEnumResult(6, cFound, hr, &PackageInfo[0]);
|
|
}
|
|
pIEnumPackage->Release();
|
|
|
|
pIEnumPackage = NULL;
|
|
|
|
VerbosePrint("...... CsEnumApps(ASSIGNED & MSI ONLY)\n");
|
|
hr = CsEnumApps(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
APPINFO_ASSIGNED | APPINFO_MSI,
|
|
&pIEnumPackage
|
|
);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
printf ("CsEnumApps returned error = 0x%x.\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
if (fClassInfoVerify) {
|
|
DWORD cgot;
|
|
EnumTests(pIEnumPackage, 3, &cgot, PackageDisp, 3, TRUE);
|
|
}
|
|
else {
|
|
memset (&PackageInfo[0], 0, sizeof(PACKAGEDISPINFO) * 30);
|
|
|
|
VerbosePrint("......... Next(6)\n");
|
|
hr = pIEnumPackage->Next(6, &PackageInfo[0], &cFound );
|
|
HandleEnumResult(6, cFound, hr, &PackageInfo[0]);
|
|
}
|
|
|
|
pIEnumPackage->Release();
|
|
pIEnumPackage = NULL;
|
|
|
|
VerbosePrint("...... CsEnumApps(PUBLISHED & VISIBLE ONLY)\n");
|
|
hr = CsEnumApps(
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
APPINFO_PUBLISHED | APPINFO_VISIBLE,
|
|
&pIEnumPackage
|
|
);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
printf ("CsEnumApps returned error = 0x%x.\n", hr);
|
|
return hr;
|
|
}
|
|
|
|
if (fClassInfoVerify) {
|
|
DWORD cgot;
|
|
EnumTests(pIEnumPackage, 3, &cgot, PackageDisp, 3, TRUE);
|
|
}
|
|
else {
|
|
memset (&PackageInfo[0], 0, sizeof(PACKAGEDISPINFO) * 30);
|
|
|
|
VerbosePrint("......... Next(6)\n");
|
|
hr = pIEnumPackage->Next(6, &PackageInfo[0], &cFound );
|
|
HandleEnumResult(6, cFound, hr, &PackageInfo[0]);
|
|
}
|
|
pIEnumPackage->Release();
|
|
return hr;
|
|
}
|
|
|
|
extern PACKAGEDETAIL PackageDetail1, PackageDetail2,
|
|
PackageDetail3, PackageDetail4;
|
|
|
|
HRESULT DoClassInfoTest()
|
|
{
|
|
|
|
INSTALLINFO InstallInfo;
|
|
HRESULT hr = S_OK, hr2;
|
|
|
|
//By Package Name
|
|
VerbosePrint("...... Lookup by Package Name.\n");
|
|
hr = LookupByName (TestPackName4,
|
|
&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if (!Compare(InstallInfo, *(PackageDetail3.pInstallInfo)))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//FileExt1
|
|
VerbosePrint("...... Lookup by FileExt1.\n");
|
|
hr2 = LookupByFileext (TestFileExt1, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if (!Compare(InstallInfo, *(PackageDetail1.pInstallInfo)))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//Clsid1
|
|
VerbosePrint("...... Lookup by Clsid1.\n");
|
|
hr2 = LookupByClsid (TestClsid1, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if ((!Compare(InstallInfo, *(PackageDetail1.pInstallInfo))) &&
|
|
(!Compare(InstallInfo, *(PackageDetail2.pInstallInfo))))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//ProgId1
|
|
VerbosePrint("...... Lookup by ProgId1.\n");
|
|
hr2 = LookupByProgid (TestProgId1, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if ((!Compare(InstallInfo, *(PackageDetail1.pInstallInfo))) &&
|
|
(!Compare(InstallInfo, *(PackageDetail2.pInstallInfo))))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//Clsid2
|
|
|
|
VerbosePrint("...... Lookup by Clsid2.\n");
|
|
hr2 = LookupByClsid (TestClsid2, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if (!Compare(InstallInfo, *(PackageDetail1.pInstallInfo)))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//ProgId3
|
|
|
|
VerbosePrint("...... Lookup by ProgId3.\n");
|
|
hr2 = LookupByProgid (TestProgId3, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if (!Compare(InstallInfo, *(PackageDetail2.pInstallInfo)))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
//TestOtherProgID2
|
|
VerbosePrint("...... Lookup by OtherProgId2.\n");
|
|
hr2 = LookupByProgid (TestOtherProgID2, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if ((!Compare(InstallInfo, *(PackageDetail1.pInstallInfo))) &&
|
|
(!Compare(InstallInfo, *(PackageDetail2.pInstallInfo))))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
if (!fMultiStore)
|
|
return hr;
|
|
|
|
VerbosePrint(".... Looking in Second Store.\n");
|
|
|
|
|
|
//FileExt4
|
|
VerbosePrint("...... Lookup by FileExt4.\n");
|
|
hr = LookupByFileext (TestFileExt4, &InstallInfo);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
if (fClassInfoVerify)
|
|
if ((!Compare(InstallInfo, *(PackageDetail1.pInstallInfo))) &&
|
|
(!Compare(InstallInfo, *(PackageDetail3.pInstallInfo))))
|
|
printf("!!!Members of InstallInfo not matching\n\n");
|
|
}
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
// Clsid4
|
|
// Should get two packages now !!
|
|
|
|
VerbosePrint("...... Lookup by Clsid4.\n");
|
|
hr2 = LookupByClsid (TestClsid4, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
// Tlbid1
|
|
|
|
VerbosePrint("...... Lookup by Tlbid1.\n");
|
|
hr2 = LookupByTlbid (TestClsid1, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
// Tlbid2
|
|
|
|
VerbosePrint("...... Lookup by Tlbid2.\n");
|
|
hr2 = LookupByTlbid (TestClsid2, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
//AssertPackage(&InstallInfo);
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
|
|
// Clsid5
|
|
|
|
VerbosePrint("...... Lookup by Clsid5.\n");
|
|
hr2 = LookupByClsid (TestClsid5, &InstallInfo);
|
|
if (SUCCEEDED(hr2))
|
|
{
|
|
//
|
|
// Check expected values
|
|
//
|
|
hr2 = AssertPackage(&InstallInfo);
|
|
}
|
|
if (!SUCCEEDED(hr2))
|
|
hr = hr2;
|
|
|
|
ReleaseInstallInfo(&InstallInfo);
|
|
return hr;
|
|
}
|
|
|