Something I've done wrong?
Yes. You are using StrPtr wrongly in all cases except one.

hStatus = GdipCreateFontFamilyFromName(ByVal StrPtr(strFontName), %NULL, ByVal StrPtr(pFontFamily ) )
must be

   hStatus = GdipCreateFontFamilyFromName(ByVal StrPtr(strFontName), %NULL, pFontFamily )
or

   hStatus = GdipCreateFontFamilyFromName(ByVal StrPtr(strFontName), %NULL, ByVal VarPtr(pFontFamily ) )
etc.

StrPtr is only for strings. It means string pointer.