GMEM_FIXEDで確保して、帰り値をポインタとして使ってるんだよね?
それで問題無いと思うよ。

同じ事をDLLでなくDelphi側で試験コード作ってやってみたら?

それで問題無いなら、たぶんDLLの呼び出し時のミスだと思うよ。
cdeclとかの呼び出し規則のミスか 構造体のアライメントのミスか