Index: visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cc |
diff --git a/visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cpp b/visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cc |
similarity index 77% |
rename from visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cpp |
rename to visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cc |
index 990ccbd35b6fc57c3ff3a9ac22b82899d2a2c542..d609d65bd562ddb8a3a4437e5f7aaed56e46a409 100644 |
--- a/visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cpp |
+++ b/visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl_cpp/hello_nacl_cpp/hello_nacl_cpp.cc |
@@ -1,362 +1,364 @@ |
-// This project demonstrates how to migrate a Windows desktop app to Native |
-// Client, running first as a Win32 application (define STEP1), then as a PPAPI |
-// plugin (define STEP2 through STEP6), and finally as a Native Client module. |
- |
-// Start with STEP1 defined and the defines for STEP2 through STEP6 commented |
-// out. For each step in the process, un-comment the next #define, leaving the |
-// previous ones on. Ready, set, port! |
- |
-// *** SELECT THE WIN32 PLATFORM AND RUN WITH #define STEP1 ONLY *** |
- |
-#define STEP1 |
-// Launches the original Windows desktop application, Hello World, which runs |
-// as WinMain. STEP1 encloses Windows-specific functions that are used with |
-// the WIN32 and PPAPI platforms. These will be removed when the full PPAPI |
-// port is finished (STEP6) |
- |
-// *** SELECT THE PPAPI PLATFORM *** |
- |
-#define STEP2 |
- |
-// Client Module. STEP2 encloses the Native Client module APIs needed to link |
-// any app to the browser. The module does nothing except report |
-// starting/ending the function Instance_DidCreate. The Windows app does not |
-// run because it is not being called. |
- |
-#define STEP3 |
-// What changed: Replace WinMain with WndProc, and call it from |
-// Instance_DidCreate, launching hello_nacl_plus in its own window. Since |
-// WndProc spins in its message loop, the call to Instance_DidCreate never |
-// returns. Close the hello_nacl_plus window and the module initialization will |
-// finish. |
- |
-#define STEP4 |
-// What changed: In WndProc replace the message loop with a callback function. |
-// Now the app window and the Native Client module are running concurrently. |
- |
-#define STEP5 |
-// What changed: Instance_DidCreate calls initInstanceInBrowserWindow rather |
-// than initInstanceInPCWindow. The initInstanceInBrowserWindow uses |
-// postMessage to place text (now "Hello, Native Client") in the web page |
-// instead of opening and writing to a window. |
- |
-#define STEP6 |
-// What changed: All the Windows code is def'd out, to prove we are |
-// PPAPI-compliant. The functional code that is running is the same as STEP5. |
- |
-// *** SELECT THE NACL64 PLATFORM AND RUN *** |
- |
-// What changed: The code is the same as STEP6, but you are using the SDK |
-// toolchain to compile it into a nexe. The module is now running as a real |
-// Native Client executable in a NaCl sandbox, with nacl-gdb attached. |
- |
-// *** RUN YOUR MODULE IN THE WILD *** |
-// You can run your nexe outside of Visual Studio, directly from Chrome by |
-// following these steps: |
-// - Build STEP6 and verify the file |
-// <project directory>/newlib/hello_nacl_plus/hello_nacl_plus.nexe exists |
-// - Copy the folder <project directory>/hello_nacl_plus into your NaCl SDK's |
-// example directory. |
-// - Go to the NaCl SDK directory and launch the httpd.py server. |
-// - Launch Chrome, go to about:flags and enable the Native Client flag and |
-// relaunch Chrome |
-// - Point Chrome at localhost:5103/hello_nacl_plus |
- |
-#ifdef STEP6 |
-// remove Windows-dependent code. |
-#undef STEP1 |
-#undef STEP3 |
-#undef STEP4 |
-#define NULL 0 |
-#else |
-// includes for Windows APIs. |
-#include <windows.h> |
-#include <stdlib.h> |
-#include <tchar.h> |
-#endif |
- |
-#ifdef STEP2 |
-// includes for PPAPI C++ |
-#include "ppapi/cpp/instance.h" |
-#include "ppapi/cpp/module.h" |
-#include "ppapi/cpp/var.h" |
-#include "ppapi/cpp/core.h" |
-#include "ppapi/cpp/completion_callback.h" |
-#include "ppapi/utility/completion_callback_factory.h" |
- |
-// This is a known PPAPI platform problem (Issue 81375). |
-// When WinUser.h is included it defines PostMessage, so we undef it here. |
-// There is a work-around: |
-#ifdef PostMessage |
-#undef PostMessage |
-#endif |
- |
-class NaClProjectInstance *myInstance; |
-int initInstanceInPCWindow(); |
-void initInstanceInBrowserWindow(); |
- |
-#endif |
- |
-#ifdef STEP2 |
- |
-// **** Native Client Framework **** |
- |
-// The Instance class. |
-class NaClProjectInstance : public pp::Instance { |
-public: |
- pp::CompletionCallbackFactory<NaClProjectInstance> factory_; |
- |
- explicit NaClProjectInstance(PP_Instance instance) |
- : pp::Instance(instance), |
- // Use this macro to eliminate compiler warning. |
- PP_ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) { |
- myInstance = this; |
- } |
- |
- |
- virtual ~NaClProjectInstance() { |
- } |
- |
- virtual bool Init(uint32_t /*argc*/, const char* /*argn*/[], |
- const char* /*argv*/[]) { |
- PostMessage(pp::Var("Creating Instance Start")); |
-#ifdef STEP5 |
- // Will be included in STEP5 and STEP6 |
- // Uses messaging to relay text to the module's view on the web page |
- initInstanceInBrowserWindow(); |
-#else |
-#ifdef STEP3 |
- // Will be included in STEP3 and STEP4 only |
- // Uses WndProc to place text in a window separate from the browser. |
- initInstanceInPCWindow(); |
-#endif |
-#endif |
- PostMessage(pp::Var("Creating Instance End")); |
- return true; |
- } |
- |
-#ifdef STEP4 |
- // Implements Windows window message loop with a callback function. |
- void NaClProjectInstance::SendCallback(int result) { |
- pp::Core* core = pp::Module::Get()->core(); |
- CompletionCallback callback = factory_.NewCallback(&HandleWindowMsg); |
- core->CallOnMainThread(100, callbacl, result); |
- } |
- |
- void HandleWindowMsg(int32_t result) { |
- MSG uMsg; |
- if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { |
- TranslateMessage(&uMsg); |
- DispatchMessage(&uMsg); |
- } |
- SendCallback(0); |
- } |
- |
-#endif |
-private: |
- virtual void HandleMessage(const pp::Var& var_message) { |
- } |
-}; |
- |
-// The Module class. |
-class NaClProjectModule : public pp::Module { |
-public: |
- NaClProjectModule() : pp::Module() {} |
- virtual ~NaClProjectModule() {} |
- |
- virtual pp::Instance* CreateInstance(PP_Instance instance) { |
- return new NaClProjectInstance(instance); |
- } |
-}; |
- |
-namespace pp { |
- Module* CreateModule() { |
- return new NaClProjectModule(); |
- } |
-} |
- |
-#endif |
- |
-// **** Application Code **** |
- |
-#ifdef STEP1 |
-// Desktop Windows Hello World app. Native Client agnostic. |
- |
-static TCHAR szWindowClass[] = _T("win32app"); |
-static TCHAR szTitle[] = _T("hello_nacl_plus"); |
-HINSTANCE hInst; |
-LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); |
- |
-// WinMain |
-int WINAPI WinMain(HINSTANCE hInstance, |
- HINSTANCE hPrevInstance, |
- LPSTR lpCmdLine, |
- int nCmdShow) |
-{ |
- WNDCLASSEX wcex; |
- |
- wcex.cbSize = sizeof(WNDCLASSEX); |
- wcex.style = CS_HREDRAW | CS_VREDRAW; |
- wcex.lpfnWndProc = WndProc; |
- wcex.cbClsExtra = 0; |
- wcex.cbWndExtra = 0; |
- wcex.hInstance = hInstance; |
- wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); |
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); |
- wcex.lpszMenuName = NULL; |
- wcex.lpszClassName = szWindowClass; |
- wcex.hIconSm = LoadIcon(wcex.hInstance, |
- MAKEINTRESOURCE(IDI_APPLICATION)); |
- |
- if (!RegisterClassEx(&wcex)) { |
- MessageBox(NULL, |
- _T("Call to RegisterClassEx failed!"), |
- _T("hello_nacl_plus"), |
- NULL); |
- |
- return 1; |
- } |
- |
- hInst = hInstance; |
- |
- HWND hWnd = CreateWindow( |
- szWindowClass, |
- szTitle, |
- WS_OVERLAPPEDWINDOW, |
- CW_USEDEFAULT, CW_USEDEFAULT, |
- 500, 100, |
- NULL, |
- NULL, |
- hInstance, |
- NULL); |
- |
- if (!hWnd) { |
- MessageBox(NULL, |
- _T("Call to CreateWindow failed!"), |
- _T("hello_nacl_plus"), |
- NULL); |
- |
- return 1; |
- } |
- |
- ShowWindow(hWnd, |
- nCmdShow); |
- UpdateWindow(hWnd); |
- |
- // Main message loop: |
- MSG msg; |
- while (GetMessage(&msg, NULL, 0, 0)) { |
- TranslateMessage(&msg); |
- DispatchMessage(&msg); |
- } |
- |
- return (int) msg.wParam; |
-} |
- |
-// WndProc |
-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) |
-{ |
- PAINTSTRUCT ps; |
- HDC hdc; |
- TCHAR greeting[] = _T("Hello, World!"); |
- |
- switch (message) |
- { |
- case WM_PAINT: |
- hdc = BeginPaint(hWnd, &ps); |
- |
- // Here your application is laid out. |
- // For this introduction, we just print out "Hello, World!" |
- // in the top left corner. |
- TextOut(hdc, |
- 5, 5, |
- greeting, _tcslen(greeting)); |
- // End application-specific layout section. |
- |
- EndPaint(hWnd, &ps); |
- break; |
- case WM_DESTROY: |
- PostQuitMessage(0); |
- break; |
- default: |
- return DefWindowProc(hWnd, message, wParam, lParam); |
- break; |
- } |
- |
- return 0; |
-} |
-#endif |
- |
-#ifdef STEP3 |
-// Replace WinMain with initInstanceInPCWindow so the NativeClient Module can |
-// launch the original application. |
-// Note the inclusion of a message-handling loop. STEP4 will replace the loop |
-// with a callback. |
- |
-void shutDown(void); |
-HINSTANCE g_hInstance = NULL; |
-HWND g_hWnd = NULL; |
- |
-int initInstanceInPCWindow() |
-{ |
- WNDCLASSEX winClass; |
- MSG uMsg; |
- |
- memset(&uMsg,0,sizeof(uMsg)); |
- |
- winClass.lpszClassName = _T("MY_WINDOWS_CLASS"); |
- winClass.cbSize = sizeof(WNDCLASSEX); |
- winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; |
- winClass.lpfnWndProc = WndProc; |
- winClass.hInstance = g_hInstance; |
- winClass.hIcon = NULL; |
- winClass.hIconSm = NULL; |
- winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
- winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); |
- winClass.lpszMenuName = NULL; |
- winClass.cbClsExtra = 0; |
- winClass.cbWndExtra = 0; |
- |
- if (!RegisterClassEx(&winClass)) |
- return E_FAIL; |
- |
- g_hWnd = CreateWindowEx(NULL,_T("MY_WINDOWS_CLASS"), |
- _T("hello_nacl_plus"), |
- WS_OVERLAPPEDWINDOW, |
- 0,0, 640, 480, NULL, NULL, g_hInstance, NULL); |
- |
- if (g_hWnd == NULL) |
- return E_FAIL; |
- |
- ShowWindow(g_hWnd, 1); |
- |
- UpdateWindow(g_hWnd); |
- |
-#ifdef STEP4 |
- // Skip the message loop, schedule a callback instead to periodically check |
- // for messages. Here we schedule at 100ms intervals. |
- myInstance->SendCallback(0); |
- return 0; |
-#else |
- // Main message loop, Windows style. |
- while(uMsg.message != WM_QUIT) { |
- if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { |
- TranslateMessage(&uMsg); |
- DispatchMessage(&uMsg); |
- } |
- } |
- return uMsg.wParam; |
-#endif |
- |
-} |
-#endif |
- |
-#ifdef STEP5 |
-// Pass the text to the browser page, there is no separate app window anymore. |
-// The text is added as a new element to the page, it does not appear in the |
-// module's embed view. |
-void initInstanceInBrowserWindow() { |
- myInstance->PostMessage(pp::Var("Hello, Native Client!")); |
-} |
-#endif |
+/* Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+// This project demonstrates how to migrate a Windows desktop app to Native |
+// Client, running first as a Win32 application (define STEP1), then as a PPAPI |
+// plugin (define STEP2 through STEP6), and finally as a Native Client module. |
+ |
+// Start with STEP1 defined and the defines for STEP2 through STEP6 commented |
+// out. For each step in the process, un-comment the next #define, leaving the |
+// previous ones on. Ready, set, port! |
+ |
+// *** SELECT THE WIN32 PLATFORM AND RUN WITH #define STEP1 ONLY *** |
+ |
+#define STEP1 |
+// Launches the original Windows desktop application, Hello World, which runs |
+// as WinMain. STEP1 encloses Windows-specific functions that are used with |
+// the WIN32 and PPAPI platforms. These will be removed when the full PPAPI |
+// port is finished (STEP6) |
+ |
+// *** SELECT THE PPAPI PLATFORM *** |
+ |
+//#define STEP2 |
+ |
+// Client Module. STEP2 encloses the Native Client module APIs needed to link |
+// any app to the browser. The module does nothing except report |
+// starting/ending the function Instance_DidCreate. The Windows app does not |
+// run because it is not being called. |
+ |
+//#define STEP3 |
+// What changed: Replace WinMain with WndProc, and call it from |
+// Instance_DidCreate, launching hello_nacl_plus in its own window. Since |
+// WndProc spins in its message loop, the call to Instance_DidCreate never |
+// returns. Close the hello_nacl_plus window and the module initialization will |
+// finish. |
+ |
+//#define STEP4 |
+// What changed: In WndProc replace the message loop with a callback function. |
+// Now the app window and the Native Client module are running concurrently. |
+ |
+//#define STEP5 |
+// What changed: Instance_DidCreate calls InitInstanceInBrowserWindow rather |
+// than InitInstanceInPCWindow. The InitInstanceInBrowserWindow uses |
+// postMessage to place text (now "Hello, Native Client") in the web page |
+// instead of opening and writing to a window. |
+ |
+//#define STEP6 |
+// What changed: All the Windows code is def'd out, to prove we are |
+// PPAPI-compliant. The functional code that is running is the same as STEP5. |
+ |
+// *** SELECT THE NACL64 PLATFORM AND RUN *** |
+ |
+// What changed: The code is the same as STEP6, but you are using the SDK |
+// toolchain to compile it into a nexe. The module is now running as a real |
+// Native Client executable in a NaCl sandbox, with nacl-gdb attached. |
+ |
+// *** RUN YOUR MODULE IN THE WILD *** |
+// You can run your nexe outside of Visual Studio, directly from Chrome by |
+// following these steps: |
+// - Build STEP6 and verify the file |
+// <project directory>/newlib/hello_nacl_plus/hello_nacl_plus.nexe exists |
+// - Copy the folder <project directory>/hello_nacl_plus into your NaCl SDK's |
+// example directory. |
+// - Go to the NaCl SDK directory and launch the httpd.py server. |
+// - Launch Chrome, go to about:flags and enable the Native Client flag and |
+// relaunch Chrome |
+// - Point Chrome at localhost:5103/hello_nacl_plus |
+ |
+#ifdef STEP6 |
+// remove Windows-dependent code. |
+#undef STEP1 |
+#undef STEP3 |
+#undef STEP4 |
+#define NULL 0 |
+#else |
+// includes for Windows APIs. |
+#include <windows.h> |
+#include <stdlib.h> |
+#include <tchar.h> |
+#endif |
+ |
+#ifdef STEP2 |
+// includes for PPAPI C++ |
+#include "ppapi/cpp/instance.h" |
+#include "ppapi/cpp/module.h" |
+#include "ppapi/cpp/var.h" |
+#include "ppapi/cpp/core.h" |
+#include "ppapi/cpp/completion_callback.h" |
+#include "ppapi/utility/completion_callback_factory.h" |
+ |
+// This is a known PPAPI platform problem (Issue 81375). |
+// When WinUser.h is included it defines PostMessage, so we undef it here. |
+// There is a work-around: |
+#ifdef PostMessage |
+#undef PostMessage |
+#endif |
+ |
+class NaClProjectInstance *myInstance; |
+int InitInstanceInPCWindow(); |
+void InitInstanceInBrowserWindow(); |
+ |
+#endif |
+ |
+#ifdef STEP2 |
+ |
+// **** Native Client Framework **** |
+ |
+// The Instance class. |
+class NaClProjectInstance : public pp::Instance { |
+ public: |
+ explicit NaClProjectInstance(PP_Instance instance) |
+ : pp::Instance(instance), |
+ // Use this macro to eliminate compiler warning. |
+ PP_ALLOW_THIS_IN_INITIALIZER_LIST(factory_(this)) { |
+ myInstance = this; |
+ } |
+ |
+ virtual ~NaClProjectInstance() { |
+ } |
+ |
+ virtual bool Init(uint32_t argc, const char* argn[], |
+ const char* argv[]) { |
+ PostMessage(pp::Var("Creating Instance Start")); |
+#ifdef STEP5 |
+ // Will be included in STEP5 and STEP6 |
+ // Uses messaging to relay text to the module's view on the web page |
+ InitInstanceInBrowserWindow(); |
+#else |
+#ifdef STEP3 |
+ // Will be included in STEP3 and STEP4 only |
+ // Uses WndProc to place text in a window separate from the browser. |
+ InitInstanceInPCWindow(); |
+#endif |
+#endif |
+ PostMessage(pp::Var("Creating Instance End")); |
+ return true; |
+ } |
+ |
+#ifdef STEP4 |
+ // Implements Windows window message loop with a callback function. |
+ void NaClProjectInstance::SendCallback(int result) { |
+ pp::Core* core = pp::Module::Get()->core(); |
+ core->CallOnMainThread( |
+ 100, |
+ factory_.NewCallback(&NaClProjectInstance::HandleWindowMsg), |
+ result); |
+ } |
+ |
+ void HandleWindowMsg(int32_t result) { |
+ MSG uMsg; |
+ if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { |
+ TranslateMessage(&uMsg); |
+ DispatchMessage(&uMsg); |
+ } |
+ SendCallback(0); |
+ } |
+ |
+#endif |
+ private: |
+ virtual void HandleMessage(const pp::Var& var_message) { |
+ } |
+ |
+ pp::CompletionCallbackFactory<NaClProjectInstance> factory_; |
+}; |
+ |
+// The Module class. |
+class NaClProjectModule : public pp::Module { |
+ public: |
+ NaClProjectModule() : pp::Module() {} |
+ virtual ~NaClProjectModule() {} |
+ |
+ virtual pp::Instance* CreateInstance(PP_Instance instance) { |
+ return new NaClProjectInstance(instance); |
+ } |
+}; |
+ |
+namespace pp { |
+ |
+Module* CreateModule() { |
+ return new NaClProjectModule(); |
+} |
+ |
+} |
+ |
+#endif |
+ |
+// **** Application Code **** |
+ |
+#ifdef STEP1 |
+// Desktop Windows Hello World app. Native Client agnostic. |
+ |
+static TCHAR szWindowClass[] = _T("win32app"); |
+static TCHAR szTitle[] = _T("hello_nacl_plus"); |
+HINSTANCE hInst; |
+LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); |
+ |
+// WinMain |
+int WINAPI WinMain( |
+ HINSTANCE hInstance, |
+ HINSTANCE hPrevInstance, |
+ LPSTR lpCmdLine, |
+ int nCmdShow) { |
+ WNDCLASSEX wcex; |
+ |
+ wcex.cbSize = sizeof(WNDCLASSEX); |
+ wcex.style = CS_HREDRAW | CS_VREDRAW; |
+ wcex.lpfnWndProc = WndProc; |
+ wcex.cbClsExtra = 0; |
+ wcex.cbWndExtra = 0; |
+ wcex.hInstance = hInstance; |
+ wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); |
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW); |
+ wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); |
+ wcex.lpszMenuName = NULL; |
+ wcex.lpszClassName = szWindowClass; |
+ wcex.hIconSm = LoadIcon(wcex.hInstance, |
+ MAKEINTRESOURCE(IDI_APPLICATION)); |
+ |
+ if (!RegisterClassEx(&wcex)) { |
+ MessageBox(NULL, |
+ _T("Call to RegisterClassEx failed!"), |
+ _T("hello_nacl_plus"), |
+ NULL); |
+ |
+ return 1; |
+ } |
+ |
+ hInst = hInstance; |
+ |
+ HWND hWnd = CreateWindow( |
+ szWindowClass, szTitle, |
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, |
+ 500, 100, NULL, NULL, hInstance, NULL); |
+ |
+ if (!hWnd) { |
+ MessageBox(NULL, |
+ _T("Call to CreateWindow failed!"), |
+ _T("hello_nacl_plus"), |
+ NULL); |
+ |
+ return 1; |
+ } |
+ |
+ ShowWindow(hWnd, nCmdShow); |
+ UpdateWindow(hWnd); |
+ |
+ // Main message loop: |
+ MSG msg; |
+ while (GetMessage(&msg, NULL, 0, 0)) { |
+ TranslateMessage(&msg); |
+ DispatchMessage(&msg); |
+ } |
+ |
+ return (int) msg.wParam; |
+} |
+ |
+// WndProc |
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, |
+ WPARAM wParam, LPARAM lParam) { |
+ PAINTSTRUCT ps; |
+ HDC hdc; |
+ TCHAR greeting[] = _T("Hello, World!"); |
+ |
+ switch (message) |
+ { |
+ case WM_PAINT: |
+ hdc = BeginPaint(hWnd, &ps); |
+ |
+ // Here your application is laid out. |
+ // For this introduction, we just print out "Hello, World!" |
+ // in the top left corner. |
+ TextOut(hdc, |
+ 5, 5, |
+ greeting, _tcslen(greeting)); |
+ // End application-specific layout section. |
+ |
+ EndPaint(hWnd, &ps); |
+ break; |
+ case WM_DESTROY: |
+ PostQuitMessage(0); |
+ break; |
+ default: |
+ return DefWindowProc(hWnd, message, wParam, lParam); |
+ break; |
+ } |
+ |
+ return 0; |
+} |
+#endif |
+ |
+#ifdef STEP3 |
+// Replace WinMain with InitInstanceInPCWindow so the NativeClient Module can |
+// launch the original application. |
+// Note the inclusion of a message-handling loop. STEP4 will replace the loop |
+// with a callback. |
+ |
+void shutDown(void); |
+HINSTANCE g_hInstance = NULL; |
+HWND g_hWnd = NULL; |
+ |
+int InitInstanceInPCWindow() |
+{ |
+ WNDCLASSEX winClass; |
+ MSG uMsg; |
+ |
+ memset(&uMsg,0,sizeof(uMsg)); |
+ |
+ winClass.lpszClassName = _T("MY_WINDOWS_CLASS"); |
+ winClass.cbSize = sizeof(WNDCLASSEX); |
+ winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; |
+ winClass.lpfnWndProc = WndProc; |
+ winClass.hInstance = g_hInstance; |
+ winClass.hIcon = NULL; |
+ winClass.hIconSm = NULL; |
+ winClass.hCursor = LoadCursor(NULL, IDC_ARROW); |
+ winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); |
+ winClass.lpszMenuName = NULL; |
+ winClass.cbClsExtra = 0; |
+ winClass.cbWndExtra = 0; |
+ |
+ if (!RegisterClassEx(&winClass)) |
+ return E_FAIL; |
+ |
+ g_hWnd = CreateWindowEx( |
+ NULL,_T("MY_WINDOWS_CLASS"), |
+ _T("hello_nacl_plus"), |
+ WS_OVERLAPPEDWINDOW, |
+ 0, 0, 640, 480, NULL, NULL, g_hInstance, NULL); |
+ |
+ if (g_hWnd == NULL) |
+ return E_FAIL; |
+ |
+ ShowWindow(g_hWnd, 1); |
+ |
+ UpdateWindow(g_hWnd); |
+ |
+#ifdef STEP4 |
+ // Skip the message loop, schedule a callback instead to periodically check |
+ // for messages. Here we schedule at 100ms intervals. |
+ myInstance->SendCallback(0); |
+ return 0; |
+#else |
+ // Main message loop, Windows style. |
+ while(uMsg.message != WM_QUIT) { |
+ if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { |
+ TranslateMessage(&uMsg); |
+ DispatchMessage(&uMsg); |
+ } |
+ } |
+ return uMsg.wParam; |
+#endif |
+ |
+} |
+#endif |
+ |
+#ifdef STEP5 |
+// Pass the text to the browser page, there is no separate app window anymore. |
+// The text is added as a new element to the page, it does not appear in the |
+// module's embed view. |
+void InitInstanceInBrowserWindow() { |
+ myInstance->PostMessage(pp::Var("Hello, Native Client!")); |
+} |
+#endif |