ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΡΠΎ Π½Π°ΡΡΡΠΈΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΎΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ΅ vtbl ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΠΎΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ° ΠΊ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΡ. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠ²Π½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΠ²Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Delete ΠΊΠ°ΠΊ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΈΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ΅Π±Ρ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ Π½ΡΠΆΠ½ΡΠΉ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ. ΠΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
// ifaststring.h
class IFastString
{
public:
virtual void Delete(void) = 0;
virtual int Length(void) const = 0;
virtual int Find(const char *psz) const = 0;
};
extern "C"
IFastString *CreateFastString (const char *psz);
ΠΎΠ½Π° Π²Π»Π΅ΡΠ΅Ρ Π·Π° ΡΠΎΠ±ΠΎΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ:
// faststring.h
#include Β«ifaststring.hΒ»
class FastString : public IFastString
{ const int mcch;
// count of characters
// ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
char *mpsz; public: FastString(const char *psz);
~FastString(void);
void Delete(void);
// deletes this instance
// ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ ΡΡΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
int Length(void) const;
// returns # of characters
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
int Find(const char *psz) const;
// returns offset
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅
};
// faststring.cpp
#include <string.h>
#include Β«faststring.hΒ»
IFastString* CreateFastString (const char *psz) {
return new FastString(psz);
}
FastString::FastString(const char *psz) : mcch(strlen(psz)), mpsz(new char[mcch + 1]) {
strcpy(mpsz, psz);
}
void FastString::Delete(void) {
delete this;
}
FastString::~FastString(void) {
delete[] mpsz;
}
int FastString::Lengtn(void) const {
return mcch;
}
int FastString::Find(const char *psz) const {
// O(1) lookup code deleted for clarity
// ΠΊΠΎΠ΄ ΠΏΠΎΠΈΡΠΊΠ° 0(1) ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ Π΄Π»Ρ ΡΡΠ½ΠΎΡΡΠΈ
}
Π ΠΈΡΡΠ½ΠΎΠΊ 1.7 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ FastString Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ FastString, ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π½Π°Π΄ΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΠΉΠ» ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈ Π²ΡΠ·Π²Π°ΡΡ CreateFastString:
#include Β«ifaststring.hΒ»
int f(void)
{ int n = -1;
IFastString *pfs = CreateFastString(Β«Hi Bob!Β»);
if (pfs) { n = pfs->Find(Β«obΒ»);
pfs->Delete(); }
return n; }
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π²ΡΠ΅, ΠΊΡΠΎΠΌΠ΅ ΠΎΠ΄Π½ΠΎΠΉ, ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π² DLL FastString ΡΠ²Π»ΡΡΡΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ. ΠΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, Ρ ΡΠ°Π½ΡΡΠΈΠΉΡΡ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ vtbl , ΠΈΠ·Π±Π°Π²Π»ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠΈΠΉ Π² ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈΠΌΠ΅Π½ Π½Π° ΡΠ°Π·Π½ΡΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°Ρ . ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΡΠ΅ΡΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, β ΡΡΠΎ CreateFastString β Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π΄ΠΎΡΡΡΠΏ Π² ΠΌΠΈΡ FastString. ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΡΠΎ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π±ΡΠ»Π° ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π° Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ extern "Π‘", ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ΄Π°Π²Π»ΡΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π²ΡΠ΅ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΡ C++ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ DLL ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ. ΠΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΊΠ»Π°ΡΡ ΠΈΠ· DLL, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅ΠΉ ΠΎΠ΄Π½Ρ ΡΡΠ΅Π΄Ρ C++, Π° ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ ΠΈΠ· Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠ΅Π΄Ρ C++. ΠΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΠΌΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΊΠ°ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΡΠ΅Π»ΡΠΉ ΠΌΠΈΡ Π½ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΡΠΈΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ DLL FastString ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ β CreateFastString. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π»Π΅Π³ΠΊΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΡ DLL, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ LoadLibrary, ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΡΡΠΎΠΉ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ Π²Ρ ΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ GetProcAddress:
IFastString *CallCreateFastString(const char *psz)
{
static IFastString * (*pfn)(const char *) = 0;
if (!pfn) {
// init ptr 1st time through
// ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ptr
const TCHAR szDll[] = TEXT(Β«FastString.DLLΒ»);
const char szFn[] = Β«CreateFastStringΒ»;
HINSTANCE h = LoadLibrary(szDll);
if (h) *(FARPROC*)&pfn = GetProcAddress(h, szFn); }
return pfn ? pfn(psz) : 0;
}
ΠΡΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ΄Π½Π° ΠΈΠ· ΠΏΡΠΈΡΠΈΠ½ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ β ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅, Π³Π΄Π΅ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ WinSock ΠΈΠ»ΠΈ MAPI, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΡΡ ΡΠ΅Ρ Π½ΠΈΠΊΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ DLL, ΠΎΠ½ Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ DLL ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°Ρ , Π½Π° ΠΊΠΎΡΠΎΡΡΡ DLL Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°. ΠΡΡΠ³ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½ΠΎΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, DLL Π½Π΅ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ; ΠΈ Π΅ΡΠ»ΠΈ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΠΎ DLL Π½Π΅ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ Π½ΠΈΠΊΠΎΠ³Π΄Π°. ΠΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΡΠ²Π»ΡΡΡΡΡ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° Π΄Π»Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΠ΅Π°Π»ΡΠ½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ DLL.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΡΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠ»ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° IFastString Π΄Π°Π½ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ (publicly available), ΡΠΎ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΏΡΠ΅ΠΏΡΡΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ (implementor) FastString, ΡΠ°ΠΊ ΠΈ Π»ΡΠ±ΡΠΌ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° FastString, ΡΡΠΈ Π½ΠΎΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΊΠΎΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΡΡΠΎ Π±ΡΠ΄ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ Π½Π° Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠ΅, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΡ (Β«plug-compatibleΒ») ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ, β ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ DLL.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΡ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ IFastString Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π° ΠΏΠΎΠΈΡΠΊ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ. ΠΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ·ΡΠΊΠΎΠ², Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΈΠΉ, ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ, Π½Π΅ΠΌΠ΅ΡΠΊΠΈΠΉ). ΠΠ»Ρ ΡΠ·ΡΠΊΠΎΠ², Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΡ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ, ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½Π΅ΠΉ Π²ΡΠΎΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ IFastString, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΠ°Ρ ΠΏΠΎΠΈΡΠΊ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ. ΠΡΠ° Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° ΠΊΠ°ΠΊ Π²ΡΠΎΡΠ°Ρ DLL Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΡΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FastStringRL.DLL). ΠΡΡΡΡ ΠΎΠ±Π΅ DLL ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΎΠ³Π΄Π° ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ±ΡΠ°ΡΡ Π½ΡΠΆΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ IFastString ΠΏΡΠΎΡΡΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ DLL Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:
IFastString * CallCreateFastString(const char *psz, bool bLeftToRight = true)
{
static IFastString * (*pfnlr)(const char *) = 0;
static IFastString * (*pfnrl)(const char *) = 0;
IFastString *(**ppfn) (const char *) = &pfnlr;
const TCHAR *pszDll = TEXT(Β«FastString.DLLΒ»);
if (!bLeftToRight) { pszDll = TEXT(Β«FastStringRL.DLLΒ»);
ppfn = &pfnrl; }
if (!(*ppfn)) {
// init ptr 1st time through
// ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ptr
const char szFn[] = Β«CreateFastStringΒ»;
HINSTANCE h = LoadLibrary(pszDll);
if (h) *(FARPROC*)ppfn = GetProcAddress(h, szFn); }
return (*ppfn) ? (*ppfn)(psz) : 0;
}
ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ Π±Π΅Π· Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°,
pfs = CallCreateFastString(Β«Hi Bob!Β»);
n = pfs->Find(Β«obΒ»);
ΡΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΈΡΡ ΠΎΠ΄Π½Π°Ρ DLL FastString, ΠΈ ΠΏΠΎΠΈΡΠΊ ΠΈΠ΄Π΅Ρ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ. ΠΡΠ»ΠΈ ΠΆΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΡΡΠΎΠΊΠ° Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΠΎΠΌ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ:
pfs = CallCreateFastString(Β«Hi Bob!Β», false);
n = pfs->Find(Β«obΒ»);
ΡΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½Π°Ρ Π²Π΅ΡΡΠΈΡ DLL (FastStringRL.DLL ), ΠΈ ΠΏΠΎΠΈΡΠΊ Π±ΡΠ΄Π΅Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΏΡΠ°Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΡΡΡΠΎΠΊΠΈ. ΠΠ»Π°Π²Π½ΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠΎ, ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ CallCreateFastString Π½Π΅ Π·Π°Π±ΠΎΡΡΡΡΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠ°Ρ ΠΈΠ· DLL ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π‘ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ Π»ΠΈΡΡ ΡΠΎ, ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΉ Ρ IFastString vptr Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΈ ΡΡΠΎ vptr ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ΅ ΠΈ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΡΠ° ΡΠΎΡΠΌΠ° ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌΠ° Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΈΡΡΠ΅ΠΌΡ, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ· Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Π Π°ΡΡΠΈΡΡΠ΅ΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
ΠΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΡΡΠΎ Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΡΠ΅Π·Π²ΡΡΠ°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΡΠ΅ΠΌΡΡ ΡΠΈΡΡΠ΅ΠΌ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ΄ΠΈΠ½ Π°ΡΠΏΠ΅ΠΊΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, β ΡΡΠΎ Π΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΠΈΠ³Π½Π°ΡΡΡΠΎΠΉ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΈ Π»ΡΠ±ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΡΠ΅Π±ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄Π»Ρ ΡΡΠ΅ΡΠ° ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π₯ΡΠΆΠ΅ ΡΠΎΠ³ΠΎ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π°ΡΡΡΠ°Π΅Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° (ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ) ΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΡΡΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΠ°ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π±Π΅Π·ΠΎΠ±ΠΈΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠΎΠ΅ ΠΊΠ°ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΈΠ³Π½Π°ΡΡΡΡ, Π΄Π΅Π»Π°Π΅Ρ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π²ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΡΡ Π±Π°Π·Ρ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΠ²Π»ΡΡΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΌΠΈ Π΄Π²ΠΎΠΈΡΠ½ΡΠΌΠΈ ΠΈ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°ΠΌΠΈ (contracts), ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ. ΠΡΠ° Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΠΉ ΡΡΠ΅Π΄Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.