Aufrufen von außerhalb einer Assembly
Gehostete Komponenten sollten sicherstellen, dass der richtige Aktivierungskontext aktiv ist, wenn sie außerhalb der Komponente aufrufen. Aufrufe von externem Code, der durch Aufrufen von CreateActCtx und dann LoadLibrary oder CoCreateInstancegefunden wurde, sollten mit demselben Kontext aufgerufen werden, der zum Suchen verwendet wurde. Aufrufe von Code, der außerhalb von Aktivierungskontexten gefunden wurde, oder Aufrufe an die Hostinganwendung sollten mit dem Standardaktivierungskontext der Anwendung aufgerufen werden.
Das Kompilieren mit definierter ISOLATION _ AWARE _ ENABLED-Funktion kann beim Aufrufen von außerhalb gehosteter Komponenten nützlich sein. Dies bedeutet jedoch, dass nur Aufrufe Windows APIs im Aktivierungskontext der Komponente isoliert sind. Dies ist in den meisten Fällen ausreichend, da für Aufrufe von Drittanbieterfunktionen kein Kontext aktiviert ist, bevor sie aufgerufen werden. Das Kompilieren mit der definierten ISOLATION AWARE ENABLED-Funktion hilft nicht, wenn Ihre Komponente mehrere _ _ Aktivierungskontexte mit verschiedenen Plattform-APIs verwendet.
Um dies zu implementieren, verwenden Sie einen Aktivierungskontextaktivator wie im Beispiel unter Isolating Components (Isolieren von Komponenten). Hier ist externals.manifest der Satz von Abhängigkeiten außerhalb der Abhängigkeiten, mit denen die Komponente erstellt wurde. Möglicherweise enthält sie eine erweiterbare Liste von Komponenten, die während der Laufzeit geladen und verwendet werden sollen. Die Datei internalcontext.manifest enthält den Satz von Abhängigkeiten, die die Komponente während ihrer Lebensdauer sicher verwendet und die in allen Einstiegspunkten von außen festgelegt werden sollte. Beachten Sie, dass dieser interne Kontext in allen Einstiegspunkten aktiviert wird, während der Kontextaktivator mit C++-Bereich verwendet wird, sodass der richtige Kontext festgelegt wird, wenn der verschiedene externe Code, den diese Komponente verwendet, aufruft.
CActivationContext s_InternalContext;
CActivationContext s_OutboundContext;
CActivationContext s_ExternalContext;
void MyInitializeFunction()
{
HANDLE hActCtx;
ACTCTX actctx = {sizeof(actctx)};
s_OutboundContext.Set(NULL);
actctx.lpSource = TEXT("internalcontext.manifest");
hActCtx = CreateActCtx(&actctx);
s_InternalActCtx.Set(hActCtx);
ReleaseActCtx(hActCtx);
actctx.lpSource = TEXT("externals.manifest");
hActCtx = CreateActCtx(&actctx);
s_ExternalContext.Set(hActCtx);
ReleaseActCtx(hActCtx);
}
void foo()
{
// Some code that makes a few calls
{
CActCtxActivator CallUnknown(s_OutboundContext);
pfnUnknownImplementor(...);
}
{
CActCtxActivator CallDependency(s_ExternalContext);
KnownExternalDependencyPtr->Call();
}
}
void WINAPI MyEntrypoint()
{
CActCtxActivator ContextFirewall(s_InternalContext);
// Do some work here
foo();
// Some more work here
}