| <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: |
| --> |