Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: visual_studio/NativeClientVSAddIn/InstallerResources/examples/hello_nacl/hello_nacl/hello_nacl.c

Issue 11191009: Add new VS AddIn examples. (Closed) Base URL: http://nativeclient-sdk.googlecode.com/svn/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
1 // This project demonstrates how to migrate a Windows desktop app to Native 6 // This project demonstrates how to migrate a Windows desktop app to Native
2 // Client, running first as a Win32 application (define STEP1), then as a PPAPI 7 // Client, running first as a Win32 application (define STEP1), then as a PPAPI
3 // plugin (define STEP2 through STEP6), and finally as a Native Client module. 8 // plugin (define STEP2 through STEP6), and finally as a Native Client module.
4 9
5 // Start with STEP1 defined and the defines for STEP2 through STEP6 commented 10 // Start with STEP1 defined and the defines for STEP2 through STEP6 commented
6 // out. For each step in the process, un-comment the next #define, leaving the 11 // out. For each step in the process, un-comment the next #define, leaving the
7 // previous ones on. Ready, set, port! 12 // previous ones on. Ready, set, port!
8 13
9 // *** SELECT THE WIN32 PLATFORM AND RUN WITH #define STEP1 ONLY *** 14 // *** SELECT THE WIN32 PLATFORM AND RUN WITH #define STEP1 ONLY ***
10 15
11 #define STEP1 16 #define STEP1
12 // Launches the original Windows desktop application, Hello World, which runs 17 // Launches the original Windows desktop application, Hello World, which runs
13 // as WinMain. STEP1 encloses Windows-specific functions that are used with 18 // as WinMain. STEP1 encloses Windows-specific functions that are used with
14 // the WIN32 and PPAPI platforms. These will be removed when the full PPAPI 19 // the WIN32 and PPAPI platforms. These will be removed when the full PPAPI
15 // port is finished (STEP6) 20 // port is finished (STEP6)
16 21
17 // *** SELECT THE PPAPI PLATFORM *** 22 // *** SELECT THE PPAPI PLATFORM ***
18 23
19 //#define STEP2 24 //#define STEP2
20 // What Changed: The platform launches Chrome, which will then load a Native 25 // What Changed: The platform launches Chrome, which will then load a Native
21 // Client Module. STEP2 encloses the Native Client module APIs needed to link 26 // Client Module. STEP2 encloses the Native Client module APIs needed to link
22 // any app to the browser. The module does nothing except report 27 // any app to the browser. The module does nothing except report
23 // starting/ending the function Instance_DidCreate. The Windows app does not 28 // starting/ending the function Instance_DidCreate. The Windows app does not
24 // run because it is not being called. 29 // run because it is not being called.
25 30
26 //#define STEP3 31 //#define STEP3
27 // What changed: Replace WinMain with WndProc, and call it from 32 // What changed: Replace WinMain with WndProc, and call it from
28 // Instance_DidCreate, launching HelloNaCl in its own window. 33 // Instance_DidCreate, launching hello_nacl in its own window.
29 // Since WndProc spins in its message loop, the call to Instance_DidCreate 34 // Since WndProc spins in its message loop, the call to Instance_DidCreate
30 // never returns. 35 // never returns.
31 // Close the HelloNaCl window and the module initialization will finish. 36 // Close the hello_nacl window and the module initialization will finish.
32 37
33 //#define STEP4 38 //#define STEP4
34 // What changed: In WndProc replace the message loop with a callback function. 39 // What changed: In WndProc replace the message loop with a callback function.
35 // Now the app window and the Native Client module are running concurrently. 40 // Now the app window and the Native Client module are running concurrently.
36 41
37 //#define STEP5 42 //#define STEP5
38 // What changed: Instance_DidCreate calls initInstanceInBrowserWindow rather 43 // What changed: Instance_DidCreate calls InitInstanceInBrowserWindow rather
39 // than initInstanceInPCWindow. 44 // than InitInstanceInPCWindow.
40 // The initInstanceInBrowserWindow uses postMessage to place text (now "Hello, 45 // The InitInstanceInBrowserWindow uses postMessage to place text (now "Hello,
41 // Native Client") in the web page instead of opening and writing to a window. 46 // Native Client") in the web page instead of opening and writing to a window.
42 47
43 //#define STEP6 48 //#define STEP6
44 // What changed: All the Windows code is def'd out, to prove we are 49 // What changed: All the Windows code is def'd out, to prove we are
45 // PPAPI-compliant. The functional code that is running is the same as STEP5. 50 // PPAPI-compliant. The functional code that is running is the same as STEP5.
46 51
47 // *** SELECT THE NACL64 PLATFORM AND RUN *** 52 // *** SELECT THE NACL64 PLATFORM AND RUN ***
48 53
49 // What changed: The code is the same as STEP6, but you are using the SDK 54 // What changed: The code is the same as STEP6, but you are using the SDK
50 // toolchain to compile it into a nexe. The module is now running as a real 55 // toolchain to compile it into a nexe. The module is now running as a real
51 // Native Client executable in a NaCl sandbox, with nacl-gdb attached. 56 // Native Client executable in a NaCl sandbox, with nacl-gdb attached.
52 57
53 // *** RUN YOUR MODULE IN THE WILD *** 58 // *** RUN YOUR MODULE IN THE WILD ***
54 // You can run your nexe outside of Visual Studio, directly from Chrome by 59 // You can run your nexe outside of Visual Studio, directly from Chrome by
55 // following these steps: 60 // following these steps:
56 // - Build STEP6 and verify the file <project 61 // - Build STEP6 and verify the file
57 // directory>/newlib/HelloNaCl/HelloNaCl.nexe exists 62 // <project directory>/NaCl64/newlib/Debug/hello_nacl_64.nexe exists
58 // - Copy the folder <project directory>/HelloNaCl into your NaCl SDK's example 63 // - Copy the folder <project directory> into your NaCl SDK's example
59 // directory. 64 // directory.
60 // - Go to the NaCl SDK directory and launch the httpd.py server. 65 // - Go to the NaCl SDK directory and launch the httpd.py server.
61 // - Launch Chrome, go to about:flags and enable the Native Client flag and 66 // - Launch Chrome, go to about:flags and enable the Native Client flag and
62 // relaunch Chrome 67 // relaunch Chrome
63 // - Point Chrome at localhost:5103/HelloNaCl 68 // - Point Chrome at localhost:5103/hello_nacl
64 69
65 70
66 #ifdef STEP6 71 #ifdef STEP6
67 // remove Windows-dependent code. 72 // remove Windows-dependent code.
68 #undef STEP1 73 #undef STEP1
69 #undef STEP3 74 #undef STEP3
70 #undef STEP4 75 #undef STEP4
71 #define NULL 0 76 #define NULL 0
72 #else 77 #else
73 // includes for Windows APIs. 78 // includes for Windows APIs.
(...skipping 17 matching lines...) Expand all
91 #include "ppapi/c/ppp_instance.h" 96 #include "ppapi/c/ppp_instance.h"
92 #include "ppapi/c/ppp_messaging.h" 97 #include "ppapi/c/ppp_messaging.h"
93 #include <string.h> 98 #include <string.h>
94 99
95 // Native Client APIs 100 // Native Client APIs
96 static PPB_Messaging* ppb_messaging_interface = NULL; 101 static PPB_Messaging* ppb_messaging_interface = NULL;
97 static PPB_Var* ppb_var_interface = NULL; 102 static PPB_Var* ppb_var_interface = NULL;
98 static PPB_Core* ppb_core_interface = NULL; 103 static PPB_Core* ppb_core_interface = NULL;
99 PP_Instance myInstance; 104 PP_Instance myInstance;
100 105
101 int initInstanceInPCWindow(); 106 int InitInstanceInPCWindow();
102 void initInstanceInBrowserWindow(); 107 void InitInstanceInBrowserWindow();
103 108
104 #endif 109 #endif
105 110
106 111
107 #ifdef STEP4 112 #ifdef STEP4
108 // Implements message handling in a callback function. 113 // Implements message handling in a callback function.
109 void HelloWorldCallbackFun(void* user_data, int32_t result); 114 void HelloWorldCallback(void* user_data, int32_t result) {
110 struct PP_CompletionCallback HelloWorldCallback = { HelloWorldCallbackFun, NULL };
111
112 void HelloWorldCallbackFun(void* user_data, int32_t result) {
113 MSG uMsg; 115 MSG uMsg;
114 if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { 116 if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) {
115 TranslateMessage(&uMsg); 117 TranslateMessage(&uMsg);
116 DispatchMessage(&uMsg); 118 DispatchMessage(&uMsg);
117 } 119 }
118 ppb_core_interface->CallOnMainThread(100, HelloWorldCallback, 0); 120 ppb_core_interface->CallOnMainThread(100, HelloWorldCallback, 0);
119 } 121 }
120 122
123 struct PP_CompletionCallback HelloWorldCallback = { HelloWorldCallback, NULL };
121 #endif 124 #endif
122 125
123 #ifdef STEP2 126 #ifdef STEP2
124 // The basic framework needed for all Native Client Modules. Handles creation 127 // The basic framework needed for all Native Client Modules. Handles creation
125 // of the module instance and initial handshake with the browser. 128 // of the module instance and initial handshake with the browser.
126 /** 129 /**
127 * Creates new string PP_Var from C string. Useful utility for 130 * Creates new string PP_Var from C string. Useful utility for
128 * message-handling. 131 * message-handling.
129 */ 132 */
130 static struct PP_Var CStrToVar(const char* str) { if (ppb_var_interface != 133 static struct PP_Var CStrToVar(const char* str) { if (ppb_var_interface !=
131 NULL) { return ppb_var_interface->VarFromUtf8(str, strlen(str)); } return 134 NULL) { return ppb_var_interface->VarFromUtf8(str, strlen(str)); } return
132 PP_MakeUndefined(); } 135 PP_MakeUndefined(); }
133 136
134 137
135 void initInstanceInBrowserWindow() { 138 void InitInstanceInBrowserWindow() {
136 // Pass the text to the browser page, there is no separate app window 139 // Pass the text to the browser page, there is no separate app window
137 // anymore. The text is added as a new element to the page, it does not 140 // anymore. The text is added as a new element to the page, it does not
138 // appear in the module's embed view. 141 // appear in the module's embed view.
139 ppb_messaging_interface->PostMessage(myInstance, CStrToVar("Hello, Native 142 ppb_messaging_interface->PostMessage(myInstance,
140 Client!")); } 143 CStrToVar("Hello, Native Client!"));
144 }
141 145
142 /** 146 /**
143 * Called when the NaCl module is instantiated on the web page. 147 * Called when the NaCl module is instantiated on the web page.
144 */ 148 */
145 static PP_Bool Instance_DidCreate(PP_Instance instance, 149 static PP_Bool Instance_DidCreate(PP_Instance instance,
146 uint32_t argc, 150 uint32_t argc,
147 const char* argn[], 151 const char* argn[],
148 const char* argv[]) { 152 const char* argv[]) {
149 myInstance = instance; 153 myInstance = instance;
150 ppb_messaging_interface->PostMessage(instance, 154 ppb_messaging_interface->PostMessage(instance,
151 CStrToVar("Start Instance_DidCreate")); 155 CStrToVar("Start Instance_DidCreate"));
152 #ifdef STEP5 156 #ifdef STEP5
153 // Will be included in STEP5 and STEP6 157 // Will be included in STEP5 and STEP6
154 // Uses messaging to relay text to the module's view on the web page 158 // Uses messaging to relay text to the module's view on the web page
155 initInstanceInBrowserWindow(); 159 InitInstanceInBrowserWindow();
156 #else 160 #else
157 #ifdef STEP3 161 #ifdef STEP3
158 // Will be included in STEP3 and STEP4 only 162 // Will be included in STEP3 and STEP4 only
159 // Uses WndProc to place text in a window separate from the browser. 163 // Uses WndProc to place text in a window separate from the browser.
160 initInstanceInPCWindow(); 164 InitInstanceInPCWindow();
161 #endif 165 #endif
162 #endif 166 #endif
163 167
164 ppb_messaging_interface->PostMessage(instance, 168 ppb_messaging_interface->PostMessage(instance,
165 CStrToVar("End Instance_DidCreate")); 169 CStrToVar("End Instance_DidCreate"));
166 return PP_TRUE; 170 return PP_TRUE;
167 } 171 }
168 172
169 /** 173 /**
170 * Called when the NaCl module is destroyed. 174 * Called when the NaCl module is destroyed.
(...skipping 21 matching lines...) Expand all
192 * registered MIME types. This function is not called on NaCl modules. This 196 * registered MIME types. This function is not called on NaCl modules. This
193 * function is essentially a place-holder for the required function pointer in 197 * function is essentially a place-holder for the required function pointer in
194 * the PPP_Instance structure. 198 * the PPP_Instance structure.
195 */ 199 */
196 static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance, 200 static PP_Bool Instance_HandleDocumentLoad(PP_Instance instance,
197 PP_Resource url_loader) { 201 PP_Resource url_loader) {
198 /* NaCl modules do not need to handle the document load function. */ 202 /* NaCl modules do not need to handle the document load function. */
199 return PP_FALSE; 203 return PP_FALSE;
200 } 204 }
201 205
202
203
204 /** 206 /**
205 * Entry points for the module. 207 * Entry points for the module.
206 * Initialize needed interfaces: PPB_Core, PPB_Messaging and PPB_Var. 208 * Initialize needed interfaces: PPB_Core, PPB_Messaging and PPB_Var.
207 */ 209 */
208 PP_EXPORT int32_t PPP_InitializeModule(PP_Module a_module_id, 210 PP_EXPORT int32_t PPP_InitializeModule(PP_Module a_module_id,
209 PPB_GetInterface get_browser) { 211 PPB_GetInterface get_browser) {
210 ppb_messaging_interface = (PPB_Messaging*) 212 ppb_messaging_interface = (PPB_Messaging*)
211 get_browser(PPB_MESSAGING_INTERFACE); 213 get_browser(PPB_MESSAGING_INTERFACE);
212 ppb_var_interface = (PPB_Var*)get_browser(PPB_VAR_INTERFACE); 214 ppb_var_interface = (PPB_Var*)get_browser(PPB_VAR_INTERFACE);
213 ppb_core_interface = (PPB_Core*)get_browser(PPB_CORE_INTERFACE); 215 ppb_core_interface = (PPB_Core*)get_browser(PPB_CORE_INTERFACE);
214 return PP_OK; 216 return PP_OK;
215 } 217 }
216 218
217
218 /** 219 /**
219 * Returns an interface pointer for the interface of the given name, or NULL 220 * Returns an interface pointer for the interface of the given name, or NULL
220 * if the interface is not supported. 221 * if the interface is not supported.
221 */ 222 */
222 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) { 223 PP_EXPORT const void* PPP_GetInterface(const char* interface_name) {
223 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) { 224 if (strcmp(interface_name, PPP_INSTANCE_INTERFACE) == 0) {
224 static PPP_Instance instance_interface = { 225 static PPP_Instance instance_interface = {
225 &Instance_DidCreate, 226 &Instance_DidCreate,
226 &Instance_DidDestroy, 227 &Instance_DidDestroy,
227 &Instance_DidChangeView, 228 &Instance_DidChangeView,
228 &Instance_DidChangeFocus, 229 &Instance_DidChangeFocus,
229 &Instance_HandleDocumentLoad, 230 &Instance_HandleDocumentLoad,
230 }; 231 };
231 return &instance_interface; 232 return &instance_interface;
232 } 233 }
233 return NULL; 234 return NULL;
234 } 235 }
235 236
236
237 /** 237 /**
238 * Called before the plugin module is unloaded. 238 * Called before the plugin module is unloaded.
239 */ 239 */
240 PP_EXPORT void PPP_ShutdownModule() { 240 PP_EXPORT void PPP_ShutdownModule() {
241 } 241 }
242 #endif 242 #endif
243 243
244
245
246 // **** Application Code **** 244 // **** Application Code ****
247 245
248 #ifdef STEP1 246 #ifdef STEP1
249 // Desktop Windows Hello World app. Native Client agnostic. 247 // Desktop Windows Hello World app. Native Client agnostic.
250 248
251 static TCHAR szWindowClass[] = _T("win32app"); 249 static TCHAR szWindowClass[] = _T("win32app");
252 static TCHAR szTitle[] = _T("HelloNaCl"); 250 static TCHAR szTitle[] = _T("hello_nacl");
253 HINSTANCE hInst; 251 HINSTANCE hInst;
254 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 252 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
255 253
256 // WinMain 254 // WinMain
257 int WINAPI WinMain(HINSTANCE hInstance, 255 int WINAPI WinMain(HINSTANCE hInstance,
258 HINSTANCE hPrevInstance, 256 HINSTANCE hPrevInstance,
259 LPSTR lpCmdLine, 257 LPSTR lpCmdLine,
260 int nCmdShow) { 258 int nCmdShow) {
261 WNDCLASSEX wcex; 259 WNDCLASSEX wcex;
262 HWND hWnd; 260 HWND hWnd;
263 MSG msg; 261 MSG msg;
264 262
265 wcex.cbSize = sizeof(WNDCLASSEX); 263 wcex.cbSize = sizeof(WNDCLASSEX);
266 wcex.style = CS_HREDRAW | CS_VREDRAW; 264 wcex.style = CS_HREDRAW | CS_VREDRAW;
267 wcex.lpfnWndProc = WndProc; 265 wcex.lpfnWndProc = WndProc;
268 wcex.cbClsExtra = 0; 266 wcex.cbClsExtra = 0;
269 wcex.cbWndExtra = 0; 267 wcex.cbWndExtra = 0;
270 wcex.hInstance = hInstance; 268 wcex.hInstance = hInstance;
271 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); 269 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
272 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 270 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
273 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 271 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
274 wcex.lpszMenuName = NULL; 272 wcex.lpszMenuName = NULL;
275 wcex.lpszClassName = szWindowClass; 273 wcex.lpszClassName = szWindowClass;
276 wcex.hIconSm = LoadIcon(wcex.hInstance, 274 wcex.hIconSm = LoadIcon(wcex.hInstance,
277 MAKEINTRESOURCE(IDI_APPLICATION)); 275 MAKEINTRESOURCE(IDI_APPLICATION));
278 276
279 if (!RegisterClassEx(&wcex)) { 277 if (!RegisterClassEx(&wcex)) {
280 MessageBox(NULL, 278 MessageBox(NULL,
281 _T("Call to RegisterClassEx failed!"), 279 _T("Call to RegisterClassEx failed!"),
282 _T("HelloNaCl"), 280 _T("hello_nacl"),
283 0); 281 0);
284 282
285 return 1; 283 return 1;
286 } 284 }
287 285
288 hInst = hInstance; 286 hInst = hInstance;
289 287
290 hWnd = CreateWindow( 288 hWnd = CreateWindow(
291 szWindowClass, 289 szWindowClass,
292 szTitle, 290 szTitle,
293 WS_OVERLAPPEDWINDOW, 291 WS_OVERLAPPEDWINDOW,
294 CW_USEDEFAULT, CW_USEDEFAULT, 292 CW_USEDEFAULT, CW_USEDEFAULT,
295 500, 100, 293 500, 100,
296 NULL, 294 NULL,
297 NULL, 295 NULL,
298 hInstance, 296 hInstance,
299 NULL 297 NULL);
300 );
301 298
302 if (!hWnd) { 299 if (!hWnd) {
303 MessageBox(NULL, 300 MessageBox(NULL,
304 _T("Call to CreateWindow failed!"), 301 _T("Call to CreateWindow failed!"),
305 _T("HelloNaCl"), 302 _T("hello_nacl"),
306 0); 303 0);
307 304
308 return 1; 305 return 1;
309 } 306 }
310 307
311 ShowWindow(hWnd, nCmdShow); 308 ShowWindow(hWnd, nCmdShow);
312 UpdateWindow(hWnd); 309 UpdateWindow(hWnd);
313 310
314 // Main message loop: 311 // Main message loop:
315 312
316 while (GetMessage(&msg, NULL, 0, 0)) { 313 while (GetMessage(&msg, NULL, 0, 0)) {
317 TranslateMessage(&msg); 314 TranslateMessage(&msg);
318 DispatchMessage(&msg); 315 DispatchMessage(&msg);
319 } 316 }
320 317
321 return (int) msg.wParam; 318 return (int) msg.wParam;
322 } 319 }
323 320
324 // WndProc 321 // WndProc
325 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 322 LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
326 { 323 WPARAM wParam, LPARAM lParam) {
327 PAINTSTRUCT ps; 324 PAINTSTRUCT ps;
328 HDC hdc; 325 HDC hdc;
329 TCHAR greeting[] = _T("Hello, World!"); 326 TCHAR greeting[] = _T("Hello, World!");
330 327
331 switch (message) { 328 switch (message) {
332 case WM_PAINT: 329 case WM_PAINT:
333 hdc = BeginPaint(hWnd, &ps); 330 hdc = BeginPaint(hWnd, &ps);
334 TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); 331 TextOut(hdc, 5, 5, greeting, _tcslen(greeting));
335 EndPaint(hWnd, &ps); 332 EndPaint(hWnd, &ps);
336 break; 333 break;
337 case WM_DESTROY: 334 case WM_DESTROY:
338 PostQuitMessage(0); 335 PostQuitMessage(0);
339 break; 336 break;
340 default: 337 default:
341 return DefWindowProc(hWnd, message, wParam, lParam); 338 return DefWindowProc(hWnd, message, wParam, lParam);
342 break; 339 break;
343 } 340 }
344 341
345 return 0; 342 return 0;
346 } 343 }
347 #endif 344 #endif
348 345
349 #ifdef STEP3 346 #ifdef STEP3
350 // Replace WinMain with initInstanceInPCWindow so the Native Client Module can 347 // Replace WinMain with InitInstanceInPCWindow so the Native Client Module can
351 // launch the original application. Note the inclusion of a message-handling 348 // launch the original application. Note the inclusion of a message-handling
352 // loop. STEP4 will replace the loop with a callback. 349 // loop. STEP4 will replace the loop with a callback.
353 HINSTANCE g_hInstance = NULL; HWND g_hWnd = NULL; int initInstanceInPCWindow() 350 HINSTANCE g_hInstance = NULL;
354 { WNDCLASSEX winClass; MSG uMsg; 351 HWND g_hWnd = NULL;
352
353 int InitInstanceInPCWindow() {
354 WNDCLASSEX winClass; MSG uMsg;
355 355
356 memset(&uMsg,0,sizeof(uMsg)); 356 memset(&uMsg,0,sizeof(uMsg));
357 357
358 winClass.lpszClassName = _T("MY_WINDOWS_CLASS"); 358 winClass.lpszClassName = _T("MY_WINDOWS_CLASS");
359 winClass.cbSize = sizeof(WNDCLASSEX); 359 winClass.cbSize = sizeof(WNDCLASSEX);
360 winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 360 winClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
361 winClass.lpfnWndProc = WndProc; 361 winClass.lpfnWndProc = WndProc;
362 winClass.hInstance = g_hInstance; 362 winClass.hInstance = g_hInstance;
363 winClass.hIcon = NULL; 363 winClass.hIcon = NULL;
364 winClass.hIconSm = NULL; 364 winClass.hIconSm = NULL;
365 winClass.hCursor = LoadCursor(NULL, IDC_ARROW); 365 winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
366 winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 366 winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
367 winClass.lpszMenuName = NULL; 367 winClass.lpszMenuName = NULL;
368 winClass.cbClsExtra = 0; 368 winClass.cbClsExtra = 0;
369 winClass.cbWndExtra = 0; 369 winClass.cbWndExtra = 0;
370 370
371 if (!RegisterClassEx(&winClass)) 371 if (!RegisterClassEx(&winClass))
372 return E_FAIL; 372 return E_FAIL;
373 373
374 g_hWnd = CreateWindowEx(NULL, _T("MY_WINDOWS_CLASS"), 374 g_hWnd = CreateWindowEx(
375 _T("HelloNaCl"), 375 NULL, _T("MY_WINDOWS_CLASS"),
376 WS_OVERLAPPEDWINDOW, 376 _T("hello_nacl"), WS_OVERLAPPEDWINDOW,
377 0, 0, 640,480, NULL, NULL, g_hInstance, NULL); 377 0, 0, 640, 480, NULL, NULL, g_hInstance, NULL);
378 378
379 if (g_hWnd == NULL) 379 if (g_hWnd == NULL)
380 return E_FAIL; 380 return E_FAIL;
381 381
382 ShowWindow(g_hWnd, 1); 382 ShowWindow(g_hWnd, 1);
383 383
384 UpdateWindow(g_hWnd); 384 UpdateWindow(g_hWnd);
385 385
386 #ifdef STEP4 386 #ifdef STEP4
387 // Skip the message loop, schedule a callback instead to periodically check 387 // Skip the message loop, schedule a callback instead to periodically check
388 // for messages. Here we schedule at 100ms intervals. 388 // for messages. Here we schedule at 100ms intervals.
389 ppb_core_interface->CallOnMainThread(100, HelloWorldCallback, 0); 389 ppb_core_interface->CallOnMainThread(100, HelloWorldCallback, 0);
390 return 0; 390 return 0;
391 #else 391 #else
392 // Main message loop, Windows style. 392 // Main message loop, Windows style.
393 while(uMsg.message != WM_QUIT) { 393 while(uMsg.message != WM_QUIT) {
394 if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) { 394 if (PeekMessage(&uMsg, NULL, 0, 0, PM_REMOVE)) {
395 TranslateMessage( &uMsg ); 395 TranslateMessage( &uMsg );
396 DispatchMessage( &uMsg ); 396 DispatchMessage( &uMsg );
397 } 397 }
398 } 398 }
399 return uMsg.wParam; 399 return uMsg.wParam;
400 #endif 400 #endif
401 401
402 } 402 }
403 #endif 403 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698