Send a crash report when a hung process is detected.
[chromium-blink-merge.git] / native_client_sdk / src / doc / devguide / devcycle / vs-addin.rst
blob996fa827bed15ff6d479c8e204f36335d4d55abb
1 .. _devcycle-vs-addin:
3 ############################
4 Debugging with Visual Studio
5 ############################
8 .. contents:: Table Of Contents
9   :local:
10   :backlinks: none
11   :depth: 2
13 Whether you're porting an existing project or starting from scratch, the Native
14 Client Visual Studio add-in makes it easier to set up, build, run and debug
15 your Native Client app by integrating the Native Client SDK development tools
16 into the Visual Studio environment.
18 .. Note::
19   :class: note
21   The Native Client add-in requires Visual Studio 2012 or Visual Studio 2010
22   with Service Pack 1. No other versions of Visual Studio are currently
23   supported. Visual Studio Express is also not supported.
25 Introduction
26 ============
28 The Native Client add-in for Visual Studio helps you develop your application
29 more efficiently in many ways:
31 * Organize and maintain your code as a Visual Studio project.
32 * Iteratively write and test your application more easily. Visual Studio
33   handles the details of launching a web server to serve your module and run
34   the module in Chrome with a debugger attached.
35 * Compile your module into a dynamically-linked library (DLL) using Visual
36   Studio's C/C++ compiler and run it as a Pepper plugin. This allows you to
37   develop code incrementally, coding and/or porting one feature at a time into
38   the Pepper APIs while continuing to use native Windows APIs that would
39   otherwise be unavailable in an actual Native Client module.
40 * Use Visual Studio's built-in debugger to debug your code while it’s running
41   as a Pepper plugin.
42 * Compile your module into a .nexe or .pexe file using the Native Client SDK
43   tools and run it as a bona fide Native Client module.
44 * Use the Native Client debugger, nacl-gdb, to test your code when it’s running
45   as a Native Client object.
47 The add-in defines five new Visual Studio platforms: ``PPAPI``, ``NaCl32``,
48 ``NaCl64``, ``NaClARM``, and ``PNaCl``. These platforms can be applied to the
49 debug configuration of solutions and projects. The platforms configure the
50 properties of your project so it can be built and run as either a Pepper plugin
51 or a Native Client module. The platforms also define the behavior associated
52 with the debug command so you can test your code while running in Visual
53 Studio.
55 Platforms
56 =========
58 It is helpful to consider the Visual Studio add-in platforms in two groups. One
59 contains the PPAPI platform only. The other group, which we'll call the Native
60 Client platforms, contains platforms that all have "NaCl" in their names:
61 ``NaCl32``, ``NaCl64``, ``NaClARM``, and ``PNaCl``. The diagram below shows the
62 platforms, the ways they are normally used, and the build products they produce.
64 .. image:: /images/visualstudio4.png
66 Using platforms, your workflow is faster and more efficient. You can compile,
67 start, and debug your code with one click or key-press. When you press F5, the
68 “start debugging” command, Visual Studio automatically launches a web server to
69 serve your module (if necessary) along with an instance of Chrome that runs
70 your Native Client module, and also attaches an appropriate debugger.
72 You can switch between platforms as you work to compare the behavior of your
73 code.
75 When you run your project, Visual Studio launches the PPAPI and Native Client
76 platforms in different ways, as explained in the next sections.
78 The PPAPI platform
79 ------------------
81 The PPAPI platform builds your module as a dynamic library and launches a
82 version of Chrome that’s configured to run the library as a plugin when it
83 encounters an ``<embed>`` element with ``type=application/x-nacl`` (ignoring
84 the information in the manifest file). When running in the PPAPI platform, you
85 can use Windows system calls that are unavailable in a regular Native Client
86 module built and running as a .nexe file. This offers the ability to port
87 existing code incrementally, rewriting functions using the PPAPI interfaces one
88 piece at a time. Since the module is built with Visual Studio’s native compiler
89 (MSBuild) you can use the Visual Studio debugger to control and inspect your
90 code.
92 The Native Client platforms
93 ---------------------------
95 There are four Native Client platforms. All of them can be used to build Native
96 Client modules. When you run one of the Native Client platforms Visual Studio
97 builds the corresponding type of Native Client module (either a .nexe or
98 .pexe), starts a web server to serve it up, and launches a copy of Chrome that
99 fetches the module from the server and runs it. Visual Studio will also open a
100 terminal window, launch an instance of nacl-gdb, and attach it to your module's
101 process so you can use gdb commands to debug.
103 NaCl32 and NaCl64
104 ^^^^^^^^^^^^^^^^^
106 The platforms named NaCl32 and NaCl64 are targeted at x86 32-bit and 64-bit
107 systems respectively. You need both platforms to build a full set of .nexe
108 files when you are ready to distribute your application. Note, however, that
109 when you are testing in Visual Studio you must select the NaCl64 platform
110 (because Chrome for Windows runs Native Client in a 64-bit process). If you try
111 to run from the NaCl32 platform you will get an error message.
113 NaClARM
114 ^^^^^^^
116 The NaClARM platform is targeted at ARM-based processors. You can build .nexe
117 files with the NaClARM platform in Visual Studio but you cannot run them from
118 there. You can use Visual Studio to create a Native Client module that includes
119 an ARM-based .nexe file and then run the module from a Chrome browser on an ARM
120 device, such as one of the newer Chromebook computers. See the instructions at
121 :doc:`Running Native Client Applications <running>` for more information on
122 testing your module in Chrome.
124 .. Note::
125   :class: note
127   Note: The NaClARM platform currently supports the newlib toolchain only.
129 PNaCl
130 ^^^^^
132 The PNaCl (portable NaCl) platform is included in the Visual Studio Native
133 Client add-in versions 1.1 and higher. It supports the .pexe file format. A
134 .pexe file encodes your application as bitcode for a low level virtual machine
135 (LLVM). When you deliver a Native Client application as a PNaCl module, the
136 manifest file will contain a single .pexe file rather than multiple .nexe
137 files. The Chrome client transforms the LLVM bitcode into machine instructions
138 for the local system.
140 When you run the PNaCl platform from Visual Studio, Visual Studio uses the
141 Native Client SDK to transform the .pexe file into a NaCl64 .nexe file and runs
142 it as if you were working with a NaCl64 platform.
144 .. Note::
145   :class: note
147   Note: The PNaCl platform currently supports the newlib toolchain only.
149 Installing the add-in
150 =====================
152 In order to use the Native Client Visual Studio add-in, your development
153 environment should include:
155 * A 64-bit version of Windows Vista or Windows 7.
156 * Visual Studio 2012 or Visual Service 2010 with Service Pack 1.
157 * `Chrome <https://www.google.com/intl/en/chrome/browser/>`_ version 23 or
158   greater. You can choose to develop using the latest `canary
159   <https://www.google.com/intl/en/chrome/browser/canary.html>`_ build of
160   Chrome, running the canary version side-by-side with (and separately from)
161   your regular version of Chrome.
162 * :doc:`The Native Client SDK <../../sdk/download>` with the ``pepper_23``
163   bundle or greater. The version of Chrome that you use must be equal or
164   greater than the version of the SDK bundle.
166 Set environment variables
167 -------------------------
169 Before you run the installer you must define two Windows environment variables.
170 They point to the bundle in the Native Client SDK that you use to build your
171 module, and to the Chrome browser that you choose to use for debugging.
173 To set environment variables in Windows 7, go to the Start menu and search for
174 "environment." One of the links in the results is "Edit environment variables
175 for your account." (You can also reach this link from the ``Control Panel``
176 under ``User Accounts``.) Click on the link and use the buttons in the window
177 to create or change these user variables (the values shown below are only for
178 example):
181 +-------------------+----------------------------------------------------------+
182 | Variable Name     | Description                                              |
183 +===================+==========================================================+
184 | ``NACL_SDK_ROOT`` | The path to the pepper directory in the SDK.             |
185 |                   | For example: ``C:\nacl_sdk\pepper_23``                   |
186 +-------------------+----------------------------------------------------------+
187 | ``CHROME_PATH``   | The path to the .exe file for the version of Chrome you  |
188 |                   | are testing with.  For example:                          |
189 |                   | ``C:\Users\fred\AppData\Local\Google\Chrome              |
190 |                   | SxS\Application\chrome.exe``                             |
191 +-------------------+----------------------------------------------------------+
195 Download the add-in
196 -------------------
198 The Native Client Visual Studio add-in is a separate bundle in the SDK named
199 ``vs_addin``. Open a command prompt window, go to the top-level SDK directory,
200 and run the update command, specifying the add-in bundle::
202   naclsdk update vs_addin
204 This creates a folder named ``vs_addin``, containing the add-in itself, its
205 installer files, and a directory of examples.
207 .. Note::
208   :class: note
210   Note: The vs_addin bundle is only visible when you run ``naclsdk`` on a
211   Windows system.
213 Run the installer
214 -----------------
216 The installer script is located inside the ``vs_addin`` folder in the SDK.
217 Right click on the file ``install.bat`` and run it as administrator.
219 The script always installs the NativeClient platforms, and asks you if you’d
220 like to install the PPAPI platform as well. You can skip the PPAPI step and run
221 the installer again later to add the PPAPI platform.
223 You can usually run the installer successfully with no arguments. The new
224 platforms are installed in ``C:\Program Files
225 (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms``.
227 In some cases system resources may not be in their default locations. You might
228 need to use these command line arguments when you run ``install.bat``:
230 * The MSBuild folder is assumed to be at ``C:\Program Files (x86)\MSBuild``.
231   You can specify an alternate path with the flag ``--ms-build-path=<path>``.
232   The installer assumes Visual Studio has created a user folder at
233 * The addin itself is normally installed in ``%USERPROFILE%\My Documents\Visual
234   Studio 2012`` (or 2010 for Visual Studio 2010). You can specify alternate
235   paths with the ``--vsuser-path=<path>`` flag.
237 From time to time an update to the Visual Studio add-in may become available.
238 Updates are performed just like an installation. Download the new add-in using
239 naclsdk update and run ``install.bat`` as administrator.
241 To uninstall the add-in, run ``install.bat`` as administrator and add the
242 ``--uninstall`` flag. You'll need to run the Command Prompt program as
243 administrator in order to add the flag. Go the to the Windows start menu,
244 search for "Command Prompt," right click on the program and run it as
245 administrator.
247 You can verify that the add-in has been installed and determine its version by
248 selecting Add-in Manager in the Visual Studio Tools menu. If the add-in has
249 been installed it will appear in the list of available add-ins. Select it and
250 read its description.
252 Try the ``hello_world_gles`` sample project
253 ===========================================
255 The add-in comes with an examples directory. Open the sample project
256 ``examples\hello_world_gles\hello_world_gles.sln``. This project is an
257 application that displays a spinning cube.
259 Select the NaCl64 platform
260 --------------------------
262 Open the sample project in Visual Studio, select the ``Configuration Manager``,
263 and confirm that the active solution configuration is ``Debug`` and the active
264 project platform is ``NaCl64``. Note that the platform for the
265 ``hello_world_gles`` project is also ``NaCl64``. (You can get to the
266 ``Configuration Manager`` from the ``Build`` menu or the project’s
267 ``Properties`` window.)
269 .. image:: /images/visualstudio1.png
271 Build and run the project
272 -------------------------
274 Use the debugging command (F5) to build and run the project. As the wheels
275 start to turn, you may be presented with one or more alerts. They are benign;
276 you can accept them and set options to ignore them when that’s possible. Some
277 of the messages you might see include:
279 * "This project is out of date, would you like to build it?"
280 * "Please specify the name of the executable file to be used for the debug
281   session." This should be the value of the environment variable CHROME_PATH,
282   which is usually supplied as the default value in the dialog.
283 * "Debugging information for chrome.exe cannot be found." This is to be
284   expected, you are debugging your module's code, not Chrome.
285 * "Open file - security warning. The publisher could not be verified." If
286   Visual Studio is complaining about x86_64-nacl-gdb.exe, that’s our debugger.
287   Let it be.
289 Once you’ve passed these hurdles, the application starts to run and you’ll see
290 activity in three places:
292 #. A terminal window opens running ``nacl-gdb``.
293 #. Chrome launches running your module in a tab.
294 #. The Visual Studio output window displays debugging messages when you select
295    the debug output item.
296    Stop the debugging session by closing the Chrome window, or select the stop
297    debugging command from the debug menu. The nacl-gdb window will close when
298    you stop running the program.
300 Test the nacl-gdb debugger
301 --------------------------
303 Add a breakpoint at the SwapBuffers call in the function MainLoop, which is in
304 hello_world.cc.
306 .. image:: /images/visualstudio2.png
308 Start the debugger again (F5). This time the existing breakpoint is loaded into
309 nacl-gcb and the program will pause there. Type c to continue running. You can
310 use gdb commands to set more breakpoints and step through the application. For
311 details, see :ref:`Debugging with nacl-gdb <using_gdb>` (scroll down to the end
312 of the section to see some commonly used gdb commands).
314 Test the Visual Studio debugger
315 -------------------------------
317 If you’ve installed the ``PPAPI`` platform, go back to the ``Configuration
318 Manager`` and select the ``PPAPI`` platform. This time when Chrome launches the
319 ``nacl-gdb`` window will not appear; the Visual Studio debugger is fully
320 engaged and on the job.
322 Inspect the platform properties
323 -------------------------------
325 At this point, it may be helpful to take a look at the properties that are
326 associated with the PPAPI and Native Client platforms---see the settings in the
327 sample project as an example.
329 Developing for Native Client in Visual Studio
330 =============================================
332 After you’ve installed the add-in and tried the sample project, you’re ready to
333 start working with your own code. You can reuse the sample project and the
334 PPAPI and Native Client platforms it already has by replacing the source code
335 with your own. More likely, you will add the platforms to an existing project,
336 or to a new project that you create from scratch.
338 Adding platforms to a project
339 -----------------------------
341 Follow these steps to add the Native Client and PPAPI platforms to a project:
343 #. Open the Configuration Manager.
344 #. On the row corresponding to your project, click the Platform column dropdown
345    menu and select ``<New...>``.
346 #. Select ``PPAPI``, ``NaCl32``, ``NaCl64``, or ``PNaCl`` from the New platform
347    menu.
348 #. In most cases, you should select ``<Empty>`` in the “Copy settings from”
349    menu.  **Never copy settings between ``PPAPI``, ``NaCl32``, ``NaCl64``,
350    ``NaClARM``, or ``PNaCl`` platforms**. You can copy settings from a Win32
351    platform, if one exists, but afterwards be sure that the project properties
352    are properly set for the new platform, as mentioned in step 6 below.
353 #. If you like, check the “Create new solutions platform” box to create a
354    solution platform in addition to a project platform. (This is optional, but
355    it can be convenient since it lets you switch project platforms from the
356    Visual Studio main window by selecting the solution platform that has the
357    same name.)
358 #. Review the project properties for the new platform you just added. In most
359    cases, the default properties for each platform should be correct, but it
360    pays to check. Be especially careful about custom properties you may have
361    set beforehand, or copied from a Win32 platform. Also confirm that the
362    Configuration type is correct:
364    * ``Dynamic Library`` for ``PPAPI``
365    * ``Application (.pexe)`` for ``PNaCl``
366    * ``Application (.nexe)`` for ``NaCl32``, ``NaCl64``, and ``NaClARM``
368 Selecting a toolchain
369 ---------------------
371 When you build a Native Client module directly from the SDK you can use two
372 different toolchains, newlib or glibc. See :doc:`Dynamic Linking and Loading
373 with glibc <dynamic-loading>` for a description of the two toolchains and
374 instructions on how to build and deploy an application with the glibc
375 toolchain. The Native Client platforms offer you the same toolchain choice. You
376 can specify which toolchain to use in the project properties, under
377 ``Configuration Properties > General > Native Client > Toolchain``.
379 .. Note::
380   :class: note
382   Currently, the NaClARM and PNaCl platforms only support the newlib toolchain.
384 There is no toolchain property for the PPAPI platform. The PPAPI platform uses
385 the toolchain and libraries that come with Visual Studio.
387 Adding libraries to a project
388 -----------------------------
390 If your Native Client application requires libraries that are not included in
391 the SDK you must add them to the project properties (under ``Configuration
392 Properties > Linker > Input > Additional Dependencies``), just like any other
393 Visual Studio project. This list of dependencies is a semi-colon delimited
394 list. On the PPAPI platform the library names include the .lib extension (e.g.,
395 ``ppapi_cpp.lib;ppapi.lib``). On the Native Client platforms the extension is
396 excluded (e.g., ``ppapi_cpp;ppapi``).
398 Running a web server
399 --------------------
401 In order for the Visual Studio add-in to test your Native Client module, you
402 must serve the module from a web server. There are two options:
404 Running your own server
405 ^^^^^^^^^^^^^^^^^^^^^^^
407 When you start a debug run Visual Studio launches Chrome and tries to connect
408 to the web server at the address found in the Chrome command arguments (see the
409 project’s Debugging > Command configuration property), which is usually
410 ``localhost:$(NaClWebServerPort)``. If you are using your own server be sure to
411 specify its address in the command arguments property, and confirm that your
412 server is running before starting a debug session. Also be certain that the
413 server has all the files it needs to deliver a Native Client module (see
414 “Keeping track of all the pieces”, below).
416 Running the SDK server
417 ^^^^^^^^^^^^^^^^^^^^^^
419 If there is no web server running at the specified port, Visual Studio will try
420 to launch the simple Python web server that comes with the Native Client SDK.
421 It looks for a copy of the server in the SDK itself (at
422 ``%NACL_SDK_ROOT%\tools\httpd.py``), and in the project directory
423 (``$(ProjectDir)/httpd.py``). If the server exists in one of those locations,
424 Visual Studio launches the server. The server output appears in Visual Studio’s
425 Output window, in the pane named “Native Client Web Server Output”. A server
426 launched in this way is terminated when the debugging session ends.
428 Keeping track of all the pieces
429 -------------------------------
431 No matter where the web server lives or how it’s launched you must make sure
432 that it has all the files that your application needs:
434 * All Native Client applications must have an :ref:`html host page
435   <html_file>`. This file is typically called ``index.html``. The host page
436   must have an embed tag with its type attribute set to
437   ``application-type/x-nacl``. If you plan to use a Native Client platform the
438   embed tag must also include a src attribute pointing to a Native Client
439   manifest (.mnf) file.
440 * If you are using a Native Client platform you must include a valid
441   :ref:`manifest file <manifest_file>`. The manifest file points to the .pexe
442   or .nexe files that Visual Studio builds. These will be placed in the
443   directory specified in the project’s ``General > Output Directory``
444   configuration property, which is usually ``$(ProjectDir)$(ToolchainName)``.
445   Visual Studio can use the Native Client SDK script create_nmf.py to
446   automatically generate the manifest file for you.  To use this script set the
447   project's ``Linker > General > Create NMF Automatically`` property to "yes."
449 If you are letting Visual Studio discover and run the SDK server, these files
450 should be placed in the project directory. If you are running your own server,
451 you must be sure that the host page ``index.html`` is placed in your server’s
452 root directory. Remember, if you’re using one of the Native Client platforms
453 the paths for the manifest file and .pexe or .nexe files must be reachable from
454 the server.
456 The structure of the manifest file can be more complicated if your application
457 uses Native Client's ability to dynamically link libraries. You may have to add
458 additional information about dynamically linked libraries to the manifest file
459 even if you create it automatically. The use and limitations of the create_nmf
460 tool are explained in :ref:`Generating a Native Client manifest file for a
461 dynamically linked application <dynamic_loading_manifest>`.
463 You can look at the example projects in the SDK to see how the index and
464 manifest files are organized. The example project ``hello_nacl`` has a
465 subdirectory also called ``hello_nacl``. That folder contains ``index.html``
466 and ``hello_nacl.nmf``. The nexe file is found in
467 ``NaCl64\newlib\Debug\hello_nacl_64.nexe``. The ``hello_world_gles`` example
468 project contains a subdirectory called `hello_world_gles``. That directory
469 contains html files built with both toolchains (``index_glibc.html`` and
470 ``index_newlib.html``). The .nexe and .nmf files are found in the newlib and
471 glibc subfolders. For additional information about the parts of a Native Client
472 application, see :doc:`Application Structure
473 <../coding/application-structure>`.
475 Using the debuggers
476 -------------------
478 PPAPI plugins are built natively by Visual Studio’s compiler (MSBuild), and
479 work with Visual Studio’s debugger in the usual way. You can set breakpoints in
480 the Visual Studio source code files before you begin debugging, and on-the-fly
481 while running the program.
483 NaCl32 and NaClARM executables (.nexe files) cannot be run or debugged from
484 Visual Studio.
486 NaCl64 executables (.nexe files) are compiled using one of the Native Client
487 toolchains in the SDK, which create an `ELF-formatted
488 <http://en.wikipedia.org/wiki/Executable_and_Linkable_Format>`_ executable. To
489 debug a running .nexe you must use nacl-gdb, which is a command line debugger
490 that is not directly integrated with Visual Studio. When you start a debugging
491 session running from a NaCl64 platform, Visual Studio automatically launches
492 nacl-gdb for you and attaches it to the nexe. Breakpoints that you set in
493 Visual Studio before you start debugging are transferred to nacl-gdb
494 automatically. During a NaCl debugging session you can only use nacl-gdb
495 commands.
497 The PNaCl platform generates a .pexe file. When you run the debugger add-in
498 translates the .pexe file to a .nexe file and runs the resulting binary with
499 nacl-gdb attached.
501 For additional information about nacl-gdb, see :ref:`Debugging with nacl-gdb
502 <using_gdb>` (scroll down to the end of the section to see some commonly used
503 gdb commands).
505 Note that you can’t use the Start Without Debugging command (Ctrl+F5) with a
506 project in the Debug configuration. If you do, Chrome will hang because the
507 Debug platform launches Chrome with the command argument
508 ``--wait-for-debugger-children`` (in PPAPI) or ``--enable-nacl-debug`` (in a
509 Native Client platform). These flags cause Chrome to pause and wait for a
510 debugger to attach. If you use the Start Without Debugging command, no debugger
511 attaches and Chrome just waits patiently. To use Start Without Debugging,
512 switch to the Release configuration, or manually remove the offending argument
513 from the ``Command Arguments`` property.
515 Disable Chrome caching
516 ----------------------
518 When you debug with a Native Client platform you might want to :ref:`disable
519 Chrome's cache <cache>` to be sure you are testing your latest and greatest
520 code.
522 A warning about PostMessage
523 ---------------------------
525 Some Windows libraries define the symbol ``PostMessage`` as ``PostMessageW``.
526 This can cause havoc if you are working with the PPAPI platform and you use the
527 Pepper ``PostMessage()`` call in your module. Some Pepper API header files
528 contain a self-defensive fix that you might need yourself, while you are
529 testing on the PPAPI platform. Here it is:
531 .. naclcode::
533   // If Windows defines PostMessage, undef it.
534   #ifdef PostMessage
535   #undef PostMessage
536   #endif
538 Porting Windows applications to Native Client in Visual Studio
539 --------------------------------------------------------------
541 At Google I/O 2012 we demonstrated how to port a Windows desktop application to
542 Native Client in 60 minutes. The `video
543 <http://www.youtube.com/watch?v=1zvhs5FR0X8&feature=plcp>`_ is available to
544 watch on YouTube. The ``vs_addin/examples`` folder contains a pair of simple
545 examples that demonstrate porting process.  They are designed to be completed
546 in just 5 minutes. The two examples are called ``hello_nacl`` and
547 ``hello_nacl_cpp``. They are essentially the same, but the former uses the C
548 PPAPI interface while the latter uses the C++ API.  The application is the
549 familiar "Hello, World."
551 Each example begins with the Windows desktop version running in the ``Win32``
552 platform. From there you move to the ``PPAPI`` platform, where you perform a
553 series of steps to set up the Native Client framework, use it to run the
554 desktop version, and then port the behavior from Windows calls to the PPAPI
555 interface.  You wind up with a program that uses no Windows functions, which
556 can run in either the ``PPAPI`` or the ``NaCl64`` platform.
558 The example projects use a single source file (``hello_nacl.c`` or
559 ``hello_nacl_cpp.cpp``). Each step in the porting process is accomplished by
560 progressively defining the symbols STEP1 through STEP6 in the source. Inline
561 comments explain how each successive step changes the code. View the example
562 code to see how it's actually done. Here is a summary of the process:
564 Win32 Platform
565 ^^^^^^^^^^^^^^
567 STEP1 Run the desktop application
568   Begin by running the original Windows application in the Win32 platform.
570 PPAPI Platform
571 ^^^^^^^^^^^^^^
573 STEP2 Launch Chrome with an empty Native Client module
574   Switch to the PPAPI platform and include the code required to initialize a
575   Native Module instance. The code is bare-boned, it does nothing but
576   initialize the module. This step illustrates how Visual Studio handles all
577   the details of launching a web-server and Chrome, and running the Native
578   Client module as a Pepper plugin.
580 STEP3 Run the desktop application synchronously from the Native Client module
581   The Native Client creates the window directly and then calls WndProc to run
582   the desktop application. Since WndProc spins in its message loop, the call to
583   initialize the module never returns. Close the Hello World window and the
584   module initialization will finish.
586 STEP4 Running the desktop application and Native Client asynchronously
587   In WndProc replace the message loop with a callback function. Now the app
588   window and the Native Client module are running concurrently.
590 STEP5 Redirect output to the web page
591   The module initialization code calls initInstanceInBrowserWindow rather than
592   initInstanceInPCWindow. WndProc is no longer used. Instead, postMessage is
593   called to place text (now "Hello, Native Client") in the web page rather than
594   opening and writing to a window. Once you've reached this step you can start
595   porting pieces of the application one feature at a time.
597 STEP6 Remove all the Windows code
598   All the Windows code is def'd out, proving we are PPAPI-compliant. The
599   functional code that is running is the same as STEP5.
601 NaCl64 Platform
602 ^^^^^^^^^^^^^^^
604 Run the Native Client Module in the NaCl64 platform
605   You are still running the STEP6 code, but as a Native Client module rather
606   than a Pepper plugin.
608 .. TODO(sbc): port reference section?