  <chapter id="portability-issues">
    <title id="portability-issues.title">Portability issues</title>

    <sect1 id="anon">
      <title id="anon.title">Anonymous unions/structs</title>
      <para>
        Anonymous structs and unions support depends heavily on the compiler.
        The best support is provided by gcc/g++ 2.96 and later. But these
        versions of gcc come from the development branch so you may want to
        hold off before using them in production. g++ 2.95 supports anonymous
        unions but not anonymous structs and gcc 2.95 supports neither. Older
        versions of gcc/g++ have no support for either.
        since it is anonymous unions that are the most frequent in the
        windows headers, you should at least try to use gcc/g++ 2.95.
      </para>
      <para>
        But you are stuck with a compiler that does not support anonymous
        structs/unions all is not lost. The Wine headers should detect this
        automatically and define <varname>NONAMELESSUNION</varname> /
        <varname>NONAMELESSSTRUCT</varname>. Then any anonymous union will
        be given a name
        <literal>u</literal> or <literal>u2</literal>, <literal>u3</literal>,
        etc. to avoid name clashes. You will then have to modify your code to
        include those names where appropriate.
      </para>
      <para>
        The name that Wine adds to anonymous unions should match that used
        by the Windows headers. So all you have to do to compile your
        modified code in Windows is to explicitly define the
        <varname>NONAMELESSUNION</varname> macro. Note that it would be wise
        to also explicitly define this macro on in your Unix makefile
        (<filename>Makefile.in</filename>) to make sure your code will
        compile even if the compiler does support anonymous unions.
      </para>
      <para>
        Things are not as nice when dealing with anonymous structs.
        Unfortunately the Windows headers make no provisions for compilers
        that do not support anonymous structs. So you will need to be more
        subtle when modifying your code if you still want it to compile in
        Windows. Here's a way to do it:
      </para>
      <programlisting>
#ifdef WINELIB
#define ANONS .s
#else
#define ANONS
#endif

. . .

{
SYSTEM_INFO si;
GetSystemInfo(&amp;si);
printf("Processor architecture=%d\n",si ANONS .wProcessorArchitecture);
}
      </programlisting>
      <para>
        You may put the <literal>#define</literal> directive directly in the
        source if only few files are impacted. Otherwise it's probably best
        to put it in one of your project's widely used headers.
        Fortunately usage of an anonymous struct is much rarer than usage of
        an anonymous union so these modifications should not be too much work.
      </para>
    </sect1>

    <sect1 id="unicode">
      <title id="unicode.title">Unicode</title>

      <para>
        Because gcc and glibc use 4 byte unicode characters, the
        compiler intrinsic <literal>L"foo"</literal> generates unicode
        strings which cannot be used by Winelib (Win32 code expects 16
        bit unicode characters). There are 3 workarounds for this:
      </para>

      <orderedlist>
        <listitem>
          <para>
            Use the latest gcc version (2.9.7 or later), and pass the
            <parameter>-fshort-wchar</parameter> option to every file
            that is built.
          </para>
        </listitem>
        <listitem>
          <para>
            Use the <function>__TEXT("foo")</function> macro, define
            <constant>WINE_UNICODE_REWRITE</constant> for each file
            that is built, and add
            <parameter>-fwritable-strings</parameter> to the compiler
            command line. You should replace all occurances of
            <type>wchar_t</type> with <type>WCHAR</type> also, since
            <type>wchar_t</type> is the native (32 bit) type. These
            changes allow Wine to modify the native unicode strings
            created by the compiler in place, so that they are 16 bit
            by the time any functions get to use them. This scheme
            works with older versions of gcc (2.95.x+).
          </para>
        </listitem>
        <listitem>
          <para>
            Use the compiler default, but don't call any Win32 unicode
            function without converting the strings first!
          </para>
        </listitem>
      </orderedlist>

      <para>
        If you are using Unicode and you want to be able to use
        standard library calls (e.g. <function>wcslen</function>,
        <function>wsprintf</function>) as well as Win32 unicode calls
        (API functions ending in W, or having
        <constant>_UNICODE</constant> defined), then you should use
        the msvcrt runtime library instead of glibc. The functions in
        glibc will not work correctly with 16 bit strings.
      </para>
      <para>
        If you need a Unicode string even when
        _<constant>UNICODE</constant> isn't defined, use
        <function>WINE_UNICODE_TEXT("foo")</function>. This will need
        to be wrapped in <function>#ifdef WINELIB</function> to
        prevent breaking your source for windows compiles.
      </para>
      <para>
        To prevent warnings when declaring a single unicode character
        in C, use <function>(WCHAR)L'x'</function>, rather than
        <function>__TEXT('x')</function>.  This works on Windows also.
      </para>
    </sect1>

    <sect1 id="C-library">
      <title id="C-library.title">C library</title>

      <!-- *** Is all of this covered now?  Make sure before deleting ***
      <para>
        Winelib currently only supports on C library: that of your
        compiler.  three solutions: native, mixed or msvcrt except we
        only have native right now, using the native C library ->
        different behavior: fopen, O_TEXT, unicode support,
        reimplement msvcrt
      </para>
      -->

      <para>
        There are 3 choices available to you regarding which C library
        to use:
      </para>

      <orderedlist>
        <listitem>
          <para>
            Use the glibc native C library.
          </para>
        </listitem>
        <listitem>
          <para>
            Use the msvcrt C library.
          </para>
        </listitem>
        <listitem>
          <para>
            Use a custom mixture of both.
          </para>
        </listitem>
      </orderedlist>

      <para>
        Note that under Wine, the crtdll library is implemented using
        msvcrt, so there is no benefit in trying to use it.
      </para>
      <para>
        Using glibc in general has the lowest overhead, but this is
        really only important for file I/O. Many of the functions in
        msvcrt are simply resolved to glibc, so in reality options 2
        and 3 are fairly similar choices.
      </para>
      <para>
        To use glibc, you don't need to make changes to your
        application; it should work straight away. There are a few
        situations in which using glibc is not possible:
      </para>
      <orderedlist>
        <listitem>
          <para>
            Your application uses Win32 and C library unicode
            functions.
          </para>
        </listitem>
        <listitem>
          <para>
            Your application uses MS specific calls like
            <function>beginthread()</function>,
            <function>loadlibrary()</function>, etc.
          </para>
        </listitem>
        <listitem>
          <para>
            You rely on the precise semantics of the calls, for
            example, returning <literal>-1</literal> rather than
            non-zero. More likely, your application will rely on calls
            like <function>fopen()</function> taking a Windows path
            rather than a Unix one.
          </para>
        </listitem>
      </orderedlist>
      <para>
        In these cases you should use msvcrt to provide your C runtime
        calls. To do this, add a line:
      </para>

      <programlisting>import msvcrt.dll</programlisting>

      <para>
        to your applications <filename>.spec</filename> file. This
        will cause <command>winebuild</command> to resolve your c
        library calls to <filename>msvcrt.dll</filename>. Many simple
        calls which behave the same have been specified as
        non-importable from msvcrt; in these cases
        <command>winebuild</command> will not resolve them and the
        standard linker <command>ld</command> will link to the glibc
        version instead.
      </para>
      <para>
        In order to avoid warnings in C (and potential errors in C++)
        from not having prototypes, you may need to use a set of MS
        compatable header files. These are scheduled for inclusion
        into Wine but at the time of writing are not available. Until
        they are, you can try prototyping the functions you need, or
        just live with the warnings.
      </para>
      <para>
        If you have a set of include files (or when they are available
        in Wine), you need to use the <parameter>-isystem
        "include_path"</parameter> flag to gcc to tell it to use your
        headers in preference to the local system headers.
      </para>
      <para>
        To use option 3, add the names of any symbols that you don't
        want to use from msvcrt into your applications
        <filename>.spec</filename> file. For example, if you wanted
        the MS specific functions, but not file I/O, you could have a
        list like:
      </para>

      <programlisting>@ignore = ( fopen fclose fwrite fread fputs fgets )</programlisting>
      <para>
        Obviously, the complete list would be much longer. Remember
        too that some functions are implemented with an underscore in
        their name and <function>#define</function>d to that name in
        the MS headers. So you may need to find out the name by
        examing <filename>dlls/msvcrt/msvcrt.spec</filename> to get
        the correct name for your <function>@ignore</function> entry.
      </para>
    </sect1>

    <sect1 id="porting-compiling">
      <title id="porting-compiling.title">Compiling Problems</title>
      <para>
        If you get undefined references to Win32 API calls when
        building your application: if you have a VC++
        <filename>.dsp</filename> file, check it for all the
        <filename>.lib</filename> files it imports, and add them to
        your applications <filename>.spec</filename>
        file. <command>winebuild</command> gives you a warning for
        unused imports so you can delete the ones you don't need
        later. Failing that, just import all the DLL's you can find in
        the <filename>dlls/</filename> directory of the Wine source
        tree.
      </para>
      <para>
        If you are missing GUIDs at the link stage, add
        <parameter>-lwine_uuid</parameter> to the link line.
      </para>
      <para>
        gcc is more strict than VC++, especially whan compiling
        C++. This may require you to add casts to your C++ to prevent
        overloading abiguities between similar types (such as two
        overloads that take int and char respectively).
      </para>
      <para>
        If you come across a difference between the Windows headers
        and Wine's that breaks compilation, try asking for help on
        <email>wine-devel@winehq.com</email>.
      </para>
    </sect1>

    <sect1 id="init-problems">
      <title id="init-problems.title">Initialization problems</title>
      <para>
        Initialization problems occur when the application calls the Win32 API
        before Winelib has been initialized. How can this happen?
      </para>
      <para>
        Winelib is initialized by the application's <function>main</function>
        before it calls the regular <function>WinMain</function>. But, in C++,
        the constructors of static class variables are called before the
        <function>main</function> (by the module's initializer). So if such
        a constructor makes calls to the Win32 API, Winelib will not be
        initialized at the time of the call and you may get a crash. This
        problem is much more frequent in C++ because of these class
        constructors but could also, at least in theory, happen in C if you
        were to specify an initializer making calls to Winelib. But of
        course, now that you are aware of this problem you won't do it :-).
      </para>
      <para>
        Further compounding the problem is the fact that Linux's (GNU's?)
        current dynamic library loader does not call the module
        initializers in their dependency order. So even if Winelib were to
        have its own initializer there would be no garantee that it would be
        called before the initializer of the library containing this static
        variable. Finally even if the variable is in a library that your
        application links with, that library's initializer may be called
        before Winelib has been initialized. One such library is the MFC.
      </para>
      <para>
        The current workaround is to move all the application's code in a
        library and to use a small Winelib application to dynamically load
        this library. Tus the initialization sequence becomes:
      </para>
      <itemizedlist>
        <listitem>
          <para>
            the wrapper application starts.
          </para>
        </listitem>
        <listitem>
          <para>
            its empty initializer is run.
          </para>
        </listitem>
        <listitem>
          <para>
            its <function>main</function> is run. Its first task is to
            initialize Winelib.
          </para>
        </listitem>
        <listitem>
          <para>
            it then loads the application's main library, plus all its
            dependent libraries.
          </para>
        </listitem>
        <listitem>
          <para>
            which triggers the execution of all these libraries initializers
            in some unknown order. But all is fine because Winelib has
            already been initialized anyway.
          </para>
        </listitem>
        <listitem>
          <para>
            finally the main function calls the <function>WinMain</function>
            of the application's library.
          </para>
        </listitem>
      </itemizedlist>
      <para>
        This may sound complex but Winemaker makes it simple. Just specify
        <option>--wrap</option> or <option>--mfc</option> on the command line
        and it will adapt its makefiles to build the wrapper and the
        application library.
      </para>
    </sect1>

    <sect1 id="com-support">
      <title id="com-support.title">VC's native COM support</title>
      <para>
        don't use it,
        guide on how to replace it with normal C++ code (yes, how???):
        extracting a .h and .lib from a COM dll
        Can '-fno-rtti' be of some use or even required?
      </para>
    </sect1>

    <sect1 id="SEH">
      <title id="SEH.title">SEH</title>
      <para>
        how to modify the syntax so that it works both with gcc's macros and Wine's macros,
        is it even possible?
      </para>
    </sect1>

    <sect1 id="others">
      <title id="others.title">Others</title>
      <para>
        -fpermissive and -fno-for-scope,
        maybe other options
      </para>
    </sect1>
  </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
End:
-->
