Reini Urban rur...@cpan.org
> On Nov 26, 2017, at 11:37 AM, Kenneth Ölwing <kenn...@olwing.se> wrote: > > > Hi, > > I'm wracking my brain to get the most convenient and correct naming for a > module (or actually, a couple of them). They are Windows specific, and > furthermore, while Win32:: is an established toplevel namespace, I'd ideally > want 'Windows::' at the top in order to begin to break free of the notion of > being just for 32-bit, as 64-bit nowadays is the norm. Still, my module (and > many others) will work for either, so it'd make sense to just be general and > say 'Windows'… Win32 is still the preferred namespace for everything windows related, 32 or 64bit. Even on official 64bit windows. > Anyway, my impetus was a need for a module to handle transferrals of > 'security contexts' between hosts - basically a way to do single sign on in a > Windows environment. I found Win32::IntAuth which is doing that, but 1) it > doesn't work on 64-bit, and 2) it's missing needed stuff like passing token > buffers back and forth during authentication. In short, I think it can be > done better. In any case, the naming for this particular module is not really > my focus now. So why just don't you fix Win32::IntAuth for 64bit and add the missing stuff? > While developing a prototype for the above, I need to use the DLL API's for > the security subsystem, e.g. SSPI stuff. This API is fairly hairy and > requires dealing with dynamic buffers, pointers to same, OUT parameters, and > other messiness generally easier to do in C. But I want to avoid C code - it > can be done in Perl with the help of the raw Win32::API (which, despite it's > name, works in 64 bit too). > > While mapping the needs I had in how to get the right Win32::API constructs, > I realized that it would help if I could have a generic helper mapping > against Win32::API, which would also handle some things that Win32::API > doesn't directly parse, and also perform the registration of function > callpoints, exports/imports of function names etc. Also, there's a zillion > possible DLL's in Windows (and every DLL with another zillion of various > functions that can be called) that eventually would be nice to have premade > wrappers for. And Windows provided DLL's are not all - there's a large world > out there with custom DLL's. That’s why you do the probing with an XS module at compile-time, the right dll is searched automatically by the compiler from the generic import library .lib. The dynamic nature of Win32::API makes it very fragile. > I figure it would be wasteful for a number of modules that each did the setup > using Win32::API and the necessary glue to call the various functions in API > DLL's, while we could have a single module that (eventually, as-needed) could > define Perl wrappers to handle these calls for reuse. Modules would be freed > from the minutiae of generally interfacing with Win32::API and could > concentrate on the intricacies of getting the params right. Actually, for > most/many functions, it would be nice to have more Perlish interfaces, e.g. > many DLL functions are quite multipurpose and allows many params to be NULL > or can otherwise be defaulted depending on other calls (e.g. passing in a > buffer and the size of the buffer is required in C, but in Perl the size of > the buffer is known and so the wrapper only needs the buffer). Other examples > are the proliferation of xxxA and xxxW calls, i.e. calls that accept single > byte chars vs multibyte chars. Since Perl knows how to encode/decode the xxxA > entrypoints aren't really needed. > > So, at present I'm thinking of the module 'Windows::API::Wrap', which would > contain things like 'Windows::API::Wrap::Constants::MB' (the MB_OK, MB_CANCEL > constant values etc used when calling the MessageBox function), and > 'Windows::API::Wrap::DLL::User32', a Perlish API to User32 that in turn uses > 'Windows::API::Wrap::DLL::RAW::User32' which has the more exact C counterpart > which can also be used by others if they need that exact control. (The DLL is > still called 'User32' in 64 bit for back compat reasons). In time, it would > be 'simple' to add further DLL's and functions wrappers. > > The other alternative I've come up with would be 'Win32::API::Wrap'. While > using an established namespace, I'm not sure if it's good form to encroach > upon the Win32::API namespace. > > If anyone has any opionions on the matter I would love to hear. I don’t like this idea of your at all. Such a wrapper is one line in XS, and much more stable. And since strawberry and activestate ships with the compiler, everybody can install it.