Pseudotypes

Description
For advanced programmers. The pseudotypes are a way to ease the programming when dealing with external libraries which need datatypes that are not internally supported by PureBasic. In this case, it is possible to use the predefined pseudotype which will do the appropriate conversion on the fly, without extra work. As they are not 'real' types, the chosen naming scheme is explicitly different: a 'p-' prefix (for 'pseudo') is part of the type name. The available pseudotypes are:
  p-ascii: acts as a string type, but will always convert the string to ascii before
           calling the function, even when the program is compiled in unicode mode. 
           It is very useful when accessing a shared library which doesn't have unicode 
           support in an unicode program for example.
           
  p-utf8: acts as a string type, but will always convert the string to utf8 before calling the
          function. It is very useful when accessing a shared library which needs its unicode
          string be passed as UTF8 instead of ascii or unicode strings.

  p-bstr: acts as a string type, but will always convert the string to bstr before calling the
          function. It is very useful when accessing a shared library which needs bstr parameters,
          like COM components.

  p-unicode: acts as a string type, but will always convert the string to unicode before
             calling the function, even when the program is compiled in ascii mode. 
             It is very useful when accessing a shared library which only supports unicode
             in an ascii program for example.

  p-variant: acts as a numeric type, will adjust the function call to use the variant parameter
             correctly. It is very useful when accessing a shared library which needs 'variant' parameters,
             like COM components.
The pseudotypes can only be used with prototypes, interfaces and imported functions. The pseudotypes does the appropriate conversion only if it is necessary: for example using a 'p-ascii' pseudotype in an ascii compiled program makes no difference with regular string type.

Example

  Import "User32.lib"
   
    ; We use the 'p-unicode' pseudotype for the string parameters, as
    ; MessageBoxW() is an unicode only function. The compiler will 
    ; automatically converts the strings to unicode when needed.
    ;
    MessageBoxW(Window.i, Body.p-unicode, Title.p-unicode, Flags.i = 0)
                                                  
  EndImport
  
  ; It will work correctly in ascii and in unicode mode, even if the API is unicode
  ; only as the compiler will take care of the conversion itself.
  ;
  MessageBoxW(0, "Hello", "World")