Because PrtInfo is a structure, when you pass it you're passing a pointer to the first item in the structure (I think), rather than a pointer to the structure of pointers. Try passing the address explicitly like

Dim ptrPrinter as long
ptrPrinter = ObjPtr(PrtInfo)
ReturnValue = AddPrinter("", 2, ptrPrinter)