Eigentlich meinte ich, warum du den Funktionskopf nicht so realisierst und den alten Body beibehälst:
procedure ThreadProcedure(Info : TThreadInfo); stdcall;
Da TThreadInfo für sich bereits ein Pointer ist, er wird lediglich benutzt als wäre er keiner.
Was du machst ist Pointer auf Pointer und das hab ich eigenlich seit Stringtabellen in C nicht mehr gebraucht (oder zumindest so gut wie nie, es gibt ja noch andere Arten mehrdimensionaler arrays).