mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 04:39:45 +00:00
6a748376ef
Developers Guide.
220 lines
8.9 KiB
Plaintext
220 lines
8.9 KiB
Plaintext
<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:
|
|
-->
|