OSDN Git Service

* faq-programming.xml (faq.programming.win32-api): Remove simplicity.
authorcorinna <corinna>
Fri, 13 Aug 2010 11:52:13 +0000 (11:52 +0000)
committercorinna <corinna>
Fri, 13 Aug 2010 11:52:13 +0000 (11:52 +0000)
Add note and xrefs to User's Guide chapters explaining restrictions
using the Win32 API.
* new-features.sgml (ov-new1.7.6): Add note about Win CWD.
* overview2.sgml (ov-hi-intro): Add note and xrefs about Win32 API
restrictions.  Tone down flexibility.
* pathnames.sgml (pathnames-intro): Add xref to pathnames-win32-api
section.
(pathnames-win32-api): New section describing Win32 CWD restriction.
* setup2.sgml (setup-env-ov): New sub-section.
(setup-env-win32): Ditto, describing Win32 environment restriction.

winsup/doc/ChangeLog
winsup/doc/faq-programming.xml
winsup/doc/new-features.sgml
winsup/doc/overview2.sgml
winsup/doc/pathnames.sgml
winsup/doc/setup2.sgml

index 2bbe053..0b1a8c6 100644 (file)
@@ -1,3 +1,17 @@
+2010-08-13  Corinna Vinschen  <corinna@vinschen.de>
+
+       * faq-programming.xml (faq.programming.win32-api): Remove simplicity.
+       Add note and xrefs to User's Guide chapters explaining restrictions
+       using the Win32 API.
+       * new-features.sgml (ov-new1.7.6): Add note about Win CWD.
+       * overview2.sgml (ov-hi-intro): Add note and xrefs about Win32 API
+       restrictions.  Tone down flexibility.
+       * pathnames.sgml (pathnames-intro): Add xref to pathnames-win32-api
+       section.
+       (pathnames-win32-api): New section describing Win32 CWD restriction.
+       * setup2.sgml (setup-env-ov): New sub-section.
+       (setup-env-win32): Ditto, describing Win32 environment restriction.
+
 2010-08-11  Corinna Vinschen  <corinna@vinschen.de>
 
        * new-features.sgml (ov-new1.7.6): Document "bind" option.
index 3936dbc..3314547 100644 (file)
@@ -172,10 +172,10 @@ gcj --main=Hello Hello.java
 <question><para>How do I use Win32 API calls?</para></question>
 <answer>
 
-<para>It's pretty simple actually.  Cygwin tools require that you explicitly
-link the import libraries for whatever Win32 API functions that you
-are going to use, with the exception of kernel32, which is linked
-automatically (because the startup and/or built-in code uses it).
+<para>Cygwin tools require that you explicitly link the import libraries
+for whatever Win32 API functions that you are going to use, with the exception
+of kernel32, which is linked automatically (because the startup and/or
+built-in code uses it).
 </para>
 <para>For example, to use graphics functions (GDI) you must link
 with gdi32 like this:
@@ -194,6 +194,12 @@ including user32, gdi32 and, IIRC, comdlg32.
 <para>It is a good idea to put import libraries last on your link line,
 or at least after all the object files and static libraries that reference them.
 </para>
+
+<note><para>There are a few restrictions for calls to the Win32 API.
+For details, see the User's Guide section
+<ulink url="http://cygwin.com/cygwin-ug-net/setup-env.html#setup-env-win32">Restricted Win32 environment</ulink>,
+as well as the User's Guide section
+<ulink url="http://cygwin.com/cygwin-ug-net/using.html#pathnames-win32-api">Using the Win32 file API in Cygwin applications</ulink>.</para></note>
 </answer></qandaentry>
 
 <qandaentry id="faq.programming.win32-no-cygwin">
index 049183f..0a1f9ac 100644 (file)
@@ -47,6 +47,13 @@ New virtual file /proc/filesystems.
 clock_gettime(3) and clock_getres(3) accept CLOCK_MONOTONIC.
 </para></listitem>
 
+<listitem><para>
+Cygwin handles the current working directory entirely on its own.  The Win32
+current working directory is set to an invalid path to be out of the way.
+This affects calls to the Win32 file API (CreateFile, etc.).  See
+<xref linkend="pathnames-win32-api"></xref> for details.
+</para></listitem>
+
 </itemizedlist>
 
 </sect2>
index b0e3635..b89799e 100644 (file)
@@ -55,9 +55,8 @@ an easy way to port many UNIX packages, with only minimal source code
 changes.
 </para>
 <para>
-Note that there are some workarounds
-that cause Cygwin to behave differently than most UNIX-like operating
-systems; these are described in more detail in 
+Note that there are some workarounds that cause Cygwin to behave differently
+than most UNIX-like operating systems; these are described in more detail in 
 <xref linkend="using-effectively"></xref>.
 </para>
 <para>
@@ -111,11 +110,15 @@ appropriate.</para>
 
 <para>Because processes run under the standard Win32 subsystem, they
 can access both the UNIX compatibility calls provided by Cygwin as well as
-any of the Win32 API calls.  This gives the programmer complete flexibility in
+any of the Win32 API calls.  This gives the programmer some flexibility in
 designing the structure of their program in terms of the APIs used.  For
 example, they could write a Win32-specific GUI using Win32 API calls on top of
 a UNIX back-end that uses Cygwin.</para>
 
+<note><para>Some restrictions apply for calls to the Win32 API.
+For details, see <xref linkend="setup-env-win32"></xref>,
+as well as <xref linkend="pathnames-win32-api"></xref>.</para></note>
+
 <para>The native NT API is used mainly for speed, as well as to access
 NT capabilities which are useful to implement certain POSIX features, but
 are hidden to the Win32 API.
index 2d03962..da8e4c1 100644 (file)
@@ -11,7 +11,8 @@ paths and file access might fail in surprising ways.  UNC pathnames
 
 <note><para>The usage of Win32 paths, though possible, is deprecated,
 since it circumvents important internal path handling mechanisms. 
-See <xref linkend="pathnames-win32"></xref> for more information.
+See <xref linkend="pathnames-win32"></xref> and
+<xref linkend="pathnames-win32-api"></xref> for more information.
 </para></note>
 
 <para>POSIX operating systems (such as Linux) do not have the concept
@@ -363,6 +364,38 @@ permissions.</para>
 
 </sect2>
 
+<sect2 id="pathnames-win32-api"><title>Using the Win32 file API in Cygwin applications</title>
+
+<para>Special care must be taken when your application uses Win32 file API
+functions like <function>CreateFile</function> to access files using relative
+pathnames.</para>
+
+<para>When a Cygwin application is started, the Win32 idea of the current
+working directory (CWD) is set to an invalid directory.  This works around
+the problem that the Win32 CWD is locked in a way which restricts POSIX
+functionality.  However, the side effect is that a call to, say,
+<function>CreateFile ("foo", ...);</function> will fail, since the Win32
+notion of the CWD is <emphasis>not</emphasis> the same as the Cygwin notion
+of the CWD.</para>
+
+<para>So, in general, don't use the Win32 file API in Cygwin applications.
+If you <emphasis>really</emphasis> need to access files using the Win32 API,
+and if you <emphasis>really</emphasis> have to use relative pathnames,
+you have two choices.</para>
+
+<itemizedlist spacing="compact">
+  <listitem>
+    <para>Either you call <function>SetCurrentDirectory</function> before
+    calling <function>CreateFile</function>.</para>
+  </listitem>
+  <listitem>
+    <para>Or you compile your application as native Win32 (mingw) executable,
+    rather than as Cygwin executable.</para>
+  </listitem>
+</itemizedlist>
+
+</sect2>
+
 <sect2 id="pathnames-additional"><title>Additional Path-related Information</title>
 
 <para>The <command>cygpath</command> program provides the ability to
index 6d00aa8..692501a 100644 (file)
@@ -1,5 +1,7 @@
 <sect1 id="setup-env"><title>Environment Variables</title>
 
+<sect2 id="setup-env-ov"><title>Overview</title>
+
 <para>
 You may wish to specify settings of several important environment
 variables that affect Cygwin's operation.  Some of these settings need
@@ -99,6 +101,34 @@ export TEMP=/tmp
 </screen>
 </para>
 
+</sect2>
+
+<sect2 id="setup-env-win32"><title>Restricted Win32 environment</title>
+
+<para>There is a restriction when calling Win32 API functions which
+require a fully set up application environment.  Cygwin maintains its own
+environment in POSIX style.  The Win32 environment is usually stripped
+to a bare minimum and not at all kept in sync with the Cygwin POSIX
+environment.</para>
+
+<para>If you need the full Win32 environment set up in a Cygwin process,
+you have to call</para>
+
+<screen>
+#include &lt;sys/cygwin.h&gt;
+
+cygwin_internal (CW_SYNC_WINENV);
+</screen>
+
+<para>to synchronize the Win32 environment with the Cygwin environment.
+Note that this only synchronizes the Win32 environment once with the
+Cygwin environment.  Later changes using the <function>setenv</function>
+or <function>putenv</function> calls are not reflected in the Win32
+environment.  In these cases, you have to call the aforementioned
+<function>cygwin_internal</function> call again.</para>
+
+</sect2>
+
 </sect1>
 
 <sect1 id="setup-maxmem"><title>Changing Cygwin's Maximum Memory</title>