Немного изменил внутреннюю реализацию процедур диагностики ошибок в API:
sol_GetErrorsol_GetErrorLensol_ClearError Суть изменений: добавлена критическая секция, чтобы не возникало ошибок в многопоточной среде.
В прежней версии два потока, работающие с одним экземпляром грамматического словаря в памяти, могли одновременно сгенерировать ошибочную ситуацию и в принципе - разрушить память из-за одновременной записи строкового буфера с текстом ошибки.
Как и любой долгоживущий программный продукт, процедурный API словаря дает возможность увидеть недостатки эволюционного подхода к расширению первоначального проекта, обремененного требованиями обратной совместимости.
Например, многие процедуры API не требуют указания в качестве аргумента вызова дескриптора экземпляра словаря. Из-за этого нельзя сохранять информацию об ошибке, если она возникает внутри такой процедуры.
В качестве примера можно посмотреть на
sol_GetNodeCoordState из раздела синтаксического анализатора. Если указать неправильные аргументы, то внутри кода этой функции будет сгенерирована исключительная ситуация, которую мы конечно не должны выпустить за границу DLL, так как это обычно убивает вызывающий прикладной код. Но и сохранить описание ошибки при этом мы не можем - негде, глобального объекта ошибки делать категорически не хочется.
В итоге исключения просто гасятся с помощью catch(...), лишая программиста полезной отладочной информации.
Единственный способ сделать сохранение текста ошибки в этой и других подобных процедурах - добавить в класс, представляющий узел синтаксического графа, еще одно поле - указатель на экземпляр грамматического словаря. Но это слишком большой оверхед, совершенно ненужный в других программах проекта.