Ладно, думаю, я бы понял.
Я использую анонимный метод, поэтому компилятор должен перехватывать мои локальные переменные. По-видимому, он фиксирует только те переменные, которые я фактически использую в анонимном методе. Это означает, что CharPtr перехвачен, но не SendStr. Таким образом, когда SendStr выходит из области видимости, он разрушается, и CharPtr теперь может указывать на случайный мусор.
со следующей модификацией
ExecuteInBackgroundThread (
procedure
begin
Log (Str);
DoSomething (CharPtr);
end);
все вроде нормально работает.