Последняя версия Delphi, Delphi 2009, имеет свойство класса CurrentThread на классе TThread.
Это возвратит надлежащий объект потока Delphi, если это будет собственный поток. Если поток будет "посторонним" потоком, т.е. созданным использованием некоторого другого механизма или на обратном вызове от стороннего потока, то он создаст поток обертки вокруг дескриптора потока.
Из Вашего собственного ответа это кажется, возможно, что Вы только хотите "определить при выполнении в основном потоке или не", в этом случае можно просто использовать
if Windows.GetCurrentThreadId() = System.MainThreadID then
// ...
, Хотя это не будет работать от DLL, созданного с Delphi, если это было загружено рабочим потоком.
Я использую своего собственного потомка TThread, который регистрирует себя в глобальном списке, защищенном с блокировкой.
Тот путь, метод в этом потомке может обойти список и добраться, TThread дают идентификатор.
Ответ на мой собственный вопрос. Я предполагаю, что не возможно получить объект TThread из идентификатора. Это возможно при помощи глобальной переменной. Затем сравнивая его дескриптор и идентификатор текущего потока, можно определить при выполнении в основном потоке или нет.
Разве текущее выполнение не распараллелило бы быть тем, от которого Вы пытаетесь выполнить функцию?
Вы могли сохранить указатель экземпляра TThread в контексте текущего потока через вызов API TlsSetValue и затем получить его с помощью TlsGetValue. Однако обратите внимание, что это будет только работать, при попытке получать/хранить экземпляр TThread текущий поток.