|   <chapter id="mfc"> | 
 |     <title id="mfc.title">Dealing with the MFC</title> | 
 |  | 
 |     <sect1 id="mfc-introduction"> | 
 |       <title id="mfc-introduction.title">Introduction</title> | 
 |       <para> | 
 |         To use the MFC in a Winelib application you will first have to  | 
 |         recompile the MFC with Winelib. In theory it should be possible to  | 
 |         write a wrapper for the Windows MFC as described in  | 
 |         <xref linkend="bindlls" endterm="bindlls.title">. But in practice  | 
 |         it does not seem to be a realistic approach for the MFC:  | 
 |       </para> | 
 |       <itemizedlist> | 
 |         <listitem> | 
 |           <para> | 
 |             the huge number of APIs makes writing the wrapper a big task in  | 
 |             itself. | 
 |           </para> | 
 |         </listitem> | 
 |         <listitem> | 
 |           <para> | 
 |             furthermore the MFC contain a huge number of APIs which are tricky  | 
 |             to deal with when making a wrapper. | 
 |           </para> | 
 |         </listitem> | 
 |         <listitem> | 
 |           <para> | 
 |             even once you have written the wrapper you will need to modify  | 
 |             the MFC headers so that the compiler does not choke on them. | 
 |           </para> | 
 |         </listitem> | 
 |         <listitem> | 
 |           <para> | 
 |             a big part of the MFC code is actually in your application in  | 
 |             the form of macros. This means even more of the MFC headers have  | 
 |             to actually work to in order for you to be able to compile an  | 
 |             MFC based application. | 
 |           </para> | 
 |         </listitem> | 
 |       </itemizedlist> | 
 |       <para> | 
 |         This is why this guide includes a section dedicated to helping you  | 
 |         compile the MFC with Winelib. | 
 |       </para> | 
 |     </sect1> | 
 |  | 
 |     <sect1 id="mfc-legal-issues"> | 
 |       <title id="mfc-legal-issues.title">Legal issues</title> | 
 |       <para> | 
 |         (Extracted from the HOWTO-Winelib written by Wilbur Dale  | 
 |         <wilbur.dale@lumin.nl>) | 
 |       </para> | 
 |       <para> | 
 |         The purpose of this section is to make you aware of potential legal  | 
 |         problems. Be sure to read your licenses and to consult your lawyers.  | 
 |         In any case you should not consider the remainder of this section to  | 
 |         be authoritative since it has not been written by a lawyer. | 
 |       </para> | 
 |       <para> | 
 |         Well, let's try to have a look at the situation anyway. | 
 |       </para> | 
 |       <para> | 
 |         During the compilation of your program, you will be combining code  | 
 |         from several sources: your code, Winelib code, Microsoft MFC code,  | 
 |         and possibly code from other vendor sources. As a result, you must  | 
 |         ensure that the licenses of all code sources are obeyed. What you are  | 
 |         allowed and not allowed to do can vary depending on how you compile  | 
 |         your program and if you will be distributing it. For example, if you  | 
 |         are releasing your code under the GPL, you cannot link your code to  | 
 |         MFC code because the GPL requires that you provide ALL sources to your  | 
 |         users. The MFC license forbids you from distributing the MFC source so  | 
 |         you cannot both distribute your program and comply with the GPL  | 
 |         license. On the other hand, if your code is released under the LGPL,  | 
 |         you cannot statically link your program to the MFC and distribute it,  | 
 |         but you can dynamically link your LGPL code and the MFC library and  | 
 |         distribute it. | 
 |       </para> | 
 |       <para> | 
 |         Wine/Winelib is distributed under an X11-like license. It places few  | 
 |         restrictions on the use and distribution of Wine/Winelib code. I doubt  | 
 |         the Wine license will cause you any problems. On the other hand, MFC  | 
 |         is distributed under a very restrictive license and the restrictions  | 
 |         vary from version to version and between service packs. There are  | 
 |         basically three aspects you must be aware of when using the MFC. | 
 |       </para> | 
 |       <para> | 
 |         First you must legally get MFC source code on your computer. The MFC  | 
 |         source code comes as a part of Visual Studio. The license for  | 
 |         Visual Studio implies it is a single product that can not | 
 |         be broken up into its components. So the cleanest way to get MFC on  | 
 |         your system is to buy Visual Studio and install it on a dual boot  | 
 |         Linux box. | 
 |       </para> | 
 |       <para> | 
 |         Then you must check that you are allowed to recompile MFC on a | 
 |         non-Microsoft operating system! This varies with the version of MFC.  | 
 |         The MFC license from Visual Studio 6.0 reads in part: | 
 |       </para> | 
 |       <blockquote> | 
 |         <para> | 
 |           1.1 General License Grant. Microsoft grants to you as an | 
 |           individual, a personal, nonexclusive license to make and use | 
 |           copies of the SOFTWARE PRODUCT for the sole purposes of designing, | 
 |           developing, and testing your software product(s) that are designed | 
 |           to operate in conjunction with any Microsoft operating system | 
 |           product. [Other unrelated stuff deleted.] | 
 |         </para> | 
 |       </blockquote> | 
 |       <para> | 
 |         So it appears you cannot even compile MFC for Winelib using this | 
 |         license. Fortunately the Visual Studio 6.0 service pack 3 license  | 
 |         reads (the Visual Studio 5.0 license is similar): | 
 |       </para> | 
 |       <blockquote> | 
 |         <para> | 
 |           1.1 General License Grant. Microsoft grants to you as an | 
 |           individual, a personal, nonexclusive license to make and use | 
 |           copies of the SOFTWARE PRODUCT for the purpose of designing, | 
 |           developing, and testing your software product(s). [Other unrelated | 
 |           stuff deleted] | 
 |         </para> | 
 |       </blockquote> | 
 |       <para> | 
 |         So under this license it appears you can compile MFC for Winelib. | 
 |       </para> | 
 |       <para> | 
 |         Finally you must check whether you have the right to distribute an  | 
 |         MFC library. Check the relevant section of the license on  | 
 |         <quote>redistributables and your redistribution rights</quote>. The  | 
 |         license seems to specify that you only have the right to distribute  | 
 |         binaries of the MFC library if it has no debug information and if  | 
 |         you distribute it with an application that provides significant  | 
 |         added functionality to the MFC library. | 
 |         <!-- FIXME: quote relevant sections of EULA in above paragraph. --> | 
 |       </para> | 
 |     </sect1> | 
 |  | 
 |     <sect1 id="mfc-compiling"> | 
 |       <title id="mfc-compiling.title">Compiling the MFC</title> | 
 |       <para> | 
 |         Here is a set of recommendations for getting the MFC compiled with | 
 |         WineLib: | 
 |       </para> | 
 |       <para> | 
 |         We recommend running winemaker in | 
 |         '<option>--interactive</option>' mode to specify the right | 
 |         options for the MFC and the ATL part (to get the include paths | 
 |         right, to not consider the MFC MFC-based, and to get it to | 
 |         build libraries, not executables). | 
 |       </para> | 
 |       <para> | 
 |         Then when compiling it you will indeed need a number of | 
 |         <literal>_AFX_NO_XXX</literal> macros. But this is not enough | 
 |         and there are other things you will need to | 
 |         '<literal>#ifdef</literal>-out'.  For instance Wine's richedit | 
 |         support is not very good.  Here are the AFX options I use: | 
 |       </para> | 
 |       <para> | 
 |         <programlisting> | 
 | #define _AFX_PORTABLE | 
 | #define _FORCENAMELESSUNION | 
 | #define _AFX_NO_DAO_SUPPORT | 
 | #define _AFX_NO_DHTML_SUPPORT | 
 | #define _AFX_NO_OLEDB_SUPPORT | 
 | #define _AFX_NO_RICHEDIT_SUPPORT | 
 |         </programlisting> | 
 |       </para> | 
 |       <para> | 
 |         You will also need custom ones for | 
 |         <function>CMonikerFile</function>, <function>OleDB</function>, | 
 |         <function>HtmlView</function>, ... | 
 |       </para> | 
 |       <para> | 
 |         We recommend using Wine's msvcrt headers (<literal>-isystem | 
 |         $(WINE_INCLUDE_ROOT)/msvcrt</literal>), though it means you | 
 |         will have to temporarily disable winsock support | 
 |         (<literal>#ifdef</literal> it out in | 
 |         <filename>windows.h</filename>). | 
 |       </para> | 
 |       <para> | 
 |         You should use g++ compiler more recent than g++ 2.95. g++ | 
 |         2.95 does not support unnamed structs while the more recent | 
 |         ones do, and this helps a lot. Here are the options worth | 
 |         mentioning: | 
 |         <itemizedlist> | 
 |           <listitem> | 
 |             <para> | 
 |               <literal>-fms-extensions</literal> (helps get more code | 
 |               to compile) | 
 |             </para> | 
 |           </listitem> | 
 |           <listitem> | 
 |             <para> | 
 |               <literal>-fshort-wchar -DWINE_UNICODE_NATIVE</literal> | 
 |               (helps with Unicode support) | 
 |             </para> | 
 |           </listitem> | 
 |           <listitem> | 
 |             <para> | 
 |               <literal>-DICOM_USE_COM_INTERFACE_ATTRIBUTE</literal> | 
 |               (to get the COM code to work) | 
 |             </para> | 
 |           </listitem> | 
 |         </itemizedlist> | 
 |       </para> | 
 |       <para> | 
 |         When you first reach the link stage you will get a lot of | 
 |         undefined symbol errors. To fix these you will need to go back | 
 |         to the source and <literal>#ifdef</literal>-out more code | 
 |         until you reach a 'closure'. There are also some files that | 
 |         don't need to be compiled. | 
 |       </para> | 
 |       <para> | 
 |         Maybe we will have ready-made makefile here someday... | 
 |       </para> | 
 |     </sect1> | 
 |  | 
 |     <sect1 id="mfc-using"> | 
 |       <title id="mfc-using.title">Using the MFC</title> | 
 |       <para> | 
 |       </para> | 
 |       <para> | 
 |         Specific winemaker options,  | 
 |         the configure options,  | 
 |         the initialization problem... | 
 |       </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: | 
 | --> |