private:
FolderWatcher _folderWatcher;
};
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ΠΌ, Π΄Π°Π²Π°ΠΉΡΠ΅ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ, Π‘ΠΎΠ±ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ±ΡΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π² ΠΎΡΠ²Π΅Ρ Π½Π° FindFirstChangeNotification. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ ΠΈΠ· Π²ΡΠ·ΠΎΠ²Π°. ΠΡ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΡΠΎΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, ΡΡΠΎΠ±Ρ ΠΈΠ»ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° ΠΊ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡΠΌ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½Π°Π±Π»ΡΡΠ΄Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ, ΡΠΎ Π΅ΡΡΡ, Π½Π°Π±Π»ΡΠ΄Π°ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠ°ΠΏΠΊΡ ΠΈ Π²ΡΠ΅ Π΅Π΅ ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ ΠΈ ΠΏΠΎΠ΄ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΡΠ°ΠΆΠ°ΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΊ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΠΎΡΠ°Π·ΡΡΠ΄Π½ΠΎΠ΅ ΠΠΠ Π΄Π»Ρ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ»Π°ΠΆΠΊΠΎΠ²:
β’ FILE_NOTIFY_CHANGE_FILE_NAME (ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°)
β’ FILE_NOTIFY_CHANGE_DIR_NAME (ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° (ΠΏΠ°ΠΏΠΊΠΈ))
β’ FILE_NOTIFY_CHANGE_ATTRIBUTES
β’ FILE_NOTIFY_CHANGE_SIZE
β’ FILE_NOTIFY_CHANGE_LAST_WRITE (ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π°)
β’ FILE_NOTIFY_CHANGE_SECURITY
ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΡ FileChangeEvent, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠΌ ΡΡΠΈΡ ΡΠ»Π°ΠΆΠΊΠΎΠ². ΠΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ β FolderChangeEvent, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π² Π½Π°ΡΠ΅ΠΌ FolderWatcher.
class FileChangeEvent {
public:
FileChangeEvent(char const *folder, BOOL recursive, DWORD notifyFlags) {
_handle = FindFirstChangeNotification(folder, recursive, notifyFlags);
if (INVALID_HANDLE_VALUE == _handle) throw WinException("Cannot create change notification handle");
}
~FileChangeEvent() {
if (INVALID_HANDLE_VALUE != _handle) FindCloseChangeNotification(_handle);
}
operator HANDLE() const { return _handle; }
BOOL ContinueNotification() {
return FindNextChangeNotification(_handle);
}
private:
HANDLE _handle;
};
class FolderChangeEvent : public FileChangeEvent {
public:
FolderChangeEvent(char const* folder) : FileChangeEvent(folder, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME) {}
};
class TreeChangeEvent : public FileChangeEvent {
public:
TreeChangeEvent(char const * root) : FileChangeEvent (root, TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME) {}
};
ΠΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΠΎΠ±ΡΠΈΡΡ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΡΠ°Π±ΠΎΡΡ Π² Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ . ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ API, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π² ΡΡΠΈΡ ΠΎΠ±ΡΡΠ°ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΉ ΡΠΏΡΠ°Π²ΠΊΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ΄Π΅Ρ Ρ Π²Π°ΡΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠΌ.
ΠΠ°Π»Π΅Π΅: ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ OLE ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ COM Π±Π΅Π· MFC.
ΠΠ±ΠΎΠ»ΠΎΡΠΊΠ° ΠΈΠ· ΠΊΠ»Π°ΡΡΠΎΠ² Π΄Π»Ρ COM
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ Π. Π. ΠΠ΅Π³Π°Π»ΠΎΠ²Π°
ΠΠ½Π³Π»ΠΎΡΠ·ΡΡΠ½ΡΠΉ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π» Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Reliable Software
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ COM Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΄Π½ΠΎ, ΡΡΠΎ ΠΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π°ΠΆΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠΎ Π±Π΅Π· MFC. ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ? ΠΠ±ΡΠΎΠ»ΡΡΠ½Π°Ρ ΡΡΡΡ! Π Π΅ΠΊΠ»Π°ΠΌΠΈΡΡΠ΅ΠΌΡΠ΅ OLE ΠΈ Π΅Π³ΠΎ ΠΏΡΠ΅Π΅ΠΌΠ½ΠΈΠΊ COM ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΠΎΡΡΡ Π³ΠΈΠΏΠΏΠΎΠΏΠΎΡΠ°ΠΌΠ°, Π·Π°Π½ΠΈΠΌΠ°ΡΡΠ΅Π³ΠΎΡΡ ΡΠΈΠ³ΡΡΠ½ΡΠΌ ΠΊΠ°ΡΠ°Π½ΠΈΠ΅ΠΌ. ΠΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ MFC Π½Π° Π²Π΅ΡΡΠΈΠ½Π΅ COM ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ΄Π΅Π²Π°Π½ΠΈΡ Π³ΠΈΠΏΠΏΠΎΠΏΠΎΡΠ°ΠΌΠ° Π² ΠΊΠ»ΠΎΡΠ½ΡΠΊΠΈΠΉ ΠΊΠΎΡΡΡΠΌ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ².
ΠΠ°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠ°, TreeSizer (zip Π°ΡΡ ΠΈΠ² 12 ΠΊΠ±, Π»ΡΠ±Π΅Π·Π½ΠΎΡΡΡ Laszlo Radanyi), Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π²ΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΡΡΠΌΠΌΠ°ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ² Π² Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΠΈ Π²ΡΠ΅Ρ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°Ρ . ΠΠ½, Π΄Π»Ρ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠΊΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ Windows.
ΠΡΠ°ΠΊ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΡΡ Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ Windows, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ COM? Π§ΠΈΡΠ°ΠΉΡΠ΅ β¦
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π°, Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΡ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ COM, ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»Π° COM ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ. Π’ΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΡ, ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΡΠΈΡΡΠ΅ΠΌΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π²ΡΠ³ΡΡΠ·ΠΈΠ»Π° COM. Π‘Π°ΠΌΠ°Ρ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ COM, Π° Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ Π²ΡΠ³ΡΠΎΠΆΠ°Π΅Ρ Π΅Π΅. Π‘Π°ΠΌΠΎΠ΅ Π»ΡΡΡΠ΅Π΅ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° β ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Controller (ΡΠΌ. Windows ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Generic), ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΡΡΠΎΠΌΡ.
class Controller {
public:
Controller(HWND hwnd, CREATESTRUCT * pCreate);
~Controller();
// β¦ private:
UseCom _comUser; // i'm a com user
Model _model;
View _view;
HINSTANCE _hInst;
};
ΠΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ, ΡΡΠΎ COM ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° ΠΏΡΠ΅ΠΆΠ΄Π΅, ΡΠ΅ΠΌ ΠΊ Π½Π΅ΠΉ Π±ΡΠ΄ΡΡ ΡΠ΄Π΅Π»Π°Π½Ρ Π»ΡΠ±ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠΎ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½Π° ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡ ΡΠ²ΠΎΠΈ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ (ΡΠΎ Π΅ΡΡΡ, ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ "ΠΠΈΠ΄" ΠΈ "ΠΠΎΠ΄Π΅Π»Ρ" Π±ΡΠ΄ΡΡ ΡΠ°Π·ΡΡΡΠ΅Π½Ρ).
ΠΠ»Π°ΡΡ UseCom ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ.
class UseCom {
public:
UseCom() {
HRESULT err = CoInitialize(0);
if (err != S_OK) throw "Couldn't initialize COM";
}
~UseCom() {
CoUninitialize();
}
};
ΠΠΎΠΊΠ° Π½Π΅ Π±ΡΠ»ΠΎ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΡΠ΄Π½ΠΎ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ? ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ Π½Π΅ ΠΊΠΎΡΠ½ΡΠ»ΠΈΡΡ Π³Π»Π°Π²Π½ΠΎΠΉ ΠΌΠ΅ΡΠ·ΠΎΡΡΠΈ COM ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΡΠ»ΠΎΠΊ. ΠΠ°ΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΡΠΎ ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ. Π ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²Π½ΠΎ ΡΠΌΠ΅Π½ΡΡΠ°ΡΡ Π΅Π³ΠΎ. Π ΡΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΡΠΆΠ°ΡΡΠ½ΡΠΌ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΠ΅ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ , ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄ΡΡΠ³ΠΈΠΌ ΠΈ Ρ.Π΄. ΠΠΎ Π»ΠΎΠ²ΠΈΡΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ! ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ. ΠΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠ°ΡΠ°ΡΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² COM Π±Π΅Π· ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΠΈ ΠΈΡ Π² ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Π Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π΄Π°Π½Π½Π°Ρ ΡΠ΅ΠΌΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΈΡΠΎΠΊΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π² Π»ΠΈΡΠ΅ΡΠ°ΡΡΡΠ΅, ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° ΡΡΡΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΠΊΠ½ΠΈΠ³ΠΈ:
ΠΠΆΠ΅ΡΡ ΠΠ»Π΄ΠΆΠ΅Ρ. "C++: Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠ°";
Π‘ΠΊΠΎΡΡ ΠΠ΅ΠΉΠ΅ΡΡ. "ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++".
Π.Π.template <class T>
class SIfacePtr {
public:
~SIfacePtr() {
Free ();
}
T * operator->() { return _p; }
T const* operator->() const { return _p; }
operator T const * () const { return _p; }
T const& GetAccess () const { return *_p; }
protected: SIfacePtr () : _p (0) {}
void Free () {
if (_p != 0) _p->Release();
_p = 0;
}
T * _p;
private:
SIfacePtr(SIfacePtr const& p) {}
void operator=(SIfacePtr const& p) {}
};
ΠΠ΅ Π²ΠΎΠ»Π½ΡΠΉΡΠ΅, ΡΡΠΎ ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΌ (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌΠ΅Π΅Ρ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ). ΠΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ. ΠΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅ΠΌ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠΈΠΌ, ΡΡΠΎ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΡΠΈΠ΅ΠΌ: ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ»Π°ΡΡ Ρ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌ ΠΏΡΡΡΡΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ, ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΡΠ΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΈΡ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ²ΠΎΠΈΠΌΠΈ ΠΎΡΠΊΡΡΡΡΠΌΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ, Π½Π°ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΡ SIfacePtr, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΏΠΎ ΡΠΏΠΎΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΏΠΎ ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌ, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌ.
ΠΠ°ΠΊΡΡΡΡΠ΅ ΡΠΈΠΊΡΠΈΠ²Π½ΡΠΉ ΠΊΠΎΠΏΠΈΡΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ "=" Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡ, Π½ΠΎ ΠΎΠ½ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡ ΠΠ°ΠΌ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π½Π° ΠΎΡΠ»Π°Π΄ΠΊΡ, Π΅ΡΠ»ΠΈ ΠΏΠΎ ΠΎΡΠΈΠ±ΠΊΠ΅ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΡΠ΅ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π΄Π²Π°ΠΆΠ΄Ρ ΠΈ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΊΡΡΡΠΎ ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π° ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ΅ ΡΡΡΠ»ΠΎΠΊ COM. ΠΠ΅ΡΡΡΠ΅ ΠΌΠ½Π΅, Ρ ΠΌΠ΅Π½Ρ ΡΡΠΎ ΡΠ»ΡΡΠ°Π»ΠΎΡΡ. ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°ΡΡΠΎ Π±ΡΠ²Π°Π΅Ρ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΎΡΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ Π·Π°ΠΊΡΡΡΡΡ ΠΊΠΎΠΏΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ, ΠΊΠΎΠ³Π΄Π° ΠΡ ΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ Π·Π°ΠΊΡΡΡΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ.
ΠΠ»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ Π²Π°ΡΠΈΠ°ΡΠΈΡ Π½Π° ΡΠ΅ΠΌΡ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ±ΠΎΠ»ΠΎΡΠΊΠΈ API ΡΠ°ΡΡΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ. ΠΡΠΎ Π½Π΅ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ»ΠΎΡ ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΎΡ Π²Π°Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠΉ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ. Π’Π°ΠΊ, Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π²ΡΡΡΠ°Π΅Ρ Π½Π°ΠΌ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΠΌΠ½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΠΌΡ ΠΎΠ±Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ.
template <class T> class
SShellPtr {
public:
~SShellPtr() {
Free();
_malloc->Release();
}
T* weak operator->() { return _p; }
T const* operator->() const { return _p; }
operator T const* () const { return _p; }
T const& GetAccess () const { return *_p; }
protected:
SShellPtr() : _p(0) {
// Obtain malloc here, rather than
// in the destructor.
// Destructor must be fail-proof.
// Revisit: Would static IMalloc * _shellMalloc work?
if (SHGetMalloc(&_malloc) == E_FAIL) throw Exception "Couldn't obtain Shell Malloc";
}
void Free() {
if (_p != 0) _malloc->Free(_p);
_p = 0;
}
T * _p;
IMalloc* _malloc;
private:
SShellPtr(SShellPtr const& p) {}
void operator=(SShellPtr const & p) {}
};
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ°: ΠΊΠ»Π°ΡΡ SShellPtr Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π΅ ΠΏΡΠΈΠ³ΠΎΠ΄Π΅Π½ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² Π½Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ.