| <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> | |
| 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> | |
| 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 combine | |
| the code and if you will be distributing it. For example, if you | |
| are releasing your code under the GPL or LGPL, you cannot use MFC | |
| because these licenses do not allow covered code to depend on | |
| libraries with non-compatible licenses. | |
| There is a workaround - in the license for your | |
| code you can make an exception for the MFC library. | |
| For details see | |
| <ulink url="http://www.gnu.org/licenses/gpl-faq.html">The GNU GPL FAQ</ulink>. | |
| </para> | |
| <para> | |
| Wine/Winelib is distributed under the GNU Lesser General Public | |
| License. See the license for restrictions on the modification and | |
| distribution of Wine/Winelib code. In general it is possible to | |
| satisfy these restrictions in any type of application. | |
| 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> | |
| </chapter> | |
| <!-- Keep this comment at the end of the file | |
| Local variables: | |
| mode: sgml | |
| sgml-parent-document:("winelib-user.sgml" "book" "chapter" "") | |
| End: | |
| --> |