Mowgli
|
Posted: Thu Jun 25, 2009 23:41 Post subject: Уникальность HANDLE в архиваторном плагине |
|
|
Пишу архиваторный плагин. Использую 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 |
|