runmidlet_md.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 566 行 · 第 1/2 页
C
566 行
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */#include <windows.h>#include <windowsx.h>#include <aygshell.h>#include <stdio.h>#include <string.h>#include <ctype.h>#include <logging.h>#include <midpAMS.h>#include <midpexport_suite_storage.h>#include <midpMalloc.h>#include <jvm.h>#include <findMidlet.h>#include <commandLineUtil.h>#include <commandLineUtil_md.h>#include <winceapp_export.h>#if ENABLE_MULTIPLE_ISOLATES#define MIDP_HEAP_REQUIREMENT (3 * 1024 * 1024)#else#define MIDP_HEAP_REQUIREMENT (1 * 1024 * 1024)#endif/** Maximum number of command line arguments. */#define RUNMIDLET_MAX_ARGS 32#if ENABLE_MULTIPLE_ISOLATESstatic PTCHAR _szAppName = TEXT("jwc1.1.3 (mvm)");static PTCHAR _szTitle = TEXT("jwc1.1.3 (mvm)");#elsestatic PTCHAR _szAppName = TEXT("jwc1.1.3 (svm)");static PTCHAR _szTitle = TEXT("jwc1.1.3 (svm)");#endifstatic HINSTANCE _hAppInstance = NULL;static HWND _hwndMain = NULL;static char* _argv[RUNMIDLET_MAX_ARGS];static int _argc;int quit_now = 0; /* used by VM to quit immediately. *//** Usage text for the run MIDlet executable. */static const char* const runUsageText ="\n""Usage: runMidlet [<VM args>] [-debug] [-loop] [-classpathext <path>]\n"" (<suite number> | <suite ID>)\n"" [<classname of MIDlet to run> [<arg0> [<arg1> [<arg2>]]]]\n"" Run a MIDlet of an installed suite. If the classname\n"" of the MIDlet is not provided and the suite has multiple MIDlets,\n"" the first MIDlet from the suite will berun.\n"" -debug: start the VM suspended in debug mode\n"" -loop: run the MIDlet in a loop until system shuts down\n"" -classpathext <path>: append <path> to classpath passed to VM\n"" (can access classes from <path> as if they were romized)\n""\n"" where <suite number> is the number of a suite as displayed by the\n"" listMidlets command, and <suite ID> is the unique ID a suite is \n"" referenced by\n\n";/* Translate LPWSTR command line to chars. */int translate_command_line(LPWSTR lpCmdLine, char** argv, int max_args, char* tmp, int max_line) { int argc = 1; size_t index; int res = WideCharToMultiByte(CP_ACP, 0, lpCmdLine, -1, tmp, max_line, NULL, NULL); char seps[] = " ,\t\n\r"; char *token; char *cmdStart = tmp; char *cmdEnd = tmp + strlen(tmp); while (cmdStart < cmdEnd) { index = strcspn(cmdStart, " ,\t\n\r"); /* see if any separators */ if (index == 0) { /* leading terminators, skip */ cmdStart++; } else { /* found something... */ token = cmdStart; if (token[0] == '"') { size_t endIndex; /* * Some minimal parsing of quoted strings. This implementation * is incomplete. You cannot quote the double-quote character * ("). * Double-quotes must be balanced. * Here are some examples that work: * * cldc_hi.exe -classpath "\My Document\classes" helloworld * cldc_hi.exe helloworld pass an empty string arg "" */ token++; /* skip " */ endIndex = strcspn(token, "\""); /* look for trailing " */ if ((token + endIndex) == cmdEnd) { /* Huh? no terminating " oh well pretend it's at the end */ cmdStart = cmdEnd; /* already a null at the end */ argv[argc++] = token; } else { cmdStart = token + endIndex + 1; /* point to char after quote */ token[endIndex] = '\0'; argv[argc++] = token; } } else { /* no quote, just a normal terminator */ token[index] = '\0'; cmdStart = token + index + 1; argv[argc++] = token; } } } return argc;}void process_command_line(LPWSTR lpCmdLine) { static char line_buffer[1024]; int cmdLen = wcslen(lpCmdLine); _argv[0] = "runMidler.exe"; _argc = translate_command_line(lpCmdLine, _argv, RUNMIDLET_MAX_ARGS, line_buffer, sizeof(line_buffer));}HRESULT ActivatePreviousInstance(const TCHAR* lptszClass, const TCHAR* lptszTitle, BOOL* pfActivated){ HRESULT hr = S_OK; int cTries; HANDLE hMutex = NULL; *pfActivated = FALSE; cTries = 5; while (cTries > 0) { /* NOTE: We don't want to own the object. */ hMutex = CreateMutex(NULL, FALSE, lptszClass); if (NULL == hMutex) { /* Something bad happened, fail. */ hr = E_FAIL; goto Exit; } if (GetLastError() == ERROR_ALREADY_EXISTS) { HWND hwnd; CloseHandle(hMutex); hMutex = NULL; /* There is already an instance of this app * running. Try to bring it to the foreground. */ hwnd = FindWindow(lptszClass, lptszTitle); if (NULL == hwnd) { /* It's possible that the other window is in the process of * being created... */ Sleep(500); hwnd = FindWindow(lptszClass, lptszTitle); } if (NULL != hwnd) { /* Set the previous instance as the foreground window * The "| 0x01" in the code below activates * the correct owned window of the * previous instance's main window. */ SetForegroundWindow((HWND) (((ULONG) hwnd) | 0x01)); /* We are done. */ *pfActivated = TRUE; break; } /* It's possible that the instance we found isn't coming up, * but rather is going down. Try again. */ cTries--; } else { /* We were the first one to create the mutex * so that makes us the main instance. 'leak' * the mutex in this function so it gets cleaned * up by the OS when this instance exits. */ break; } } if (cTries <= 0) { /* Someone else owns the mutex but we cannot find * their main window to activate. */ hr = E_FAIL; goto Exit; }Exit: return(hr);}static BOOL InitApplication(HINSTANCE hInstance) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW ; wc.lpfnWndProc = (WNDPROC)winceapp_wndproc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hIcon = NULL; wc.hInstance = hInstance; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName = _szAppName; return RegisterClass(&wc);}static BOOL InitInstance(HINSTANCE hInstance, int CmdShow) { _hwndMain = CreateWindowEx(WS_EX_CAPTIONOKBTN, _szAppName, _szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (!_hwndMain) { return FALSE; } winceapp_set_window_handle(_hwndMain); ShowWindow(_hwndMain, CmdShow ); UpdateWindow(_hwndMain); return TRUE;}static BOOL init_gui(HINSTANCE hInstance, HINSTANCE hPrevInstance, int nShowCmd) { if (!InitApplication(hInstance)) { return FALSE; } if (!InitInstance(hInstance, nShowCmd)) { return FALSE; } return TRUE;}/** * Runs a MIDlet from an installed MIDlet suite. This is an example of * how to use the public MIDP API. * * @param argc The total number of arguments * @param argv An array of 'C' strings containing the arguments * * @return <tt>0</tt> for success, otherwise <tt>-1</tt> *
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?