if I did anything to the value in Perl that caused perl to look at it as anything other than an unsigned integer, and by the time that value got back to the C code it could be corrupted
Yes, that would not be nice :-(
aren't unsigned long different sizes on 64-bit *nix and Windows?
I think that's generally (perhaps universally) so. I do know that the long type on my 64-bit Ubuntu box is 64 bits, but 32-bits on 64-bit Windows. This is not so much of a consideration as regards Windows HANDLEs specifically, but is of relevance in general.