Подправил композитные строки еще раз - теперь при освобождении не нужно указывать адрес старой переменной, есть возможность исправить адрес старой переменной на адрес временной переменной. Дубли теперь определяются как по адресу буфера, так и по адресу переменной - если адрес переменной используется с новым буфером и на прежний буфер не зарегистрировано других переменных делается попытка его освободить. Поэтому добавлено еще одно поле в мини-менеджер: условный тип переменной. Фиксировано значение 1 для композитной строки, при нем работает восстановление переменной. Значение 2 уже потребовалось - чтобы выделять буфер для расширенного использования сертификата.
Необходимость поля связана с тем, что привязке буфера композитной строки к использованию сертификата это считалось как использование переменной с новым буфером и прежний освобождался. Поэтому теперь элемент массива с адресом буфера в расширенном использовании регистрируется в качестве переменной. Естественно такой адрес переменной нельзя использовать для восстановления.
В целом, сейчас утечка памяти в композитных строках и расширенном использовании устранена. После работы программы счетчик строк=0.
Другим важным изменением стало решение вынести некоторые Unit в качестве отдельных независимых библиотек - это должно улучшить процесс обновления для нескольких исполняемых файлов при изменении модулей и добавить некоторую совместимость для других языков программирования (конвенции пока не указаны, так что совместимость минимальна. Также библиотеки много сообщений выводят на консоль, то есть сейчас их нельзя использовать с консольными программами без консоли). Соответственно, будет странно, если в каждой библиотеке будет свой мини-менеджер для композитных строк. Поэтому мини-менеджер тоже вынесен в отдельную библиотеку lstrmem.dll. Конечно, это имеет свои минусы, но они пока не проявились. С остальными функциями работы с композитными строками пока не вышло, так как: 1) для библиотеки требуются функции с уникальными именами, а у меня много в модуле композитных строк много "перегруженных функций", которые имеют одинаковое имя, но разные списки параметров; 2) там еще и предыдущие опробованные типы строк определены, так что дублей имен функций из-за них еще больше. Так что пока часть модуля в единой библиотеке, часть дублируется в каждой. Если подводить под совместимость с другими языками программирования - дублирующую часть нужно сократить до минимума, поэтому все же как-нибудь найду время и разберусь с одинаковыми именами и сделаю еще библиотеку (только для композитных строк, другие строки перенесу в другой модуль).
Дескрипторы теперь тоже в отдельной библиотеке handles2.dll - она предназначена для замены адресов объектов внутри библиотек (как уже обсуждали, передача ссылки на объект между библиотекой и программой, между разными средами программирования проблематична) на номер по которому этот адрес можно найти. Тут тоже желательна единая таблица между библиотекой и программой. поэтому вынесено в отдельную библиотеку.
Первой библиотекой использующей их стала canonic.dll - версия модуля каконикализации в формате библиотеки. Для типовых текстов SOAP уже работает, но до полного соответствия стандарту еще далеко. Размер трех библиотек чуть более 100 Кб без отладочных символов (плюс программа около 900 Кб включая отладочные номера строк), много меньше размера dotNet.
Из нового в библиотеку вошли - возможность делить SOAP на части тегами soap:Header soap:Body, загружать из первой части (до soap:Header включительно) контекст предков для тегов wsse:Security и ds:Signature, вставлять soap:Header если отсутствует, вставлять в soap:Header дополнительную подпись (в начало) и дополнительные данные подписи (в конец). Загрузить контекст предков для подписи внутри Body также возможно, но деление текста пока не реализовано. Добавлено преобразование контекста предков в фиксированный список ключей пространств имен для формирования ЭП (по фиксированным адресам пространств, urn пока не поддерживаются). Если нужные пространства отсутствуют в контексте, то они будут добавлены в контекст с ключами по умолчанию. Планирую еще добавить возможность задания ключей по умолчанию.
Кстати, перечитал примеры в стандарте - все же
пространства имен сортируются по
ключу, так что я ошибался. Но ошибался не полностью - все интереснее: несмотря на это
атрибуты с указанным пространством имен сортируются по
адресу пространства!!

У меня пока сортировка атрибутов в том же порядке что и пространств имен, для атрибутов одного пространства нет проблем, но возможно несоответствие стандарту, если будут атрибуты разных пространств.
Также стало яснее с символами в виде &...; - сначала все подобные записи символов переводятся в код в кодировке Юникод (или UTF-8), затем определенные по списку символы преобразуются обратно в &...; (в форму числового шестадцатиричного заглавного кода символа). Пока не реализовал.
Далее предполагается вынесение подписи и взаимодействия по HTTP также в отдельные библиотеки. Возможно также придется поделить unit подписи на части (сертификаты отдельно, взаимодействие с Майкросрофтовским провайдером отдельно) - сейчас получается слишком много кода.