Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Уникальность HANDLE в архиваторном плагине 
Author Message
Mowgli



PostPosted: Thu Jun 25, 2009 23:41    Post subject: Уникальность HANDLE в архиваторном плагине Reply with quote

Пишу архиваторный плагин. Использую VC, С++, STL. Имеется класс, инкапсулирующий работу с файлом архива. Т.е. экземпляр этого класса - это интерфейс к конкретному файлу. Функцию OpenArchive пишу примерно так (очень упрощённый код):

Code:
HANDLE __stdcall OpenArchive(tOpenArchiveData* ArchiveData)
{
   TArch * arch;
   try
   {
      arch = new TArch(std::string(ArchiveData->ArcName));
   }
   catch (TOblomVyshel ex)
   {
      ArchiveData->OpenResult = E_BAD_DATA;
      return 0;
   }
   return arch;
}

Теперь непонятка. В документации написано, что возвращаемое функцией OpenArchive значение должно быть уникально. Функция возвращает тип HANDLE. Это дескриптор объекта виндовс, что наводит на мысль о требовании уникальности этого числа в системе вообще.
Как видно из моего кода возвращается обычный указатель, полученный оператором new. Он, само-собой, не уникален в глобальном смысле и даже может пересечься со значениями каких-либо системных дескрипторов в пределах процесса. Хотя как указатель он уникален между всех других указателей в пределах процесса (и соответственно между всеми экземплярами работающих функций плагина).
Собственно вот так, как показано, у меня работает и пока без проблем. Но хотелось бы до конца понять мутную фразу из руководства насчёт уникальности и по возможности предотвратить потенциальные проблемы.

Я как себе представляю логику работы TC:
- При открытии файла TC вызывает функцию OpenArchive и передаёт ей имя архива, в ответ получает некое число. Число запоминается и связывается с открытым файлом.
- Для всех дальнейших операций функциям плагина передаётся это число, вплоть до закрытия архива.
- Если одновременно с первым открывается другой файл, то для него TC получает и передаёт потом другое число.

Исходя из такой логики уникальность требуется исключительно между одновременно вызванными функциями плагина. Это могут быть даже не указатели, а скажем числа 0, 1, 2 и т.д.
Но так ли это на самом деле? В этом и вопрос.


Last edited by Mowgli on Fri Jun 26, 2009 03:32; edited 1 time in total
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group