ΠΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡΠΊΠΈΠΌΠΈ Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡΠΌΠΈ. ΠΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠ³ΡΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ (ΠΊΠΎΠ³Π΄Π° ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ CLSID Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ CLSID. Π ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΠΈΡΡΠ΅ΠΌΡ Π² ΡΠ΅Π»ΠΎΠΌ ΠΌΠΎΠ³Π»ΠΈ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ°, ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠΈ (brokers) ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° ΠΈΠ»ΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π² ΡΡΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄Π²Π° ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ»ΠΈ Π½Π°ΠΉΡΠΈ ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½ΡΠΆΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IΠΡΠ΅ . ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IΠΡΠ΅ Π½Π΅ Π½Π°ΡΡΡΠΈΡ Π·Π°ΠΊΠΎΠ½Ρ Π‘ΠΠ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ°:
class GorillaClass : public IApe
{
public:
// class objects are singletons, so don't delete
// ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π² Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅,
// ΡΠ°ΠΊ ΡΡΠΎ Π½Π΅ ΡΠ΄Π°Π»ΡΠΉΡΠ΅ ΠΈΡ
IMPLEMENTUNKNOWNNODELETE (GorillaClass)
BEGININTERFACETABLE(GorillaClass)
IMPLEMENTSINTERFACE(IApe)
ENDINTERFACETABLE()
// IApe methods
// ΠΌΠ΅ΡΠΎΠ΄Ρ IApe
STDMETHODIMP EatBanana(void);
STDMETHODIMP SwingFromTree(void);
STDMETHODIMP getWeight(long *plbs);
};
ΠΡΠ»ΠΈ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° C++ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ (ΡΠ°ΠΊ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π² Π‘ΠΠ), ΡΠΎ Π² Π»ΡΠ±ΠΎΠΌ Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π³ΠΎΡΠΈΠ»Π»Π° (gorilla). ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΎΠ΄Π½ΠΎΡΠ»Π΅ΠΌΠ΅Π½ΡΠ½ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. Π ΡΠ»ΡΡΠ°Π΅ Ρ Π³ΠΎΡΠΈΠ»Π»Π°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π²Π΅ΡΡΠΌΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π·Π°Ρ ΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π³ΠΎΡΠΈΠ»Π» ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π§ΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IApe , Π° Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΡ Π³ΠΎΡΠΈΠ»Π» ΠΈ/ΠΈΠ»ΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π³ΠΎΡΠΈΠ»Π» ΠΏΠΎ ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ. ΠΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π²Π° ΠΊΠ»Π°ΡΡΠ° C++: ΠΎΠ΄ΠΈΠ½ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ° ΠΈ Π΄ΡΡΠ³ΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ°. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π³ΠΎΡΠΈΠ»Π»Ρ ΠΊΠ»Π°ΡΡ C++, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π³ΠΎΡΠΈΠ»Π»Ρ, Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IApe:
class Gorilla : public IApe
{
public:
// Instances are heap-based, so delete when done
// ΠΊΠΎΠΏΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Ρ Π² ΠΊΡΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
IMPLEMENTUNKNOWN()
BEGININTERFACETABLE()
IMPLEMENTSINTERFACE(IApe)
ENDINTERFACETABLE()
// IApe methods
// ΠΌΠ΅ΡΠΎΠ΄Ρ IApe
STDMETHODIMP EatBanana(void);
STDMETHODIMP SwingFromTree(void);
STDMETHODIMP getWeight(long *plbs):
};
ΠΡΠΎΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Gorilla:
[object, uuid(753A8AAC-A7FF-11d0-8C30-0080C73925BA)]
interface IApeClass : IUnknown
{
HRESULT CreateApe([out, retval] IApe **ppApe);
HRESULT GetApe([in] long nApeID, [out, retval] IApe **ppApe);
[propget]
HRESULT AverageWeight([out, retval] long *plbs);
}
ΠΠΎΠ»ΡΡΠΈΠ² ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ IApeClass ΠΈΠ»ΠΈ ΠΏΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π‘++-ΠΊΠ»Π°ΡΡΠ° Gorilla (Π² ΡΠ»ΡΡΠ°Π΅ CreateApe), ΠΈΠ»ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΈΠΏΠ° integer) Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ (Π² ΡΠ»ΡΡΠ°Π΅ GetApe):
class GorillaClass : public IApeClass
{
public: IMPLEMENTUNKNOWNNODELETE(GorillaClass)
BEGININTERFACETABLE(GorillaClass)
IMPLEMENTSINTERFACE(IApeClass)
ENDINTERFACETABLE()
STDMETHODIMP CreateApe(Ape **ppApe)
{
if ((*ppApe = new Gorilla) == 0) return EOUTOFMEMORY;
(*ppApe)->AddRef();
return SOK;
}
STDMETHODIMP GetApe(long nApeID, IApe **ppApe)
{
// assume that a table of well-known gorillas is
// being maintained somewhere else
// Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΡΡΠΎ ΡΠ°Π±Π»ΠΈΡΠ° Π΄Π»Ρ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π³ΠΎΡΠΈΠ»Π»
// ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π³Π΄Π΅-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΠ΅
extern Gorilla *grgWellKnownGorillas[];
extern int gnMaxGorillas;
// assert that nApeID is a valid index
// ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ, ΡΡΠΎ nApeID β Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ
*ΡΡΠΡΠ΅ = 0;
if (nApeID > gnMaxGorillas || nApeID < 0) return EINVALIDARG;
// assume that the ID is simply the index into the table
// Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΡΡΠΎ ID β ΠΏΡΠΎΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅
if ((*ppApe = grgWellKnownGorillas[nApeID]) == 0) return EINVALIDARG;
(*ppApe)->AddRef();
return SOK;
}
STDMETHODIMP getAverageWeight(long *plbs)
{
extern *grgWellKnownGorillas[];
extern int gnMaxGorillas;
*plbs = 0;
long lbs;
for (int i = 0; i < gnMaxGorillas; i++)
{
grgWellKnownGorillas[i]->getWeight(&lbs);
*plbs += lbs;
}
// assumes gnMaxGorillas is non-zero
// ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ gnMaxGorillas Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ
*plbs /= gnMaxGorillas;
return SOK;
}
};
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² ΡΡΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π²Π½Π΅ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ Π³ΠΎΡΠΈΠ»Π» ΡΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ β ΠΈΠ»ΠΈ ΡΠ°ΠΌΠΈΠΌΠΈ ΠΊΠΎΠΏΠΈΡΠΌΠΈ Gorilla, ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈΠΊΠΎΠΌ (agent).
ΠΠΊΡΠΈΠ²Π°ΡΠΈΡ
ΠΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ°. Π ΡΠΈΠ»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΡΠΈΡΠΎΠ΄Ρ Π‘ΠΠ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ DLL ΠΈΠ»ΠΈ Π·Π°ΠΏΡΡΠΊΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (server process). ΠΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊ ΠΆΠΈΠ·Π½ΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
Π Π‘ΠΠ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΡΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π·Π°Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΠΏΠ°ΠΌΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌΠΈ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ². ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π‘ΠΠ ΡΠ²ΡΠ·Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° Ρ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ, ΡΡΠΎΠ±Ρ Π‘ΠΠ ΡΠΎΠ·Π΄Π°Π»Π° Π½ΠΎΠ²ΡΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CLSID. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π‘ΠΠ Π²ΡΠ·Π²Π°ΡΡ ΠΊ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅ΡΠΌΠ°Π½Π΅Π½ΡΠ½ΡΠΉ (persistent) ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ΅. ΠΠ· ΡΡΠΈΡ ΡΡΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²Π°Ρ (ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°) ΡΠ²Π»ΡΠ΅ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠΉ. ΠΠ²Π΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠΌΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΠΈΡ ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ, ΠΌΠΎΠ΄Π΅Π»ΠΈ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) ΠΈΠ· ΡΡΠΈΡ ΡΡΠ΅Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ².
ΠΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ ΡΡΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ»ΡΠ³Π°ΠΌΠΈ ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎΡΡ Π² Π‘ΠΠ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌΠΈ SCM (Service Control Manager)[1]. SCM ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ ΡΠ°Π½Π΄Π΅Π²Ρ Π΄Π»Ρ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π½Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. ΠΠ°ΠΆΠ΄Π°Ρ Ρ ΠΎΡΡ-ΠΌΠ°ΡΠΈΠ½Π°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠ°Ρ Π‘ΠΠ, ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ SCM, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠ΅ΡΠ΅Π°Π΄ΡΠ΅ΡΠΎΠ²ΡΠ²Π°Π΅Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ Π½Π° SCM ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, Π³Π΄Π΅ ΡΡΠΎΡ Π·Π°ΠΏΡΠΎΡ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ. SCM ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΠΊ Π½Π΅ΠΌΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½, SCM Π±ΠΎΠ»Π΅Π΅ Π½Π΅ ΡΠ²ΡΠ·Π°Π½ Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 3.1, ΠΏΠΎΠ΄ Windows NT SCM ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΡΠ»ΡΠΆΠ±Π΅ RPCSS (Remote Procedure Call Service System β ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ΡΠ²ΠΈΡΠ° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΏΡΠΎΡΠ΅Π΄ΡΡ). Π‘Π»ΡΠΆΠ±Ρ SCM ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΊΠ°ΠΊ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ ΡΠΈΠΏΡ ΠΌΠΎΠ½ΠΈΠΊΠ΅ΡΠΎΠ²[2] ΠΈ ΠΊΠ°ΠΊ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ API-ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΡΠ΅ΠΌ Π²ΡΠ΅ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Π‘ΠΠ (ΠΊΠ°ΠΊ ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π² Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π‘ΠΠ). ΠΠΎΠ΄ Windows NT Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π‘ΠΠ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² OLE32.DLL. ΠΠ»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π‘ΠΠ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ»ΠΈ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠ»ΡΠΆΠ±Ρ RPCSS ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ IPC (interprocess communication β ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅).
ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π³Π»Π°Π²Π½ΡΠΌ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠΌ Π‘ΠΠ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΊΡΡΡΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΡΠΎΠ½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ Ρ ΠΎΡΡΠ΅ Π±ΡΠ» Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½ΠΎ ΠΈ Π±ΡΠ» Π»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΈΠ»ΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. ΠΡΠΎ Π΄Π°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΡΡ Π³ΠΈΠ±ΠΊΠΎΡΡΡ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΡΠΈΡΡΠ²Π°Ρ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠ°ΠΊ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΊ ΡΠ±ΠΎΡΠΌ (robustness), ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΠ»ΠΈΠ΅Π½Ρ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ³ΠΎ, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π²ΡΡΠ°ΠΆΠ°ΡΡ ΡΠ²ΠΎΠ΅ Π±Π΅Π·ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎΡ Π²ΡΠ±ΠΎΡ ΡΠ΄Π΅Π»Π°Π΅Ρ SCM, ΠΈΡΡ ΠΎΠ΄Ρ ΠΈΠ· ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
ΠΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ Π²Π½ΡΡΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°, ΡΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° DLL, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ Ρ ΡΠ°Π½ΡΡΡΡ Π² Π°Π΄ΡΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ Π²ΡΡΠΎΠΊΠ°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΏΡΡΠΌΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ (threading requirements) ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ. ΠΡΠ»ΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ, ΡΠΎ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΠΏΠΎΡΠ»Π΅ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠ°ΡΡΠΈΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΈ ΡΠ΅Π½Π° Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΡΠΎΡΡΠΎ ΡΠ°Π²Π½Π° Π²ΡΠ·ΠΎΠ²Ρ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎ ΠΎΠ±ΡΡΠΎΡΡΠ΅Π»ΡΡΡΠ²ΠΎ Π΄Π΅Π»Π°Π΅Ρ Π‘ΠΠ, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² ΠΏΡΠΎΡΠ΅ΡΡ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Ρ ΠΎΡΠΎΡΠΎ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±Π»Π΅Π½Π½ΡΠΌ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΊ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΠ±Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π΅ Π΄ΠΎΡΠΎΠΆΠ΅, ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² DLL[3].