O retorno da hb_dynCall() sempre será numérico, nunca lógico. O problema é realmente encontrar documentação dessa função. Não se acha nem nos grupos do Harbour.
O retorno depende da DLL, e geralmente é um tipo em C que é convertido pra Harbour.
.T. ou .F. pode ser 0 ou 1, ou algo parecido.
GetParent, que está em user32.dll
hWndParent := hb_DynCall( { "GetParent", "user32.dll", HB_DYN_CALLCONV_STDCALL }, hWnd )
Ela recebe um parâmetro num formato, e devolve outro parâmetro, por coincidência no mesmo formato.
GetModuleFileNameA, em kernel32.dll
LOCAL cFileName := Space(100), nSize := 100
hb_DynCall( { "GetModuleFileNameA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, , @cFileName, nSize )
Ela recebe o "pointer" da string aonde vai armazenar o nome do EXE.
O pointer é algo como um endereço de memória.
Se não passar como pointer, ou não couber o nome do EXE nesse espaço de variável, é GPF, porque o resultado pode invadir o espaço de outra variável.
Até por isso existe a HBWIN, que tem funções intermediárias pra API do Windows já com algum tpo de conversão, pra evitar GPF.
Isso tudo não é hb_DynCall() que decide, é a função dentro da DLL.
O máximo que pode acontecer, é converter o resultado para algum tipo conhecido pelo Harbour.
Cada função de cada DLL tem suas exigências/parâmetros/retornos, e cabe ao desenvolvedor da DLL apresentar um manual de uso.
Se a função em questão retorna -2000, isso está longe de ser .T. ou .F.
Não precisa manual da hb_DynCall, precisa manual da DLL.