Это уже было решено в ответе Рана на аналогичный вопрос SO. Цитата Ран:
Начиная с версии 2.5.7, NUnit позволяет Teardown обнаруживать, не прошел ли последний тест. Новый класс TestContext позволяет тестам получать доступ к информации о себе, включая TestStauts.
Для получения более подробной информации, пожалуйста, обратитесь к http://nunit.org/?p=releaseNotes&r=2.5.7
[TearDown]
public void TearDown()
{
if (TestContext.CurrentContext.Result.Status == TestStatus.Failed)
{
PerformCleanUpFromTest();
}
}
В Delphi нет функции, которая бы распутывала имена функций, и я не знаю, чтобы это было где-нибудь задокументировано. Delphi in a Nutshell упоминает, что утилита tdump имеет переключатель -um , позволяющий распутывать найденные символы. Я никогда не пробовал.
tdump -um -e dbrtl100.bpl
Если это не сработает, значит, это не очень сложная схема, чтобы распутать себя. Очевидно, что имя начинается с «@», за ним следует имя модуля и имя функции, разделенные другим знаком «@». За именем функции следует «$ qqrx», а затем - типы параметров.
Типы параметров кодируются с использованием количества символов в имени типа, за которым следует тот же формат с разделителями «@», что и раньше.
$ " необходимо отметить конец имени функции и начало типов параметров. Оставшаяся загадка - это часть "qqrx". Об этом свидетельствует статья , которую нашел Тондрей . «Qqr» указывает соглашение о вызовах, которым в данном случае является регистр , он же fastcall . «X» относится к параметру и означает, что он постоянный.
Тип возвращаемого значения не нужно кодировать в искаженном имени функции, потому что перегрузка все равно не учитывает возвращаемые типы.
который в данном случае является регистром , он же fastcall . «X» относится к параметру и означает, что он постоянный.Тип возвращаемого значения не нужно кодировать в искаженном имени функции, потому что перегрузка в любом случае не учитывает возвращаемые типы.
который в данном случае является регистром , он же fastcall . «X» относится к параметру и означает, что он постоянный.Тип возвращаемого значения не нужно кодировать в искаженном имени функции, потому что перегрузка в любом случае не учитывает возвращаемые типы.
См. Также эту статью (на немецком языке). Я предполагаю, что изменение, вероятно, обратно совместимо, и новые схемы изменения представлены в более поздних версиях Delphi для новых языковых функций.
Из исходных файлов Delphi 2007:
function GetTableNameFromSQLEx(const SQL: WideString; IdOption: IDENTIFIEROption): WideString;
Похоже, это та же версия, поскольку у меня такой же .BPL есть в моем Windows \ System32 папка.
Исходный код можно найти в [Папки с программными файлами] \ CodeGear \ RAD Studio \ 5.0 \ source \ Win32 \ db
Borland / Codegear / Embarcadero уже некоторое время использует эту кодировку и никогда не давал подробных сведений о формат .BPL. Я' я никогда не интересовался ими, так как ненавижу использовать библиотеки времени выполнения в своих проектах. Я предпочитаю компилировать их в свои проекты, хотя в результате получаются гораздо большие исполняемые файлы.
Если у вас есть C ++ Builder, проверьте $ (BDS) \ source \ cpprtl \ Source \ misc \ unmangle.c - он содержит исходный код для механизма распутывания, используемого TDUMP, отладчиком и компоновщиком. (C ++ Builder и Delphi используют одну и ту же схему преобразования.)