OSDN Git Service

CVSからの移行 (Mon Jun 20 19:32:14 2005 UTC Revision 1.1より) master v1.1
authorseraphy <seraphy@seraphyware.com>
Sun, 19 Jul 2015 03:40:20 +0000 (12:40 +0900)
committerseraphy <seraphy@seraphyware.com>
Sun, 19 Jul 2015 03:44:14 +0000 (12:44 +0900)
70 files changed:
.project [new file with mode: 0644]
doc/html/jvmservice_doc.css [new file with mode: 0644]
doc/html/jvmservice_doc.html [new file with mode: 0644]
doc/html/jvmservice_doc10.html [new file with mode: 0644]
doc/html/jvmservice_doc11.html [new file with mode: 0644]
doc/html/jvmservice_doc12.html [new file with mode: 0644]
doc/html/jvmservice_doc2.html [new file with mode: 0644]
doc/html/jvmservice_doc3.html [new file with mode: 0644]
doc/html/jvmservice_doc4.html [new file with mode: 0644]
doc/html/jvmservice_doc5.html [new file with mode: 0644]
doc/html/jvmservice_doc6.html [new file with mode: 0644]
doc/html/jvmservice_doc7.html [new file with mode: 0644]
doc/html/jvmservice_doc8.html [new file with mode: 0644]
doc/html/jvmservice_doc9.html [new file with mode: 0644]
doc/jvmservice.pdf [new file with mode: 0644]
doc/jvmservice.tex [new file with mode: 0644]
doc/spaneliminator.pl [new file with mode: 0644]
jvmservice.sln [new file with mode: 0644]
jvmservice/Command.cpp [new file with mode: 0644]
jvmservice/Command.hpp [new file with mode: 0644]
jvmservice/CommandArgument.cpp [new file with mode: 0644]
jvmservice/CommandArgument.hpp [new file with mode: 0644]
jvmservice/ConfigParser.cpp [new file with mode: 0644]
jvmservice/ConfigParser.hpp [new file with mode: 0644]
jvmservice/Event.cpp [new file with mode: 0644]
jvmservice/Event.hpp [new file with mode: 0644]
jvmservice/EventLog.cpp [new file with mode: 0644]
jvmservice/EventLog.hpp [new file with mode: 0644]
jvmservice/ExceptionFilter.cpp [new file with mode: 0644]
jvmservice/ExceptionFilter.hpp [new file with mode: 0644]
jvmservice/JVMException.cpp [new file with mode: 0644]
jvmservice/JVMException.hpp [new file with mode: 0644]
jvmservice/JVMLauncher.cpp [new file with mode: 0644]
jvmservice/JVMLauncher.hpp [new file with mode: 0644]
jvmservice/JVMStartupInfo.cpp [new file with mode: 0644]
jvmservice/JVMThreadAttacher.cpp [new file with mode: 0644]
jvmservice/JVMThreadAttacher.hpp [new file with mode: 0644]
jvmservice/JavaVMCallback.cpp [new file with mode: 0644]
jvmservice/JavaVMCallback.hpp [new file with mode: 0644]
jvmservice/JavaVMMainThread.cpp [new file with mode: 0644]
jvmservice/JavaVMMainThread.hpp [new file with mode: 0644]
jvmservice/JavaVMStartupInfo.hpp [new file with mode: 0644]
jvmservice/MSG00409.bin [new file with mode: 0644]
jvmservice/MSG00411.bin [new file with mode: 0644]
jvmservice/ReadMe.txt [new file with mode: 0644]
jvmservice/Release/jvmservice.exe [new file with mode: 0644]
jvmservice/Release/jvmservice.preload [new file with mode: 0644]
jvmservice/ServiceControlManager.cpp [new file with mode: 0644]
jvmservice/ServiceControlManager.hpp [new file with mode: 0644]
jvmservice/ServiceLaunchCommand.cpp [new file with mode: 0644]
jvmservice/ServiceLaunchCommand.hpp [new file with mode: 0644]
jvmservice/ServiceRegisterCommand.cpp [new file with mode: 0644]
jvmservice/ServiceRegisterCommand.hpp [new file with mode: 0644]
jvmservice/StartupInfo.cpp [new file with mode: 0644]
jvmservice/StartupInfo.hpp [new file with mode: 0644]
jvmservice/Win32Exception.cpp [new file with mode: 0644]
jvmservice/Win32Exception.hpp [new file with mode: 0644]
jvmservice/jvmservice.rc [new file with mode: 0644]
jvmservice/jvmservice.vcproj [new file with mode: 0644]
jvmservice/main.cpp [new file with mode: 0644]
jvmservice/message.h [new file with mode: 0644]
jvmservice/message.mc [new file with mode: 0644]
jvmservice/message.rc [new file with mode: 0644]
jvmservice/resource.h [new file with mode: 0644]
jvmservice/service_main.cpp [new file with mode: 0644]
jvmservice/service_main.hpp [new file with mode: 0644]
jvmservice/stdafx.cpp [new file with mode: 0644]
jvmservice/stdafx.h [new file with mode: 0644]
sample/SampleJVMService.java [new file with mode: 0644]
sample/jvmserv1.conf [new file with mode: 0644]

diff --git a/.project b/.project
new file mode 100644 (file)
index 0000000..0443467
--- /dev/null
+++ b/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>jvmservice</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+       </buildSpec>
+       <natures>
+       </natures>
+</projectDescription>
diff --git a/doc/html/jvmservice_doc.css b/doc/html/jvmservice_doc.css
new file mode 100644 (file)
index 0000000..50dc5aa
--- /dev/null
@@ -0,0 +1,148 @@
+/* start css.sty */
+.ecrm-1728{font-size:170%;}
+.dmjhira-10x-x-172{font-size:172%;}
+.dmjkata-10x-x-172{font-size:172%;}
+.ecrm-1200{font-size:120%;}
+.ectt-1000{ font-family: monospace;}
+.ecbx-1000{ font-weight: bold;}
+.ecrm-0900{font-size:90%;}
+.dmjka-9{font-size:90%;}
+.ectt-0900{font-size:90%; font-family: monospace;}
+.dmjkata-9{font-size:90%;}
+.dmjkk-9{font-size:90%;}
+.dmjkc-9{font-size:90%;}
+.dmjkb-9{font-size:90%;}
+.dmjke-9{font-size:90%;}
+.dmjkl-9{font-size:90%;}
+.dmjhira-9{font-size:90%;}
+.dmjsy-9{font-size:90%;}
+.psyr-x-x-90{font-size:90%;}
+.dmjki-9{font-size:90%;}
+.dmjkd-9{font-size:90%;}
+.dmjkg-9{font-size:90%;}
+.dmjkj-9{font-size:90%;}
+.ecrm-0700{font-size:70%;}
+.ecrm-0800{font-size:80%;}
+.dmjka-8{font-size:80%;}
+.ecrm-0600{font-size:60%;}
+.dmjke-8{font-size:80%;}
+.dmjkd-8{font-size:80%;}
+.dmjhira-8{font-size:80%;}
+.dmjkata-8{font-size:80%;}
+.dmjsy-8{font-size:80%;}
+.dmjkb-8{font-size:80%;}
+.dmjkc-8{font-size:80%;}
+.dmjkj-8{font-size:80%;}
+.dmjkf-8{font-size:80%;}
+.dmjki-8{font-size:80%;}
+.dmjkf-9{font-size:90%;}
+.dmjkh-8{font-size:80%;}
+.dmjkk-8{font-size:80%;}
+.dmjkg-8{font-size:80%;}
+.dmjkl-8{font-size:80%;}
+p.noindent { text-indent: 0em }
+p.nopar { text-indent: 0em; }
+p.indent{ text-indent: 1.5em }
+@media print {div.crosslinks {visibility:hidden;}}
+a img { border-top: 0; border-left: 0; border-right: 0; }
+center { margin-top:1em; margin-bottom:1em; }
+td center { margin-top:0em; margin-bottom:0em; }
+.Canvas { position:relative; }
+img.math{vertical-align:middle;}
+li p.indent { text-indent: 0em }
+.enumerate1 {list-style-type:decimal;}
+.enumerate2 {list-style-type:lower-alpha;}
+.enumerate3 {list-style-type:lower-roman;}
+.enumerate4 {list-style-type:upper-alpha;}
+div.newtheorem { margin-bottom: 2em; margin-top: 2em;}
+.obeylines-h,.obeylines-v {white-space: nowrap; }
+div.obeylines-v p { margin-top:0; margin-bottom:0; }
+.overline{ text-decoration:overline; }
+.overline img{ border-top: 1px solid black; }
+td.displaylines {text-align:center; white-space:nowrap;}
+.centerline {text-align:center;}
+.rightline {text-align:right;}
+div.verbatim {font-family: monospace; white-space: nowrap; }
+.fbox {padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
+div.center div.fbox {text-align:center; clear:both; padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
+table.minipage{width:100%;}
+div.center, div.center div.center {text-align: center; margin-left:1em; margin-right:1em;}
+div.center div {text-align: left;}
+div.flushright, div.flushright div.flushright {text-align: right;}
+div.flushright div {text-align: left;}
+div.flushleft {text-align: left;}
+.underline{ text-decoration:underline; }
+.underline img{ border-bottom: 1px solid black; margin-bottom:1pt; }
+.framebox-c, .framebox-l, .framebox-r { padding-left:3.0pt; padding-right:3.0pt; text-indent:0pt; border:solid black 0.4pt; }
+.framebox-c {text-align:center;}
+.framebox-l {text-align:left;}
+.framebox-r {text-align:right;}
+span.thank-mark{ vertical-align: super }
+div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; }
+table.tabular td p{margin-top:0em;}
+table.tabular {margin-left: auto; margin-right: auto;}
+div.td00{ margin-left:0pt; margin-right:0pt; }
+div.td01{ margin-left:0pt; margin-right:5pt; }
+div.td10{ margin-left:5pt; margin-right:0pt; }
+div.td11{ margin-left:5pt; margin-right:5pt; }
+td.td00{ padding-left:0pt; padding-right:0pt; }
+td.td01{ padding-left:0pt; padding-right:5pt; }
+td.td10{ padding-left:5pt; padding-right:0pt; }
+td.td11{ padding-left:5pt; padding-right:5pt; }
+.hline hr, .cline hr{ height : 1px; margin:0px; }
+.tabbing-right {text-align:right;}
+span.TEX {letter-spacing: -0.125em; }
+span.TEX span.E{ position:relative;top:0.5ex;left:-0.0417em;}
+a span.TEX span.E {text-decoration: none; }
+span.LATEX span.A{ position:relative; top:-0.5ex; left:-0.4em; font-size:85%;}
+span.LATEX span.TEX{ position:relative; left: -0.4em; }
+div.float img, div.float .caption {text-align:center;}
+div.figure img, div.figure .caption {text-align:center;}
+.marginpar {width:20%; float:right; text-align:left; margin-left:auto; margin-top:0.5em; font-size:85%; text-decoration:underline;}
+.marginpar p{margin-top:0.4em; margin-bottom:0.4em;}
+.equation td{text-align:center; }
+td.equation { margin-top:1em; margin-bottom:1em; } 
+td.eqnarray4 { width:5%; white-space: normal; }
+td.eqnarray2 { width:5%; }
+table.eqnarray-star, table.eqnarray {width:100%;}
+div.eqnarray{text-align:center;}
+div.array {text-align:center;}
+div.pmatrix {text-align:center;}
+span.pmatrix img{vertical-align:middle;}
+div.pmatrix {text-align:center;}
+img.cdots{vertical-align:middle;}
+.partToc a, .partToc, .likepartToc a, .likepartToc {line-height: 200%; font-weight:bold; font-size:110%;}
+.caption td.id{font-weight: bold; white-space: nowrap; }
+table.caption {text-align:center;}
+h1.partHead{text-align: center}
+p.bibitem { text-indent: -2em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; }
+p.bibitem-p { text-indent: 0em; margin-left: 2em; margin-top:0.6em; margin-bottom:0.6em; }
+.paragraphHead, .likeparagraphHead { margin-top:2em; font-weight: bold;}
+.subparagraphHead, .likesubparagraphHead { font-weight: bold;}
+.quote {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; }
+.verse{white-space:nowrap; margin-left:2em}
+div.maketitle {text-align:center;}
+h2.titleHead{text-align:center;}
+div.maketitle{ margin-bottom: 2em; }
+div.author, div.date {text-align:center;}
+div.thanks{text-align:left; margin-left:10%; font-size:80%; font-style:italic; }
+div.author{white-space: nowrap;}
+.quotation {margin-bottom:0.25em; margin-top:0.25em; margin-left:1em; }
+.abstract p {margin-left:5%; margin-right:5%;}
+div.tabular, div.center div.tabular {text-align: center; margin-top:0.5em; margin-bottom:0.5em; }
+table.tabular td p{margin-top:0em;}
+table.tabular {margin-left: auto; margin-right: auto;}
+div.td00{ margin-left:0pt; margin-right:0pt; }
+div.td01{ margin-left:0pt; margin-right:5pt; }
+div.td10{ margin-left:5pt; margin-right:0pt; }
+div.td11{ margin-left:5pt; margin-right:5pt; }
+td.td00{ padding-left:0pt; padding-right:0pt; }
+td.td01{ padding-left:0pt; padding-right:5pt; }
+td.td10{ padding-left:5pt; padding-right:0pt; }
+td.td11{ padding-left:5pt; padding-right:5pt; }
+.hline hr, .cline hr{ height : 1px; margin:0px; }
+div.array {text-align:center;}
+.alltt P { margin-bottom : 0em; margin-top : 0em; }
+.alltt { margin-bottom : 1em; margin-top : 1em; }
+/* end css.sty */
diff --git a/doc/html/jvmservice_doc.html b/doc/html/jvmservice_doc.html
new file mode 100644 (file)
index 0000000..79259a4
--- /dev/null
@@ -0,0 +1,896 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head> <title>jvmservice \82É\82Â\82¢\82Ä (\83h\83\89\83t\83g)</title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+   <div class="maketitle">
+                                                                    
+
+                                                                    
+                                                                    
+
+                                                                    
+
+<h2 class="titleHead">jvmservice \82É\82Â\82¢\82Ä (\83h\83\89\83t\83g)</h2>
+ <div class="author" >seraphy</div>
+<br>
+<div class="date" >June 1, 2005</div>
+   </div>
+<p class="indent">
+   <h3 class="likesectionHead"><a  id="x1-1000"></a>Contents</h3>
+   <div class="tableofcontents">
+   1 <a href="#x1-20001" id="QQ2-1-2">\82Í\82\82ß\82É</a>
+<br>    1.1 <a href="#x1-30001.1" id="QQ2-1-3">\96{\83h\83L\83\85\83\81\83\93\83g\82É\82Â\82¢\82Ä</a>
+<br>    1.2 <a href="#x1-40001.2" id="QQ2-1-4">jvmservice \82Æ\82Í</a>
+<br>     1.2.1 <a href="#x1-50001.2.1" id="QQ2-1-5">\96Ú\93I\81E\97p\93r</a>
+<br>     1.2.2 <a href="#x1-60001.2.2" id="QQ2-1-6">\83R\83\93\83Z\83v\83g\81A\8eÀ\8c»\95û\96@</a>
+<br>    1.3 <a href="#x1-70001.3" id="QQ2-1-7">\8aJ\94­\81E\93®\8dì\8aÂ\8b«</a>
+<br>     1.3.1 <a href="#x1-80001.3.1" id="QQ2-1-8">\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80</a>
+<br>     1.3.2 <a href="#x1-90001.3.2" id="QQ2-1-9">JAVA \8aÂ\8b« (JDK/JRE)</a>
+<br>     1.3.3 <a href="#x1-100001.3.3" id="QQ2-1-10">\8aJ\94­\8c¾\8cê\81E\8aÂ\8b«</a>
+<br>    1.4 <a href="#x1-110001.4" id="QQ2-1-11">\83\89\83C\83Z\83\93\83X</a>
+<br>   2 <a href="#x1-120002" id="QQ2-1-12">\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93</a>
+<br>    2.1 <a href="#x1-130002.1" id="QQ2-1-13">\93ü\8eè\95û\96@</a>
+<br>    2.2 <a href="#x1-140002.2" id="QQ2-1-14">\93à\97e\90à\96¾</a>
+<br>     2.2.1 <a href="#x1-150002.2.1" id="QQ2-1-15">jvmservice.exe</a>
+<br>     2.2.2 <a href="#x1-160002.2.2" id="QQ2-1-16">jvmservice.preload</a>
+<br>     2.2.3 <a href="#x1-170002.2.3" id="QQ2-1-17">sample/jvmserv1.conf</a>
+<br>     2.2.4 <a href="#x1-180002.2.4" id="QQ2-1-18">sample/SampleJVMService.java</a>
+<br>    2.3 <a href="#x1-190002.3" id="QQ2-1-19">\83T\83\93\83v\83\8b\97p JAVA \83R\81[\83h\82Ì\8eÀ\8ds</a>
+<br>     2.3.1 <a href="#x1-200002.3.1" id="QQ2-1-20">SampleJVMService \82Ì\90à\96¾</a>
+<br>     2.3.2 <a href="#x1-210002.3.2" id="QQ2-1-21">\83\\81[\83X\83R\81[\83h (\94²\90\88)</a>
+<br>     2.3.3 <a href="#x1-220002.3.3" id="QQ2-1-22">SampleJVMService \82Ì\8eÀ\8ds</a>
+<br>     2.3.4 <a href="#x1-230002.3.4" id="QQ2-1-23">\8fI\97¹\8f\88\97\9d</a>
+<br>    2.4 <a href="#x1-240002.4" id="QQ2-1-24">\83T\81[\83r\83X\93o\98^\81^\93o\98^\89ð\8f\9c\83c\81[\83\8b</a>
+                                                                    
+
+                                                                    
+<br>     2.4.1 <a href="#x1-250002.4.1" id="QQ2-1-25">\93o\98^\83I\83v\83V\83\87\83\93\82Ì\8aÈ\92P\82È\90à\96¾</a>
+<br>    2.5 <a href="#x1-260002.5" id="QQ2-1-26">\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</a>
+<br>     2.5.1 <a href="#x1-270002.5.1" id="QQ2-1-27">\83T\83\93\83v\83\8b\97p\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</a>
+<br>     2.5.2 <a href="#x1-280002.5.2" id="QQ2-1-28">JavaVM \82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^</a>
+<br>     2.5.3 <a href="#x1-290002.5.3" id="QQ2-1-29">\8eÀ\8ds\82·\82é\83N\83\89\83X\82Ì\8ew\92è</a>
+<br>    2.6 <a href="#x1-300002.6" id="QQ2-1-30">\83T\81[\83r\83X\82Ì\93o\98^</a>
+<br>    2.7 <a href="#x1-310002.7" id="QQ2-1-31">\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\95Ò\8fW</a>
+<br>     2.7.1 <a href="#x1-320002.7.1" id="QQ2-1-32">\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\8d\\91¢</a>
+<br>     2.7.2 <a href="#x1-330002.7.2" id="QQ2-1-33">jvm.dll \82Ì\8ew\92è</a>
+<br>     2.7.3 <a href="#x1-340002.7.3" id="QQ2-1-34">\88Ù\82È\82é\83o\81[\83W\83\87\83\93\82Ì JavaVM \82Ì\8ew\92è</a>
+<br>    2.8 <a href="#x1-350002.8" id="QQ2-1-35">\83T\81[\83r\83X\82Ì\8eÀ\8ds</a>
+<br>     2.8.1 <a href="#x1-360002.8.1" id="QQ2-1-36">\83T\81[\83r\83X\82Ì\8aJ\8en</a>
+<br>     2.8.2 <a href="#x1-370002.8.2" id="QQ2-1-37">\83T\81[\83r\83X\82Ì\8fI\97¹</a>
+<br>     2.8.3 <a href="#x1-380002.8.3" id="QQ2-1-38">\83\8d\83O\83I\83t\82Æ\83V\83\83\83b\83g\83_\83E\83\93\82Ì\83e\83X\83g</a>
+<br>    2.9 <a href="#x1-390002.9" id="QQ2-1-39">\83A\83\93\83C\83\93\83X\83g\81[\83\8b</a>
+<br>     2.9.1 <a href="#x1-400002.9.1" id="QQ2-1-40">\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c</a>
+<br>     2.9.2 <a href="#x1-410002.9.2" id="QQ2-1-41">jvmservice.exe \82Ì\8dí\8f\9c</a>
+<br>   3 <a href="#x1-420003" id="QQ2-1-42">\83}\83j\83\85\83A\83\8b</a>
+<br>    3.1 <a href="#x1-430003.1" id="QQ2-1-43">jvmservice \8bN\93®\83I\83v\83V\83\87\83\93</a>
+<br>    3.2 <a href="#x1-440003.2" id="QQ2-1-44">\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</a>
+<br>    3.3 <a href="#x1-450003.3" id="QQ2-1-45">\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b</a>
+<br>    3.4 <a href="#x1-460003.4" id="QQ2-1-46">\83\8d\83O\83t\83@\83C\83\8b\82Ì\93à\97e</a>
+<br>    3.5 <a href="#x1-470003.5" id="QQ2-1-47">\83C\83x\83\93\83g\83r\83\85\81[\83\8f\82Ì\93à\97e</a>
+<br>   4 <a href="#x1-480004" id="QQ2-1-48">\83A\81[\83L\83e\83N\83`\83\83</a>
+   </div>
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h3 class="sectionHead">1    <a  id="x1-20001"></a>\82Í\82\82ß\82É</h3>
+<p class="noindent">
+   <h4 class="subsectionHead">1.1    <a  id="x1-30001.1"></a>\96{\83h\83L\83\85\83\81\83\93\83g\82É\82Â\82¢\82Ä</h4>
+<p class="noindent">\96{\83h\83L\83\85\83\81\83\93\83g\82Í June 1, 2005 \8c»\8dÝ\82Ì\8aJ\94­\92\86\83o\81[\83W\83\87\83\93\82Ì jvmservice \82Ì\8c»\8fó\82É\82Â\82¢\82Ä\90à\96¾\82µ
+\82Ä\82¢\82é\81B\96{\83h\83L\83\85\83\81\83\93\83g\82Í\83h\83\89\83t\83g\94Å\82Å\82 \82è\81A\90³\8am\82Å\82à\8a®\91S\82Å\82à\82È\82¢\81B
+<p class="noindent">
+   <h4 class="subsectionHead">1.2    <a  id="x1-40001.2"></a>jvmservice \82Æ\82Í</h4>
+<p class="noindent">
+   <h5 class="subsubsectionHead">1.2.1    <a  id="x1-50001.2.1"></a>\96Ú\93I\81E\97p\93r</h5>
+<p class="noindent">jvmservice \82Í\81A Windows2000/XP/2003 \8fã\82Å\82Ì\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä JAVA \8c¾\8cê\82Å\8bL\8fq
+\82³\82ê\82½\83N\83\89\83X\83t\83@\83C\83\8b\82ð\8bN\93®\82³\82¹\82é\82±\82Æ\82ª\82Å\82«\82é\82æ\82¤\82É\82·\82é\83\89\83\93\83`\83\83\81[\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Å\82 
+\82é\81B
+<p class="indent">   \82±\82ê\82Í\8eå\82É\81A\8e©\8dì\82Ì JAVA \82Å\8bL\8fq\82³\82ê\82½\83T\81[\83r\83X\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\81A Windows
+\82Ì\83T\81[\83r\83X\82Æ\82µ\82Ä\93\9d\8d\87\82Å\82«\82é\82æ\82¤\82É\82·\82é\82½\82ß\82Ì\83c\81[\83\8b\82Æ\82µ\82Ä\8eg\82í\82ê\82é\82±\82Æ\82ð\91z\92è
+\82µ\82Ä\82¢\82é\81B\8aù\91\82Ì\90»\95i\8cQ\81A\82½\82Æ\82¦\82ΠApache Tomcat \82È\82Ç\82É\82Í\81A\82·\82Å\82É\83T\81[\83r\83X
+\89»\82·\82é\82½\82ß\82Ì\8b@\8d\\82ð\8e©\95ª\82Å\82à\82Á\82Ä\82¨\82è\81A\82»\82Ì\82æ\82¤\82È\82à\82Ì\82É\82Æ\82Á\82Ä\82©\82í\82é\97\98\93_\82Í\96³
+\82¢\81B
+<p class="indent">   \82»\82Ì\82©\82í\82è jvmservice \82Í\83R\83\93\83\\81[\83\8b\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Æ\82µ\82Ä\90Ý\8cv\82³\82ê\82½ JAVA \83A\83v\83\8a
+\83P\81[\83V\83\87\83\93\82ð\81A\94ä\8ar\93I\8aÈ\92P\82È\8fC\90³\82É\82æ\82è\81A\83T\81[\83r\83X\82É\91Î\89\9e\82µ\82½\83T\81[\83o\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82É\83A\83b
+\83v\83O\83\8c\81[\83h\82·\82é\82½\82ß\82Ì\8b@\8d\\82ð\92ñ\8b\9f\82·\82é\81B
+<p class="indent">   \82Ü\82½\81A\8e©\8dì\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\89½\8cÂ\82 \82Á\82Ä\82à\83T\81[\83r\83X\89»\82Å\82«\82é\82æ\82¤\82É\81A jvmservice \82Å\82Í\82¢
+\82­\82Â\82Å\82à\83T\81[\83r\83X\82ð\8dì\90¬\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">1.2.2    <a  id="x1-60001.2.2"></a>\83R\83\93\83Z\83v\83g\81A\8eÀ\8c»\95û\96@</h5>
+<p class="noindent">jvmservice \82Í\83T\81[\83r\83X\96¼\82ð\93o\98^\82·\82é\82Æ\82«\81A JavaVM \82ð\8bN\93®\82·\82é\83p\83\89\83\81\81[\83^\82Æ\8eÀ\8ds\82·\82é\83N\83\89\83X
+\82È\82Ç\82Ì\8fî\95ñ\82ð\8ai\94[\82µ\82½\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82ð\82ð\83T\81[\83r\83X\82É\8aÖ\98A\82Ã\82¯\82é\81B\82»\82Ì\82½\82ß\81A
+jvmservice \82Í 1 \82Â\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Å\81A\82¢\82­\82Â\82à\82Ì JAVA \83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83T\81[\83r\83X\82Æ\82µ\82Ä
+\8eÀ\8ds\82Å\82«\82é\81B
+<p class="indent">   jvmservice \82ª\8eÀ\8dÛ\82É\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82½\82Æ\82«\81A jvmservice \82Å\82Í JNI \82Ì\8b@\8d\\82ð\97p\82¢
+\82Ä\83T\81[\83r\83X\83v\83\8d\83Z\83X\93à\82É JavaVM \82ð\8dì\90¬\82µ\83N\83\89\83X\82ð\83\8d\81[\83h\82µ\8eÀ\8ds\82·\82é\81B\82±\82Ì\82Æ\82«\81A\83T\81[\83r\83X
+\82É\8aÖ\98A\82Ã\82¯\82ç\82ê\82½\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82©\82ç\95K\97v\82È JavaVM \82Ì\83p\83\89\83\81\81[\83^\82â\81A\8eÀ\8ds\82·
+\82é\83N\83\89\83X\82È\82Ç\82Ì\8fî\95ñ\82ð\8eæ\93¾\82·\82é\81B
+<p class="indent">   jvmservice \83v\83\8d\83Z\83X\82Í\8ew\92è\82³\82ê\82½\94C\88Ó\82Ì (\95¡\90\94\81E\95À\97ñ\89Â) \83N\83\89\83X\82Ì\90Ã\93I\83\81\83\\83b\83h\82ð\8cÄ\82Ñ\8fo
+\82µ\81A\82±\82ê\82ç\82Ì\91S\82Ä\82Ì\83X\83\8c\83b\83h\82ª\92â\8e~\82·\82é\82Æ\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ð\8fI\97¹\82µ\92â\8e~\8fó\91Ô\82Æ\82È
+\82é\81B
+                                                                    
+
+                                                                    
+<p class="indent">   jvmservice \82É\92â\8e~\8ew\8e¦\82ª\91\97\82ç\82ê\82é\82©\81A\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80\82ª\83V\83\83\83b\83g\83_\83E
+\83\93\82ð\8aJ\8en\82·\82é\82Æ\81A jvmservice \83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í JavaVM \82É\91Î\82µ\82Ä\90V\82µ\82¢\92â\8e~
+\97p\83X\83\8c\83b\83h\82ð\8dì\90¬\82µ\81A JavaVM \93à\82©\82çjava.lang.System#exit(0) \82ð\8eÀ\8ds\82·
+\82é\81B
+<p class="indent">   \82±\82ê\82É\82æ\82è\81A JavaVM \82Íjava.lang.Runtime#addShutdownHook(java.lang.Thread)
+\82Å\93o\98^\82³\82ê\82½\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\82ð\8eÀ\8ds\82µ\82Ä\82©\82ç JavaVM \82ª\92â\8e~\82µ\81A JavaVM \82ª
+\83T\81[\83r\83X\83v\83\8d\83Z\83X\82É\91Î\82µ\82Äexit \82·\82é\82æ\82¤\82É\97v\8b\81\82µ\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ª\8fI\97¹\82·
+\82é\81B
+<p class="noindent">
+   <h4 class="subsectionHead">1.3    <a  id="x1-70001.3"></a>\8aJ\94­\81E\93®\8dì\8aÂ\8b«</h4>
+<p class="noindent">
+   <h5 class="subsubsectionHead">1.3.1    <a  id="x1-80001.3.1"></a>\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80</h5>
+<p class="noindent">jvmservice \82ª\91Î\8fÛ\82Æ\82·\82é\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80\82Í\88È\89º\82Ì\82à\82Ì\82Å\82 \82é\81B
+     <ul class="itemize1">
+     <li class="itemize">Windows2000 Professional/Server
+     </li>
+     <li class="itemize">WindowsXP Professional</li></ul>
+<p class="indent">   \82¨\82»\82ç\82­\81A Windows2000 \88È\8d~\82Ì NT \8cn\82Ì OS \82Å\82 \82ê\82Î\93®\82­\82à\82Ì\82Æ\8ev\82í\82ê\82é\82ª\81A\93®\8dì\8am\94F
+\82Í\82µ\82Ä\82¢\82È\82¢\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">1.3.2    <a  id="x1-90001.3.2"></a>JAVA \8aÂ\8b« (JDK/JRE)</h5>
+<p class="noindent">jvmservice \82Ì\8aJ\94­\82É\82 \82½\82è\91Î\8fÛ\82Æ\82µ\82½ JavaVM \82Í\81A Sun Microsystems \82ª\92ñ\8b\9f\82·\82é
+JDK/JRE \82Ì\82¤\82¿\81A\88È\89º\82Ì\82à\82Ì\82Å\82 \82é\81B
+     <ul class="itemize1">
+     <li class="itemize">JDK/JRE 1.3.1_15
+     </li>
+     <li class="itemize">JDK/JRE 1.4.2_08
+     </li>
+     <li class="itemize">JDK/JRE 1.5.0_02</li></ul>
+<p class="indent">   jvmservice \82Í\81A<a href="http://java.sun.com/j2se/1.3/ja/docs/ja/guide/jni/index.html" >JNI1.2 \8ed\97l</a>\82É\8aî\82Ã\82¢\82Ä JavaVM \82ð\8dì\90¬\82µ\81A\91\80\8dì\82µ\82Ä\82¢\82é\81B
+<p class="indent">   \82±\82Ì\8ed\97l\82É\93K\8d\87\82·\82é\83o\81[\83W\83\87\83\93 1.3.1 \88È\8d~\82Ì Java \8aÂ\8b«\82Å\82 \82ê\82Î\82Ç\82ê\82Å\82à\93®\8dì\82·\82é\82Æ\8ev\82í\82ê
+\82é\82ª\81A\93®\8dì\8am\94F\82Í\82µ\82Ä\82¢\82È\82¢\81B Sun Microsystems \88È\8aO\82Ì JavaVM \82Å\82Ì\93®\8dì\8am\94F\82Í\82µ\82Ä\82¢\82È
+\82¢\81B
+                                                                    
+
+                                                                    
+<p class="noindent">
+   <h5 class="subsubsectionHead">1.3.3    <a  id="x1-100001.3.3"></a>\8aJ\94­\8c¾\8cê\81E\8aÂ\8b«</h5>
+<p class="noindent">jvmservice \82Í\81A Microsoft Visual Studio.NET2003 \82Ì Visual C++ \82É\82æ\82Á\82Ä\8bL\8fq\82³\82ê\82Ä\82¢
+\82é\81B
+<p class="indent">   MFC/ATL \82È\82Ç\82Ì\83\89\83C\83u\83\89\83\8a\82Í\8eg\82Á\82Ä\82¢\82È\82¢\81B
+<p class="noindent">
+   <h4 class="subsectionHead">1.4    <a  id="x1-110001.4"></a>\83\89\83C\83Z\83\93\83X</h4>
+<p class="noindent">Licensed under the Open Software License version 2.0
+<p class="indent">   <a href="http://www.opensource.jp/licenses/osl-2.0.html" >\83I\81[\83v\83\93\81E\83\\83t\83g\83E\83F\83A\81E\83\89\83C\83Z\83\93\83X v. 2.0</a>
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h3 class="sectionHead">2    <a  id="x1-120002"></a>\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93</h3>
+<p class="noindent">jvmservice \82Ì\97\98\97p\95û\96@\82Æ\82µ\82Ä\88È\89º\82É\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82ð\8e¦\82·\81B
+<p class="noindent">
+   <h4 class="subsectionHead">2.1    <a  id="x1-130002.1"></a>\93ü\8eè\95û\96@</h4>
+<p class="noindent"><a href="http://sourceforge.jp/projects/jvmservice/" >sourceforge \82Ì jvmservice \83v\83\8d\83W\83F\83N\83g</a>\82©\82ç\81A jvmservice \82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Æ\83T\83\93\83v\83\8b\97p
+JAVA \83R\81[\83h\82ð\8eæ\93¾\82·\82é\81B
+<p class="indent">   \83t\83@\83C\83\8b\96¼\82Í June 1, 2005 \8c»\8dÝ\82Å\82Í\81A\88È\89º\82Ì\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\81B (\8eÀ\8dÛ\82É\82Í\83t\83@\83C\83\8b\96¼\82Ì
+\8cã\82ë\82É\83o\81[\83W\83\87\83\93\82©\83\8a\83r\83W\83\87\83\93\82ð\8e¦\82·\90\94\8e\9a\82ª\82Â\82¯\82ç\82ê\82Ä\82¢\82é\81B)
+     <ul class="itemize1">
+     <li class="itemize">jvmservice.zip
+     </li>
+     <li class="itemize">jvmservice_binary.zip
+     </li>
+     <li class="itemize">sample.zip</li></ul>
+<p class="indent">   jvmservice.zip \82Í\81A\83\\81[\83X\83R\81[\83h\82ð\8aÜ\82Þ\8a®\91S\82È\83Z\83b\83g\82Å\82 \82è\81A jvmservice_binary.zip \82Ì
+\93à\97e\82Æ\81A sample.zip \82Ì\93à\97e\82ð\8aÜ\82ñ\82Å\82¢\82é\81B\82Æ\82è\82 \82¦\82¸\81A jvmservice.zip \82ð\83_\83E\83\93\83\8d\81[\83h\82·\82ê
+\82Î\91S\82Ä\91µ\82¤\82Ì\82Å\8eè\82Á\8eæ\82è\91\81\82¢\82Æ\82¢\82¦\82é\81B
+<p class="noindent">
+   <h4 class="subsectionHead">2.2    <a  id="x1-140002.2"></a>\93à\97e\90à\96¾</h4>
+<p class="noindent">\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\88È\89º\82Ì\83t\83@\83C\83\8b\82ð\97\98\97p\82µ\82Ä\8ds\82¤\81B
+     <ul class="itemize1">
+     <li class="itemize">jvmservice.exe
+     </li>
+     <li class="itemize">jvmservice.preload
+     </li>
+     <li class="itemize">sample/jvmserv1.conf
+     </li>
+     <li class="itemize">sample/SampleJVMService.java</li></ul>
+<p class="indent">   \82±\82ê\82ç\82Ì\83t\83@\83C\83\8b\82Ì\92\86\90g\82É\82Â\82¢\82Ä\90à\96¾\82·\82é\81B
+                                                                    
+
+                                                                    
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.2.1    <a  id="x1-150002.2.1"></a>jvmservice.exe</h5>
+<p class="noindent">jvmservice.exe \82Í\96{\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92\86\8aj\82Å\82 \82é\81B\82±\82Ì\83t\83@\83C\83\8b\82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³
+\82ê\82é\8eÀ\8ds\83t\83@\83C\83\8b\96{\91Ì\82Å\82 \82é\82Æ\93¯\8e\9e\82É\81A\83T\81[\83r\83X\82Ì\93o\98^\82Æ\93o\98^\89ð\8f\9c\82ð\8ds\82¤\83c\81[\83\8b\82Å\82à\82 
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.2.2    <a  id="x1-160002.2.2"></a>jvmservice.preload</h5>
+<p class="noindent">jvmservice.preload \82Í jvmservice.exe \82ª\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82½\82Æ\82«\82É\93Ç\82Ý\8d\9e\82Þ\83_\83C
+\83i\83~\83b\83N\83\8a\83\93\83N\83\89\83C\83u\83\89\83\8a (DLL) \82Ì\88ê\97\97\82ð\8bL\8fq\82µ\82½\83e\83L\83X\83g\83t\83@\83C\83\8b\82Å\82 \82è\81A\93¯\8d«\82³\82ê\82Ä\82¢
+\82é\82Ì\82Í\81A\82»\82Ì\90\97\8c`\82Å\82 \82é\81B
+<p class="indent">   \8eg\97p\82·\82é\83}\83V\83\93\82Ì\8aÂ\8b«\82É\82 \82í\82¹\82Ä\81A\82±\82Ì\83t\83@\83C\83\8b\82Å\8bN\93®\82·\82é JavaVM \82Ì\8eÀ\8dÛ\82Ì DLL
+\81ujvm.dll\81v\82Ì\83t\83\8b\83p\83X\82ð\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.2.3    <a  id="x1-170002.2.3"></a>sample/jvmserv1.conf</h5>
+<p class="noindent">sample/jvmserv1.conf \82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82é\82Æ\82«\82É JavaVM \82É\93n\82³\82ê\82é\8bN\93®\83p\83\89
+\83\81\81[\83^\82Æ\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82â\81A\82»\82Ì\88ø\90\94\82ð\8bL\8fq\82µ\82½\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82Å\82 \82è\81A
+\93¯\8d«\82³\82ê\82Ä\82¢\82é\82Ì\82Í\81A\82»\82Ì\90\97\8c`\82Å\82 \82é\81B
+<p class="indent">   \93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\82±\82Ì\83t\83@\83C\83\8b\82ð\82à\82Æ\82É\90à\96¾\82ð\8ds\82¤\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.2.4    <a  id="x1-180002.2.4"></a>sample/SampleJVMService.java</h5>
+<p class="noindent">sample/SampleJVMService.java \82Í\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\97p\82Ì JAVA \83\\81[\83X\83R\81[\83h\82Å\82 
+\82é\81B
+<p class="indent">   \93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\82±\82Ì\83t\83@\83C\83\8b\82ð javac \82É\82æ\82è\83R\83\93\83p\83C\83\8b\82µ
+java.exe \82Å\8eÀ\8ds\82·\82é\83P\81[\83X\82Æ\81A\82»\82ê\82ð\83T\81[\83r\83X\82É\93o\98^\82·\82é\82½\82ß\82Ì\8eè\8f\87\82É\82Â\82¢\82Ä\90à\96¾\82ð\8ds
+\82¤\81B
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.3    <a  id="x1-190002.3"></a>\83T\83\93\83v\83\8b\97p JAVA \83R\81[\83h\82Ì\8eÀ\8ds</h4>
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.3.1    <a  id="x1-200002.3.1"></a>SampleJVMService \82Ì\90à\96¾</h5>
+<p class="noindent">jvmservice \82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8eÀ\8ds\82·\82é\82½\82ß\89æ\96Ê\93\99\82Å\93®\8dì\82ð\8am\94F\82Å\82«\82È\82¢\81B
+<p class="indent">   \82»\82±\82Å\81A\82Ü\82¸\81A\83T\83\93\83v\83\8b\97p\83v\83\8d\83O\83\89\83\80\82ª\81A\82Ç\82Ì\82æ\82¤\82È\93®\82«\82ð\82·\82é\82à\82Ì\82©\82ð\8am\82©\82ß
+\82é\81B
+<p class="indent">   \82±\82Ì sample.zip \82É\82Í\81A SampleJVMService.java \82Æ\82¢\82¤\81A\92P\8f\83\82É 1 \95b\8aÔ\82É\88ê\93x\82Ì\8aÔ\8au\82Å
+\83t\83@\83C\83\8b\82É\90\94\8e\9a\82ð\8fo\97Í\82·\82é\96³\8cÀ\83\8b\81[\83v\82Ì\83v\83\8d\83O\83\89\83\80\82ª\82 \82é\81B
+<p class="indent">   \82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\8bN\93®\83I\83v\83V\83\87\83\93\82Æ\82µ\82Ä\8fo\97Í\90æ\83t\83@\83C\83\8b\82Ö\82Ì\83p\83X\82ð 1 \82Â\8ew\92è\82·\82é\95K\97v\82ª\82 
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.3.2    <a  id="x1-210002.3.2"></a>\83\\81[\83X\83R\81[\83h (\94²\90\88)</h5>
+<p class="noindent">\88È\89º\82Í\81A SampleJVMService.java \82Ì\83\81\83C\83\93\83\81\83\\83b\83h\82ð\94²\90\88\82µ\82½\82à\82Ì\82Å\82 \82é\81B
+                                                                    
+
+                                                                    
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-2-" ><colgroup id="TBL-2-1g"><col 
+id="TBL-2-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-2-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-2-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim">
+<pre class="verbatim">
+  public static void main( final String[] args ) throws Exception {
+      final PrintStream out = new PrintStream(
+          new FileOutputStream( args[ 0 ]  ) );
+  
+      final Thread mainThread = Thread.currentThread();
+  
+      final Thread shutdownThread = new Thread() {
+          public void run() {
+              out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8aJ\8en" );
+              for( int idx=0; idx&lt;10 &amp;&amp; mainThread.isAlive(); idx++) {
+                  mainThread.interrupt();
+                  try{
+                      mainThread.join( 100 );
+                  }
+                  catch( InterruptedException e ) {
+                  }
+              }
+              out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹" );
+              out.close();
+          }
+      };
+      Runtime.getRuntime().addShutdownHook( shutdownThread );
+  
+      int idx = 0;
+      for( ;; ) {
+          try{
+              out.println( idx++ );
+              Thread.sleep( 1000 );
+          }
+          catch( InterruptedException e ) {
+              break;
+          }
+      }
+      out.println( "\8fI\97¹\82µ\82Ü\82·\81B" );
+  } 
+</pre>
+     </td></tr></table>
+     <p class="nopar"></div>
+<p class="noindent">                                                                           </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-2-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-2-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h5 class="subsubsectionHead">2.3.3    <a  id="x1-220002.3.3"></a>SampleJVMService \82Ì\8eÀ\8ds</h5>
+<p class="noindent">\88È\89º\82ÍC:/temp/sample \82Æ\82¢\82¤\83t\83H\83\8b\83_\8fã\82É\83R\83\93\83p\83C\83\8b\82³\82ê\82½ SampleJVMService.class
+\82ª\94z\92u\82³\82ê\82Ä\82¢\82é\82Æ\89¼\92è\82·\82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-3-" ><colgroup id="TBL-3-1g"><col 
+id="TBL-3-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-3-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-3-1-1"  
+class="td11">         <div class="quote">
+         <div class="alltt">
+  <p class="noindent"><div class="obeylines-v">
+  <br>java.exe -cp C:/temp/sample SampleJVMService C:/temp/test.txt  
+</div>
+           </div></div>
+<p class="noindent">                                                                                                                                                             </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-3-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-3-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   C:/temp/test.txt \83t\83@\83C\83\8b\82ª\8dì\90¬\82³\82ê\81A\90\94\8e\9a\82ª\8fo\97Í\82³\82ê\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F\82·
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.3.4    <a  id="x1-230002.3.4"></a>\8fI\97¹\8f\88\97\9d</h5>
+<p class="noindent">\8fI\97¹\82·\82é\82É\82Í\83R\83\93\83\\81[\83\8b\89æ\96Ê\82ÅCTRL-C\82Ì\89\9f\89º\82É\82æ\82Á\82Ä java.exe \82ð\8b­\90§\8fI\97¹\82³\82¹
+\82é\81B
+<p class="indent">   \89æ\96Ê\8fã\82É\82Í\81u\8fI\97¹\82µ\82Ü\82·\81B\81v\82Æ\81A\82Â\82Ã\82¯\82Ä\81u\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹\81v\82Æ\8fo\82é\82Í\82¸\82Å\82 
+\82é\81B
+<p class="indent">   SampleJVMService.java \82Å\82Í\81Ajava.lang.Runtime#addShutdownHook() \82ð\97p\82¢\82Ä\81A
+\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\97p\83X\83\8c\83b\83h\82ð\93o\98^\82µ\82Ä\82¢\82é\81B
+<p class="indent">   \82»\82Ì\82½\82ß\81A CTRL-C \82ð\8eó\97\9d\82µ\82½ JavaVM \82ª exit \82ð\8eÀ\8ds\82µ\82æ\82¤\82Æ\82µ\82½\8c\8b\89Ê\81A\83V\83\83\83b\83g\83_\83E
+\83\93\83t\83b\83N\82ª\93®\8dì\82µ\81A\82»\82ê\82ª\83\81\83C\83\93\83X\83\8c\83b\83h\82É\91Î\82µ\82Äjava.lang.Thread#interupt()
+\82É\82æ\82é\8a\84\82è\8d\9e\82Ý\82ð\94­\90\82³\82¹\81A\83\81\83C\83\93\83X\83\8c\83b\83h\82Ì\83\8b\81[\83v\82ª\92\86\92f\82µ\82Ä\82¢\82é\82±\82Æ\82ª\82í\82©
+\82é\81B
+<p class="indent">   \83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä\8eÀ\8ds\82³\82¹\82é\83N\83\89\83X\82Í\89½\82ç\82©\82Ì\83V\83O\83i\83\8b\82ª\94­\90\82µ\82È\82¢\82©\82¬\82è\96³\8cÀ
+\83\8b\81[\83v\8d\\91¢\82É\82È\82Á\82Ä\82¢\82é\82à\82Ì\82ª\91½\82¢\82Æ\8dl\82¦\82ç\82ê\82é\81B
+<p class="indent">   \82±\82Ì\82æ\82¤\82È\83v\83\8d\83O\83\89\83\80\82ð jvmservice \82Å\83T\81[\83r\83X\89»\82·\82é\82½\82ß\82É\82Í\81A jvmservice \82Ì\92â\8e~\97v\8b\81
+\82Å\82 \82éjava.lang.System#exit(0) \82É\82æ\82Á\82Ä\83v\83\8d\83O\83\89\83\80\82ð\88À\91S\82É\83V\83\83\83b\83g\83_\83E\83\93\82Å\82«\82é\82æ\82¤
+\82·\82é\95K\97v\82ª\82 \82é\81B
+<p class="indent">   \8eÀ\8dÛ\82É\83T\81[\83r\83X\89»\82·\82é\82Ü\82¦\82É\81A\82Ü\82¸\83R\83\93\83\\81[\83\8b\89æ\96Ê\8fã\82Å\82ÌCTRL-C \82Ì\89\9f\89º\82É\82æ\82è\81A\83V\83\83\83b
+\83g\83_\83E\83\93\83t\83b\83N\82Å\82Ì\8cã\8en\96\96\82ª\8aJ\8en\82³\82ê\81A\83v\83\8d\83Z\83X\82ª\88À\91S\82É\8fI\97¹\82·\82é\82±\82Æ\82ð\8am\94F\82·\82é\95K\97v\82ª\82 
+                                                                    
+
+                                                                    
+\82é\81B
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.4    <a  id="x1-240002.4"></a>\83T\81[\83r\83X\93o\98^\81^\93o\98^\89ð\8f\9c\83c\81[\83\8b</h4>
+<p class="noindent">jvmservice.exe \82Í\83T\81[\83r\83X\93o\98^\81^\89ð\8f\9c\83c\81[\83\8b\82Å\82 \82é\82Æ\93¯\8e\9e\82É\81A\8eÀ\8dÛ\82É\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ
+\82Ä\82à\8bN\93®\82³\82ê\82é\8eÀ\8ds\83t\83@\83C\83\8b\82Å\82 \82é\81B
+<p class="indent">   \83T\81[\83r\83X\82ð\93o\98^\82·\82é\82É\82Í jvmservice \82ð--regist \83I\83v\83V\83\87\83\93\82Å\8bN\93®\82·\82é\81B
+<p class="indent">   \83R\83}\83\93\83h\83\89\83C\83\93\82É\82Í\88È\89º\82Ì\82æ\82¤\82È\8c`\8e®\82Å\8ew\92è\82·\82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-4-" ><colgroup id="TBL-4-1g"><col 
+id="TBL-4-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-4-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-4-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+   <br />jvmservice.exe --regist \83T\81[\83r\83X\96¼ --config \8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b 
+ <br />    [--log \83\8d\83O\83t\83@\83C\83\8b ] [--workingdir \8dì\8bÆ\83f\83B\83\8c\83N\83g\83\8a]
+  <br />    [--dependencies [\88Ë\91\83T\81[\83r\83X\96¼ ...] ] 
+</div>
+     </td></tr></table>
+     <p class="nopar"></div>
+<p class="noindent">                                                                           </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-4-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-4-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82·\82é\82Ü\82¦\82É\81A\82Ü\82¸\81A jvmservice.exe \82ð\93K\90Ø\82È\8fê\8f\8a\82É\94z\92u\82µ\82Ä\82¨\82­\95K\97v
+\82ª\82 \82é\81B
+<p class="indent">   jvmservice.exe \82Ì\8bN\93®\83I\83v\83V\83\87\83\93\82Å--regist \82Æ\8ew\92è\82·\82é\82±\82Æ\82Å\81A\8bN\93®\82³\82ê\82½
+jvmservice.exe \82Ì\8c»\8e\9e\93_\82Å\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Ì\91\8dÝ\82·\82é\83p\83X\82ª\83T\81[\83r\83X\8bN\93®\83p\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê
+\82é\81B
+<p class="indent">   \82µ\82½\82ª\82Á\82Ä\81A\88ê\93x\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82µ\82½\82ç\81A\83T\81[\83r\83X\82ð\93o\98^\89ð\8f\9c\82µ\82È\82¢\82©\82¬\82è
+jvmservice.exe \82ð\8dí\8f\9c\82µ\82½\82è\91¼\82Ì\8fê\8f\8a\82É\88Ú\93®\82³\82¹\82Ä\82Í\82È\82ç\82È\82¢\81B
+<p class="indent">   \82Ü\82½\81A\8c©\82Ä\82Ì\82Æ\82¨\82è\81A JAVA \8bN\93®\82Ì\82½\82ß\82Ì\83p\83\89\83\81\81[\83^\82Í\92¼\90Ú\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\81B\82±\82ê\82Í
+\81u\8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b\81v\82É\8bL\8fq\82µ\82Ä\82¨\82«\81A\83T\81[\83r\83X\82É\93o\98^\82·\82é\8dÛ\82É\82Í\82»\82Ì\83t\83@\83C\83\8b\82Ö\82Ì\83p
+\83X\82ð\93o\98^\82·\82é\81B
+<p class="indent">   \81u\8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b\81v\82É\82Â\82¢\82Ä\82Í\8cã\8fq\82·\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.4.1    <a  id="x1-250002.4.1"></a>\93o\98^\83I\83v\83V\83\87\83\93\82Ì\8aÈ\92P\82È\90à\96¾</h5>
+<p class="noindent">\88È\89º\82É\93o\98^\82Ì\82½\82ß\82Ì\83I\83v\83V\83\87\83\93\82Ì\90à\96¾\82ð\8aÈ\92P\82É\8ds\82¤\81B
+     <ul class="itemize1">
+     <li class="itemize">--regist \8ew\92è\82µ\82½\83T\81[\83r\83X\96¼\82Å\93o\98^\82·\82é
+                                                                    
+
+                                                                    
+     </li>
+     <li class="itemize">--config \83T\81[\83r\83X\82ª\8eÀ\8ds\82·\82é JavaVM \82Ì\8bN\93®\83p\83\89\83\81\81[\83^\81A\82¨\82æ\82Ñ\8eÀ\8ds\91Î\8fÛ\83N
+     \83\89\83X\82È\82Ç\82Ì\92è\8b`\82ª\8ai\94[\82³\82ê\82½\83t\83@\83C\83\8b\82ð\8ew\92è\82·\82é\81B
+     </li>
+     <li class="itemize">--log JavaVM \82¨\82æ\82Ñ jvmservice \82ª\8fo\97Í\82·\82é\83\8d\83O\83\81\83b\83Z\81[\83W\82ð\8bL\98^\82·\82é\83t\83@\83C
+     \83\8b\82ð\8ew\92è\82·\82é\81B(\83f\83t\83H\83\8b\83g\82Í\8fo\97Í\82µ\82È\82¢)
+     </li>
+     <li class="itemize">--workingdir \83T\81[\83r\83X\82ª\8bN\93®\82³\82ê\82½\82Æ\82«\8ew\92è\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\82ð\83J\83\8c\83\93\83g
+     \83f\83B\83\8c\83N\83g\83\8a\82É\95Ï\8dX\82·\82é\81B(\83f\83t\83H\83\8b\83g\82Í\95Ï\8dX\82È\82µ)
+     </li>
+     <li class="itemize">--dependencies jvmservice \82ª\8bN\93®\82·\82é\8dÛ\82É\88Ë\91\82·\82é\91¼\82Ì\83T\81[\83r\83X\96¼\82ð\97ñ\8b\93\82·
+     \82é\81B(\83f\83t\83H\83\8b\83g\82Í\96³\82µ)</li></ul>
+<p class="indent">   \8f­\82È\82­\82Æ\82à\83T\81[\83r\83X\96¼\82Æ\90Ý\92è\83t\83@\83C\83\8b\82Í\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+<p class="indent">   \83T\81[\83r\83X\96¼\82Í\83A\83\8b\83t\83@\83x\83b\83g\82Æ\90\94\8e\9a\82©\82ç\82È\82é\94C\88Ó\82Ì\96¼\91O\82ª\82Â\82¯\82ç\82ê\82é\82ª\81A\83X\83\89\83b\83V\83\85\82â
\81A\82¨\82æ\82Ñ\83_\83u\83\8b\83N\83H\81[\83g\82È\82Ç\82Ì\8bL\8d\86\82Í\8eg\82¦\82È\82¢\81B
+<p class="indent">   \82Ü\82½\81A jvmservice \82Ì\93®\82«\82ð\97\9d\89ð\82·\82é\82Ü\82Å\82Í\81A\90Ý\92è\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\82È\82Ç\82Ì\83p\83X
+\82Í\90â\91Î\83p\83X\82Å\8bL\8fq\82·\82é\82±\82Æ\82ð\90\84\8f§\82·\82é\81B
+<p class="noindent">
+   <h4 class="subsectionHead">2.5    <a  id="x1-260002.5"></a>\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</h4>
+<p class="noindent">jvmservice.exe \82Ì\83T\81[\83r\83X\93o\98^\8e\9e\82É\82Í\81A JAVA \82Ì\83N\83\89\83X\82â\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82¢\82Á\82½\82à\82Ì\82Í
+\92¼\90Ú\82Í\8ew\92è\82µ\82È\82¢\81B
+<p class="indent">   \82©\82í\82è\82É\81A\82»\82¤\82¢\82Á\82½ JavaVM \8bN\93®\8e\9e\82Ì\83p\83\89\83\81\81[\83^\82â\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82¨\82æ\82Ñ\83\81\83\\83b\83h
+\96¼\81A\82Ü\82½\81A\83\81\83\\83b\83h\82É\88ø\82«\93n\82·\83p\83\89\83\81\81[\83^\82Æ\82¢\82Á\82½\90Ý\92è\82ð\81A\8bL\8fq\82µ\82Ä\82¢\82é\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è
+\8b`\83t\83@\83C\83\8b\81v\82ð\8ew\92è\82·\82é\81B
+<p class="indent">   \90Ý\92è\83t\83@\83C\83\8b\82Í\83V\83\93\83v\83\8b\82È\83e\83L\83X\83g\83t\83@\83C\83\8b\8c`\8e®\82Å\82 \82è\81A\8ew\92è\82·\82é\8d\80\96Ú\82²\82Æ\82É 1 \8ds\82Ã\82Â\8ew
+\92è\82·\82é\81B
+<p class="indent">   \82»\82ê\82¼\82ê\82Ì\8d\80\96Ú (1 \8ds) \82Í\81A\88È\89º\82Ì\82¢\82¸\82ê\82©\82Æ\82È\82é\81B
+<p class="indent">
+     <ol  class="enumerate1" >
+     <li class="enumerate" value="1" 
+><a  id="x1-26002x1"></a>\83R\83\81\83\93\83g\8ds
+     </li>
+     <li class="enumerate" value="2" 
+><a  id="x1-26004x2"></a>JavaVM \82Ì\8bN\93®\83p\83\89\83\81\81[\83^
+     </li>
+     <li class="enumerate" value="3" 
+><a  id="x1-26006x3"></a>\8eÀ\8ds\82·\82é\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8ew\92è</li></ol>
+<p class="indent">   \8bó\8ds\82Å\82 \82é\82©\81A\82·\82×\82Ä\82ª\8bó\94\92\82Å\82 \82é\82©\81A\8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª# (\83V\83\83\81[\83v) \82Å\8en\82Ü\82é\8fê\8d\87
+\82Í\83R\83\81\83\93\83g\8ds\82Æ\82·\82é\81B
+<p class="indent">   \8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª- (\83n\83C\83t\83\93\82Å\8en\82Ü\82é\8fê\8d\87\82Í\81A JavaVM \82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82·
+\82é\81B
+                                                                    
+
+                                                                    
+<p class="indent">   \8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª- (\83n\83C\83t\83\93\88È\8aO\82Å\82 \82ê\82Î\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82Æ\83\81\83\\83b\83h\81A\82¨\82æ\82Ñ\83p
+\83\89\83\81\81[\83^\82Æ\82·\82é\81B
+<p class="indent">   \82È\82¨\81A\83R\83\81\83\93\83g\8ds\88È\8aO\82Í\8aÂ\8b«\95Ï\90\94\82Ì\93W\8aJ\82ª\8ds\82í\82ê\82é\81B
+<p class="indent">   %\81`% \82Å\88Í\82Ü\82ê\82½\95\8e\9a\97ñ\82ð\95Ï\90\94\96¼\82Æ\82µ\82Ä\8aÂ\8b«\95Ï\90\94\82ª\91\8dÝ\82·\82ê\82Î\93W\8aJ
+\82·\82é\81B\95Ï\90\94\96¼\82Æ\82µ\82Ä\91\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\95Ï\8a·\82³\82ê\82¸\82É\81A\82»\82Ì\82Ü\82Ü\8ec\82³\82ê
+\82é\81B<a href="jvmservice_doc2.html#fn1x0"><sup >1</sup></a><a  id="x1-26007f1"></a> 
+<p class="indent">   \82±\82Ì\93®\8dì\82Í WindowsNT \82Ì\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g\82Æ\93¯\82\82à\82Ì\82Å\82 \82é\81B
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h5 class="subsubsectionHead">2.5.1    <a  id="x1-270002.5.1"></a>\83T\83\93\83v\83\8b\97p\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</h5>
+<p class="noindent">\82Ü\82¸ SampleJVMService \82ð\8eÀ\8ds\82·\82é\82½\82ß\82É\95K\97v\82È\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82É\82Â\82¢\82Ä\90æ
+\82É\8e¦\82·\81B
+<p class="indent">   \82±\82ê\82Í\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82É\8aÜ\82Ü\82ê\82é\81uSampleJVMService.conf\81v\82Æ\82¢\82¤\96¼\91O\82Ì\83t\83@
+\83C\83\8b\82Ì\93à\97e\82Å\82 \82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-5-" ><colgroup id="TBL-5-1g"><col 
+id="TBL-5-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-5-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-5-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+  -Xrs
+  <br />-Djava.class.path=C:/temp/sample
+  <br />-verbose:jni
+  <br />
+  <br />SampleJVMService C:/temp/test.txt 
+</div>
+     </td></tr></table>
+     <p class="nopar"></div>
+<p class="noindent">                                                                           </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-5-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-5-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \88È\89º\81A\82±\82Ì\93à\97e\82ð\82à\82Æ\82É\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82É\8ew\92è\82·\82é\8d\80\96Ú\82É\82Â\82¢\82Ä\90à\96¾\82·
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.5.2    <a  id="x1-280002.5.2"></a>JavaVM \82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^</h5>
+<p class="noindent">- (\83n\83C\83t\83\93\82Å\82Í\82\82Ü\82é\83p\83\89\83\81\81[\83^\82Í JavaVM \82Ö\91\97\82ç\82ê\82é\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+<p class="indent">   JavaVM \82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Í jvmservice \82É\82Æ\82Á\82Ä\81A\94ñ\8fí\82É\8fd\97v\82Å\82 \82é\81B
+<p class="indent">   \88È\89º\82Ì\83p\83\89\83\81\81[\83^\82Í\95K\90{\82Æ\82¢\82Á\82Ä\82æ\82¢\81B
+     <ul class="itemize1">
+     <li class="itemize">-Xrs
+     </li>
+     <li class="itemize">-Djava.class.path= \83N\83\89\83X\83p\83X</li></ul>
+<p class="indent">   -Xrs \82Í JDK/JRE1.3 \82æ\82è\93±\93ü\82³\82ê\82½\83V\83\83\83b\83g\83_\83E\83\93\8aÄ\8e\8b\83X\83\8c\83b\83h\82ð\96³\8cø\82É\82·\82é\82½\82ß\82Ì\83I
+\83v\83V\83\87\83\93\82Å\82 \82é\81B
+<p class="indent">   \82±\82Ì\83I\83v\83V\83\87\83\93\82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\83\8d\83O\83I\83t\82È\82Ç\82Ì\83A\83N\83V\83\87\83\93\82ð\8c\9f\92m\82·\82é\82Æ
+JavaVM \82Í\83V\83\83\83b\83g\83_\83E\83\93\82ð\8aJ\8en\82µ\82Ä\82µ\82Ü\82¤\81B
+<p class="indent">   \83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä\82Í\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\82Í Windows \82Ì\83T\81[\83r\83X\83}\83l\81[\83W\83\83\82©\82ç\97v
+\8b\81\82³\82ê\82é\82×\82«\82à\82Ì\82Ì\82½\82ß\81A JavaVM \82ª\8f\9f\8eè\82É\83V\83\83\83b\83g\83_\83E\83\93\82³\82¹\82È\82¢\82æ\82¤\82É\81A-Xrs \82ð\96Y\82ê\82¸
+                                                                    
+
+                                                                    
+\82É\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+<p class="indent">   \82È\82¨\81A-X \83I\83v\83V\83\87\83\93\82Í\83x\83\93\83_\81[\8cÅ\97L\82Å\82 \82è\81A\83V\83\83\83b\83g\83_\83E\83\93\8aÄ\8e\8b\83X\83\8c\83b\83h\82à Sun
+Microsystems \88È\8aO\82Ì JavaVM \82Å\82Í\88Ù\82È\82é\89Â\94\\90«\82ª\82 \82é\81B
+<p class="indent">   -Djava.class.path= \82Í\83N\83\89\83X\83p\83X\82Ì\8ew\92è\82Å\82 \82é\81B
+<p class="indent">   \8eÀ\8dÛ\82É SampleJVMService.class \82ª\94z\92u\82³\82ê\82Ä\82¢\82é\83f\83B\83\8c\83N\83g\83\8a\82ð\8ew\92è\82·\82é\95K\97v\82ª\82 
+\82é\81B
+<p class="indent">   -D \82Í\83V\83X\83e\83\80\81E\83v\83\8d\83p\83e\83B\82Æ\82µ\82Ä\93o\98^\82·\82é\82±\82Æ\82ð\8ew\8e¦\82µ\82Ä\82¢\82é\81B
+<p class="indent">   java.exe \82©\82ç\8bN\93®\82·\82é\8fê\8d\87\82É\82Í\81A\82±\82ê\82ç\82Ì\83V\83X\83e\83\80\81E\83v\83\8d\83p\83e\83B\82Í\90Ý\92è\8dÏ\82Ý\82É\82È\82Á\82Ä\82¢
+\82é\82ª\81A jvmservice \82Å\82Í\81A JNI \82©\82ç JavaVM \82ð\8bN\93®\82·\82é\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä\81A\82±\82Ì\82æ\82¤\82É\8ew\8e¦
+\82·\82é\95K\97v\82ª\82 \82é\81B
+<p class="indent">   \82»\82Ì\82Ù\82©\82É\82æ\82­\8eg\82í\82ê\82»\82¤\82È\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä\82Í\81A\88È\89º\82Ì\82æ\82¤\82È\82à\82Ì\82ª\82 \82é\81B
+     <ul class="itemize1">
+     <li class="itemize">-Xmx \83\81\83\82\83\8a\83T\83C\83Y m
+     </li>
+     <li class="itemize">-verbose:[gc/jni]</li></ul>
+<p class="indent">   \82¢\82¸\82ê\82à JavaVM \82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+<p class="indent">   -Xmx \82Í java.exe \82Ì\8bN\93®\82Å\82à\93é\90õ\82Ý\90[\82¢\82Å\82 \82ë\82¤\81A JavaVM \82ª\8am\95Û\82·\82é\8dÅ\91å\83\81\83\82\83\8a\83T\83C\83Y
+\82ð\8ew\92è\82·\82é\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+<p class="indent">   \91¼\82É\82à-X \82Å\8en\82Ü\82é java.exe \82ª\8eó\97\9d\82·\82é\82æ\82¤\82È JavaVM \82ð\90§\8cä\82·\82é\83p\83\89\83\81\81[\83^\82Í\81A\96}\82»
+\8eó\97\9d\82Å\82«\82é\82Æ\8dl\82¦\82Ä\82æ\82¢\81B
+<p class="indent">   -verbose \82Í JavaVM \82©\82ç\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82ð\8fo\97Í\82·\82é\82±\82Æ\82ð\8ew\92è\82·\82é\81B
+<p class="indent">   gc \82Å\82Í\83K\83x\81[\83W\83R\83\8c\83N\83^\82Ì\93®\8dì\81A jni \82Å\82Í\83l\83C\83e\83B\83u\83\81\83\\83b\83h\82Ì\8cÄ\82Ñ\8fo\82µ\82È\82Ç\82ð\83g\83\8c\81[\83X
+\82·\82é\82±\82Æ\82ª\82Å\82«\82é\82æ\82¤\82É\82È\82é\81B\82Æ\82­\82É jni \82Å\83g\83\8c\81[\83X\82·\82é\82Æ JavaVM \82ª\83V\83\83\83b\83g\83_\83E\83\93\82·\82é\97l
+\8eq\82à\8am\94F\82Å\82«\82é\81B
+<p class="indent">   \82½\82¾\82µ\81A java.exe \82Ì\8fê\8d\87\82Æ\82Í\88Ù\82È\82è\81A jvmservice.exe \82Ì\8fê\8d\87\82Å\82Í-verbose \82É\82æ\82é
+JavaVM \82©\82ç\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82Í\81A\83T\81[\83r\83X\93o\98^\8e\9e\82É\8ew\92è\82µ\82½\83\8d\83O\83t\83@\83C\83\8b\82Ö\82Æ\8f\91\82«\8d\9e\82Ü\82ê
+\82é\81B\83\8d\83O\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82È\82¢\8fê\8d\87\82Í-verbose \82ð\8ew\92è\82µ\82Ä\82à\8eÀ\8dÛ\82É\82Í\89½\8f\88\82É\82à\8fo\97Í\82³\82ê\82È\82¢
+\82±\82Æ\82É\82È\82é\81B
+<p class="indent">   -verbose \82ð\8ew\92è\82¹\82¸\81A\83\8d\83O\83t\83@\83C\83\8b\82¾\82¯\82ð\8ew\92è\82µ\82½\8fê\8d\87\82Í JavaVM \82©\82ç\82Ì\90f
+\92f\83\81\83b\83Z\81[\83W\82Í\8fo\97Í\82³\82ê\82È\82¢\82ª\81A jvmservice.exe \82©\82ç\82Ì\83\81\83b\83Z\81[\83W\82Í\8bL\98^\82³\82ê
+\82é\81B
+<p class="indent">   jvmservice \82Ì\93®\82«\97\9d\89ð\82Å\82«\82é\82æ\82¤\82É\82È\82é\82Ü\82Å\82Í\81A\82Æ\82è\82 \82¦\82¸\81A\83\8d\83O\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ä
+\83T\81[\83r\83X\82ð\93o\98^\82µ\81A JavaVM \82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä-verbose:jni \82ð\8ew\92è\82µ JavaVM \82©\82ç\82Ì
+\83\8d\83O\82ð\8c©\82é\82±\82Æ\82ð\90\84\8f§\82·\82é\81B
+                                                                    
+
+                                                                    
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.5.3    <a  id="x1-290002.5.3"></a>\8eÀ\8ds\82·\82é\83N\83\89\83X\82Ì\8ew\92è</h5>
+<p class="noindent">\8eÀ\8ds\82·\82é\83N\83\89\83X\82Ì\8ew\92è\82Í\81A\88È\89º\82Ì\82æ\82¤\82È\8f\91\8e®\82Å\8ew\92è\82·\82é\81B
+<p class="indent">   \8eÀ\8ds\82·\82é\83N\83\89\83X\82Í\95¡\90\94\82 \82Á\82Ä\82à\82æ\82­\81A\82Ü\82½\95À\97ñ\8eÀ\8ds\82Ì\97L\96³\82ð\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«
+\82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-6-" ><colgroup id="TBL-6-1g"><col 
+id="TBL-6-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-6-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-6-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+   <br />[&amp;]\83N\83\89\83X\82Ì\8a®\91S\8fC\8fü\96¼[#\83N\83\89\83X\83\81\83\\83b\83h\96¼] [ \88ø\90\941 [\88ø\90\942 [...] ] ] 
+</div>
+     </td></tr></table>
+     <p class="nopar"></div>
+<p class="noindent">                                                                           </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-6-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-6-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \82»\82ê\82¼\82ê\82Ì\88Ó\96¡\82Í\88È\89º\82Ì\82Æ\82¨\82è\82Å\82 \82é\81B
+     <ul class="itemize1">
+     <li class="itemize">&amp; \82Í\83t\83H\81[\83N (\95À\97ñ\8eÀ\8ds) \82Ì\97L\96³
+     </li>
+     <li class="itemize">\83N\83\89\83X\96¼\82Í\83p\83b\83P\81[\83W\96¼\82©\82ç\82Í\82\82Ü\82é\8a®\91S\82È\96¼\91O
+     </li>
+     <li class="itemize">\95\8e\9a\97ñ\94z\97ñ\82ð 1 \82Â\8eó\97\9d\82·\82é static \83\81\83\\83b\83h\82Ì\96¼\91O
+     </li>
+     <li class="itemize">\95\8e\9a\97ñ\88ø\90\94 (\95¡\90\94\89Â)</li></ul>
+<p class="indent">   \83N\83\89\83X\96¼\82Í\83p\83b\83P\81[\83W\96¼\82©\82ç\82Í\82\82Ü\82é\8a®\91S\82È\96¼\91O\82Å\82È\82­\82Ä\82Í\82È\82ç\82È\82¢\81B
+<p class="indent">   \82Ü\82½\81A\93\96\91R\82Ì\82±\82Æ\82È\82ç\82ª\82ç\83N\83\89\83X\83p\83X\8fã\82É\91\8dÝ\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+<p class="indent">   \83N\83\89\83X\96¼\82É\82Í# (\83V\83\83\81[\83v) \82Å\8en\82Ü\82é\81A\83\81\83\\83b\83h\96¼\82ð\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
+<p class="indent">   \83\81\83\\83b\83h\96¼\82ð\8fÈ\97ª\82µ\82½\8fê\8d\87\82Í\81umain\81v\82ª\8ew\92è\82³\82ê\82½\82à\82Ì\82Æ\82Ý\82È\82³\82ê\82é\81B
+<p class="indent">   \83\81\83\\83b\83h\82Í\83N\83\89\83X\82Å\92è\8b`\82³\82ê\82Ä\82¢\82é public \8a\8e\82 static \82È\83\81\83\\83b\83h\82Å\82 \82è\81A 1 \82Â\82Ì\95\8e\9a\97ñ\94z
+\97ñ\82ð\8eó\82¯\8eæ\82è\81A\96ß\82è\92l\82ð\95Ô\82³\82È\82¢\83\81\83\\83b\83h\82Å\82 \82é\95K\97v\82ª\82 \82é\81B
+<p class="indent">   \82Â\82Ü\82è\81A\88È\89º\82Ì\83V\83O\83l\83`\83\83\82ð\82à\82Â\82Ä\82¢\82é\95K\97v\82ª\82 \82é\81B
+                                                                    
+
+                                                                    
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-7-" ><colgroup id="TBL-7-1g"><col 
+id="TBL-7-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-7-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-7-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+   <br />public static void \83\81\83\\83b\83h\96¼( String[] args ) throws Throwable {} 
+</div>
+     </td></tr></table>
+     <p class="nopar"></div>
+<p class="noindent">                                                                           </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-7-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-7-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \83\81\83\\83b\83h\82Í\97á\8aO\82ð\95Ô\82µ\82Ä\82à\97Ç\82¢\81B
+<p class="indent">   \97á\8aO\82ª\95Ô\82³\82ê\82½\8fê\8d\87\82Í\81A\82»\82Ì\83\81\83\\83b\83h\82ª\83t\83H\81[\83N\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\92P\82É\83\8d\83O\82É\8bL\98^\82³\82ê
+\82é\81B
+<p class="indent">   \83t\83H\81[\83N\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82É\97á\8aO\82ª\95Ô\82³\82ê\82½\8fê\8d\87\81A\88È\8d~\82Ì\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8bN\93®\82Í\92\86\8e~\82³
+\82ê\82é\81B
+<p class="indent">   \82¢\82¸\82ê\82Ì\8fê\8d\87\82à\8eÀ\8ds\92\86\82Ì\83\86\81[\83U\83X\83\8c\83b\83h\82ª\82È\82­\82È\82é\82Æ jvmservice \82Í\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ð
+\8fI\97¹\82·\82é\81B
+<p class="indent">   &amp; (\83A\83\93\83p\83T\83\93\83h) \82Í\8ew\92è\82³\82ê\82½\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82ð\91Ò\8b@\82µ\82È\82¢\82±\82Æ\82ð\8e¦
+\82·\81B<a href="jvmservice_doc3.html#fn2x0"><sup >2</sup></a><a  id="x1-29001f2"></a> 
+<p class="indent">   \82à\82µ\81A&amp; (\83A\83\93\83p\83T\83\93\83h) \82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\8fê\8d\87\81A\82»\82Ì\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82Ì\82½\82ß\82Ì\83X\83\8c\83b
+\83h\82ª\8dì\82ç\82ê\83\81\83\\83b\83h\82ª\8eÀ\8ds\82³\82ê\82½\82 \82Æ\81A\82»\82Ì\8a®\97¹\82ð\91Ò\82½\82¸\82É\8e\9f\82Ì\83N\83\89\83X\82Ì\8bN\93®\82ª\8ds\82í\82ê
+\82é\81B
+<p class="indent">   \82±\82Ì&amp; (\83A\83\93\83p\83T\83\93\83h) \82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\8ew\92è\82³\82ê\82½\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82ª\8a®\97¹\82·
+\82é\82Ì\82ð\91Ò\82Á\82Ä\81A\8e\9f\82Ì\83N\83\89\83X\82Ì\8bN\93®\82ð\8ds\82¤\81B\82½\82¾\82µ\81A jvmservice \82Í\81A&amp; (\83A\83\93\83p\83T\83\93\83h) \82Ì\97L\96³\82É
+\82©\82©\82í\82è\82È\82­\81A\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82É\82Í\81A\95K\82¸ 1 \82Â\82Ì\93Æ\97§\82µ\82½\83X\83\8c\83b\83h\82ð\8dì\90¬\82µ\8eÀ\8ds\82³\82ê
+\82é\81B\82Â\82Ü\82è\81A&amp; (\83A\83\93\83p\83T\83\93\83h) \8ew\92è\96³\82µ\82É\82æ\82é\82Å\82Í\8bN\93®\82µ\82½\83X\83\8c\83b\83h\82Ì\8a®\97¹\82ð\82½\82¾\82¿\82É join \82·
+\82é\8c`\82Æ\82È\82é\81B
+<p class="indent">   \83N\83\89\83X\83\81\83\\83b\83h\82É\82Í 0 \8cÂ\88È\8fã\82Ì\95\8e\9a\97ñ\82©\82ç\82È\82é\95\8e\9a\97ñ\94z\97ñ\82ª\93n\82³\82ê\82é\81B
+<p class="indent">   \88ø\90\94\82Í\81A\82»\82ê\82¼\82ê\8bó\94\92\82Å\8bæ\90Ø\82ç\82ê\82é\81B
+<p class="indent">   \88ø\90\94\82Ì\92\86\82É\8bó\94\92\82ð\8aÜ\82Þ\8fê\8d\87\82Í\81A\88ø\90\94\82Ì\91O\8cã\82ð" (\83_\83u\83\8b\83N\83H\81[\83e\81[\83V\83\87\83\93\82Å\88Í\82Þ\81B\83_\83u\83\8b
+\83N\83H\81[\83e\81[\83V\83\87\83\93\8e©\90g\82ð\8aÜ\82ß\82½\82¢\8fê\8d\87\82Í\81A\83_\83u\83\8b\83N\83H\81[\83e\81[\83V\83\87\83\93\82Å\88Í\82Ü\82ê\82½\92\86\82Å\81A"" \82Ì\82æ
+\82¤\82É\82»\82ê\82ð 2 \82Â\8fd\82Ë\82é\81B
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.6    <a  id="x1-300002.6"></a>\83T\81[\83r\83X\82Ì\93o\98^</h4>
+<p class="noindent">jvmservice.exe \82Ì\83R\83}\83\93\83h\8f\91\8e®\82Æ\81A\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82Ì\90à\96¾\82ª\8fI\82í\82Á\82½\82Ì\82Å\81A\82æ
+\82¤\82â\82­\83T\81[\83r\83X\82ð\93o\98^\82·\82é\8f\80\94õ\82ª\82Å\82«\82½\81B
+<p class="indent">   \82±\82±\82Å\82Í\91O\8fq\82Ì\97á\82Ì\82Æ\82¨\82è\81AC:/temp/sample/ \83t\83H\83\8b\83_\8fã\82ÉSampleJVMService.class
+\82ª\82 \82é\82à\82Ì\82Æ\82µ\81A\83e\83X\83g\97p\83T\81[\83r\83X\81ujvmserv1\81v\82ð\93o\98^\82·\82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-8-" ><colgroup id="TBL-8-1g"><col 
+id="TBL-8-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-8-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-8-1-1"  
+class="td11">  <div class="alltt">
+  <p class="noindent"><div class="obeylines-v">
+   
+ <br>jvmservice.exe --regist jvmserv1
+ <br>    --config C:/temp/sample/SampleJVMService.conf
+ <br>    --log C:/temp/sample/SampleJVMService.log
+ <br>    --dependencies Eventlog  
+</div>
+</div>                                                                                                                                                             </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-8-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-8-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   --dependencies \82Æ\82µ\82ÄEventlog \82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\81B
+<p class="indent">   jvmservice.exe \82Í\83X\83\8c\83b\83h\82Å\94­\90\82µ\82½\97á\8aO\82È\82Ç\82ð\83C\83x\83\93\83g\83\8d\83O\82É\82à\8bL\98^\82·\82é\81B\82µ\82½\82ª\82Á
+\82Ä\81A jvmservice.exe \82Í Eventlog \83T\81[\83r\83X\82É\88Ë\91\82µ\82Ä\82¢\82é\81A\82Æ\82¢\82¦\82é\81B
+<p class="indent">   \82±\82Ì\8ew\92è\82ª\83f\83t\83H\83\8b\83g\82Å\82Í\82È\82¢\82Ì\82Í\81uEventlog\81v\82Æ\82¢\82¤\96¼\91O\82ª\89Ê\82½\82µ\82Ä\8fí\82É\93¯\82\82Å\82 \82é
+\82Ì\82©\95s\96¾\82Å\82 \82é\82Æ\82¢\82¤\82±\82Æ\82Æ\81A Eventlog \83T\81[\83r\83X\82É\88Ë\91\82·\82é\95Ê\82Ì\83T\81[\83r\83X\82É\88Ë\91\82·\82é\8fê\8d\87\82ª
+\82 \82è\82¤\82é\82½\82ß\82Å\82 \82é\81B
+<p class="indent">   \95K\97v\82Å\82 \82ê\82Î\91¼\82Ì\83T\81[\83r\83X\82ð\92Ç\89Á\82·\82é\81B\83T\81[\83r\83X\96¼\82Í\83T\81[\83r\83X\81E\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82ð\8aJ
+\82­\82Æ\8am\94F\82Å\82«\82é\81B\96¼\91O\82Ì\91å\95\8e\9a\8f¬\95\8e\9a\82Í\8bæ\95Ê\82³\82ê\82È\82¢\82Ì\82Å\81AEventLog \82Æeventlog \82Í\93¯\82\82±
+\82Æ\82Å\82 \82é\81B
+<p class="indent">   \8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\81A\88Ë\91\8aÖ\8cW\82È\82Ç\82ð\95Ï\8dX\82µ\82½\82¢\8fê\8d\87\82Í\81A\8dÄ
+\93x\93o\98^\82ð\8eÀ\8ds\82·\82é\81B\82·\82Å\82É\93¯\82\96¼\91O\82Ì\83T\81[\83r\83X\82ª\82 \82è\81A\82»\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82ª\93o\98^
+\82ð\97v\8b\81\82µ\82½ jvmservice.exe \82Æ\93¯\82\83p\83X\82Å\82 \82ê\82Î\81A\82»\82Ì\83T\81[\83r\83X\82É\91Î\82·\82é\8dX\90V\82Æ\82È
+\82é\81B
+<p class="indent">   \82¤\82Ü\82­\93o\98^\82³\82ê\82é\82Æ\81A\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83T\81[\83r\83X\81v\82Å\81A\90V\82µ\82­
+\81uJavaVMService(jvmserv1)\81v\82Æ\82¢\82¤\83T\81[\83r\83X\96¼\82ª\92Ç\89Á\82³\82ê\82Ä\82¢\82é\82Í\82¸\82Å\82 \82é\81B\83T\81[\83r
+\83X\96¼\82Í\81ujvmserv1\81v\82Å\82 \82é\82ª\81A\95\\8e¦\96¼\82Æ\82µ\82Ä\82Í\95K\82¸\81uJavaVMService(\83T\81[\83r\83X\96¼)\81v\82Æ\82¢\82¤
+\8c`\8e®\82Å\95\\8e¦\82³\82ê\82é\81B
+<p class="indent">   jvmservice.exe \82Í\88Ù\82È\82é\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82É\83T\81[\83r\83X\96¼\82ð\82Â\82¯\82Ä\95¡\90\94\8cÂ\82Ì
+\83T\81[\83r\83X\82ð\93o\98^\89Â\94\\82Å\82 \82é\81B
+<p class="indent">   \83T\81[\83r\83X\82Ì\93o\98^\92¼\8cã\81A\83T\81[\83r\83X\82Ì\8bN\93®\95û\96@\82Í\81u\8eè\93®\81v\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\81B
+<p class="indent">   \82½\82¾\82µ\81A\82Ü\82¾\81u\8aJ\8en\81v\83{\83^\83\93\82ð\82¨\82µ\82Ä\82Í\82¢\82¯\82È\82¢\81B
+<p class="indent">   \8bN\93®\82·\82×\82« JavaVM \82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\82½\82ß\81A\82¨\82»\82ç\82­\81A\8bN\93®\82É\8e¸\94s\82·\82é\82Í\82¸\82Å\82 
+                                                                    
+
+                                                                    
+\82é\81B<a href="jvmservice_doc4.html#fn3x0"><sup >3</sup></a><a  id="x1-30001f3"></a> 
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.7    <a  id="x1-310002.7"></a>\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\95Ò\8fW</h4>
+<p class="noindent">jvmservice.exe\82Æ\93¯\82\83f\83B\83\8c\83N\83g\83\8a\8fã\82Éjvmservice.preload\82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 
+\82é\81B
+<p class="indent">   \82±\82Ì\83t\83@\83C\83\8b\82Í jvmservice.exe \82ª\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82é\82Æ\82«\93Ç\82Ý\8d\9e\82Ü\82ê\82é\83_\83C\83i\83~\83b
+\83N\83\8a\83\93\83N\83\89\83C\83u\83\89\83\8a (DLL) \82ð\8ew\92è\82µ\82Ä\82¢\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.7.1    <a  id="x1-320002.7.1"></a>\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\8d\\91¢</h5>
+<p class="noindent">\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Í\81A\95K\82¸\81A\8bN\93®\82³\82ê\82½ jvmservice.exe \82Ì\8ag\92£\8eq\82ð*.preload \82É\95Ï\8dX\82µ\82½\83t\83@\83C\83\8b\96¼\82Æ
+\82È\82Á\82Ä\82¢\82é\81B\82Â\82Ü\82è\81A jvmservice.exe \82É\91Î\82µ\82Ä\8fí\82É 1 \82Â\82Ì\8aÖ\8cW\82Å\82 \82é\81B
+<p class="indent">   \83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Í\92P\8f\83\82È\83e\83L\83X\83g\83t\83@\83C\83\8b\82Å\82 \82è\81A\8bó\8ds\82¨\82æ\82Ñ\8dÅ\8f\89\82Ì\95\8e\9a
+\82ª#(\83V\83\83\81[\83v) \82Å\82Í\82\82Ü\82é\8ds\82ð\83R\83\81\83\93\83g\8ds\82Æ\82µ\81A\82»\82ê\88È\8aO\82Ì\8ds\82Í\81A\82·\82×\82Ä DLL \83t\83@\83C\83\8b\82Ö\82Ì\83t
+\83\8b\83p\83X\82ª\8f\91\82©\82ê\82Ä\82¢\82é\82à\82Ì\82Æ\82·\82é\81B
+<p class="indent">   \82µ\82½\82ª\82Á\82Ä\81A\95¡\90\94\8cÂ\82Ì DLL \82ð\93Ç\82Ý\8d\9e\82Ý\82±\82Æ\82ª\89Â\94\\82Å\82 \82é\81B
+<p class="indent">   \92è\8b`\82·\82é\8f\87\94Ô\82Í\88Ë\91\93x\82Ì\82à\82Á\82Æ\82à\96\96
+\92[<a href="jvmservice_doc5.html#fn4x0"><sup >4</sup></a><a  id="x1-32001f4"></a> \82Ì
+DLL \82©\82ç\8f\87\82É\8ew\92è\82µ\81A\82±\82Ì\8f\87\94Ô\82Å DLL \82Ì\83\8d\81[\83h\82ª\8ds\82í\82ê\82é\81B
+<p class="indent">   \83t\83@\83C\83\8b\82Ö\82Ì\83p\83X\82Í\81A\82Ü\82¸%\81`% \82Å\88Í\82Ü\82ê\82½\95\8e\9a\97ñ\82ð\8aÂ\8b«\95Ï\90\94\96¼\82Æ\82µ\82Ä\8aÂ\8b«\95Ï\90\94\93W
+\8aJ<a href="jvmservice_doc6.html#fn5x0"><sup >5</sup></a><a  id="x1-32002f5"></a> \82ª
+\8ds\82í\82ê\82Ä\82©\82çLoadLibrary API \82É\82æ\82Á\82Ä\93Ç\82Ý\8d\9e\82Ü\82ê\82é\81B
+<p class="indent">   \93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82·\82é\82Æ\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\8bN\93®\82¹\82¸\82É\88Ù\8fí\8fI\97¹\82·\82é\81B
+   <h5 class="subsubsectionHead">2.7.2    <a  id="x1-330002.7.2"></a>jvm.dll \82Ì\8ew\92è</h5>
+<p class="noindent">jvmservice.exe \82Í JNI \82É\82æ\82è JavaVM \82ð\8bN\93®\82·\82é\8dÛ\82É\81A\81ujvm.dll\81v\82Æ\82¢\82¤\83_\83C\83i\83~\83b\83N\83\8a
+\83\93\83N\83\89\83C\83u\83\89\83\8a\82Ì\83\8d\81[\83h\82ð\97v\8b\81\82·\82é\81B
+<p class="indent">   \82±\82Ìjvm.dll\82±\82»\82ª JavaVM \82Ì\96{\91Ì\82Å\82 \82é\81B
+<p class="indent">   \82à\82µ\81A\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\92\86\82É jvm.dll \82Ö\82Ì\83p\83X\82ª\8ew\92è\82³\82ê
+\82Ä\82¢\82È\82¢\8fê\8d\87\81A jvmservice.exe \82Í\83f\83t\83H\83\8b\83g\82Ì\83\89\83C\83u\83\89\83\8a\8c\9f\8dõ\83p
+\83X<a href="jvmservice_doc7.html#fn6x0"><sup >6</sup></a><a  id="x1-33001f6"></a> \82ð
+\97p\82¢\82Ä\81ujvm.dll\81v\82ð\83\8d\81[\83h\82µ\82æ\82¤\82Æ\82·\82é\81B
+<p class="indent">   \82»\82Ì\8c\8b\89Ê\81A jvm.dll \82ª\83\8d\81[\83h\82Å\82«\82È\82¯\82ê\82Î\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\88Ù\8fí\8fI\97¹\82·\82é\81B
+<p class="indent">   \82µ\82©\82µ\81A\92Ê\8fí\81A\82±\82Ìjvm.dll\82Í\8aÂ\8b«\95Ï\90\94 PATH \82É\92Ê\82³\82ê\82Ä\82¨\82ç\82¸\81A\82Ü\82½\92Ê\82·\82×\82«\82à\82Ì\82Å\82à
+\82È\82¢\81B
+                                                                    
+
+                                                                    
+<p class="indent">   \82½\82Æ\82¦\82Î\81A 1 \82Â\82Ì\83o\81[\83W\83\87\83\93\82Ì JRE \82Å\82à\81A JRE1.4.2_08 \82ð\97á\82É\82·\82ê\82Î\88È\89º\82Ì 2 \82Â\82Ì
+JavaVM(jvm.dll) \82ª\97p\88Ó\82³\82ê\82Ä\82¢\82é\81B
+     <ul class="itemize1">
+     <li class="itemize">%JAVA_HOME%/jre/bin/client/jvm.dll
+     </li>
+     <li class="itemize">%JAVA_HOME%/jre/bin/server/jvm.dll</li></ul>
+<p class="indent">   \82»\82±\82Å\81A jvmservice.exe \82Å\82à\81A\83\8d\81[\83h\82·\82×\82« jvm.dll \82ð\8ew\92è\82·\82é\82½\82ß\82É\81u\83\89\83C\83u
+\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\81v\82É\81A\83\8d\81[\83h\82·\82×\82« jvm.dll \82Ö\82Ì\83t\83\8b\83p\83X\82ð\8bL\8fq\82·\82é\95K\97v\82ª\82 
+\82é\81B
+<p class="indent">   \88È\89º\82Í\81AC:/j2sdk1.4.2_08/ \82É JDK1.4.2_08 \82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82Æ\89¼\92è\82µ\82½\8fê
+\8d\87\82Ì\81u\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\81v\82Ì\97á\82Å\82 \82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-9-" ><colgroup id="TBL-9-1g"><col 
+id="TBL-9-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-9-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-9-1-1"  
+class="td11">  <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+   <br />C:\j2sdk1.4.2_08\jre\bin\server\jvm.dll
+  <br />#C:\jdk1.3.1_15\jre\bin\hotspot\jvm.dll
+  <br />#C:\jdk1.5.0_02\jre\bin\client\jvm.dll 
+</div>
+</td></tr></table>
+<p class="nopar">                                                                   </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-9-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-9-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \82±\82Ì\97á\82Å\82Í\81A\82¢\82­\82Â\82©\82Ì JRE \82Ì\83o\81[\83W\83\87\83\93\82Ì DLL \82ª\82©\82©\82ê\82Ä\82¢\82é\82ª\83R\83\81\83\93\83g\83A\83E\83g\82³\82ê
+\82Ä\82¨\82è\81A\8eÀ\8dÛ\82É\83\8d\81[\83h\82·\82é\82æ\82¤\82É\8ew\92è\82³\82ê\82Ä\82¢\82é\82Ì\82Í\81A j2sdk1.4.2_08 \82Ì server \83o\81[\83W\83\87\83\93
+\82Ì jvm.dll \82Å\82 \82é\81B
+   <h5 class="subsubsectionHead">2.7.3    <a  id="x1-340002.7.3"></a>\88Ù\82È\82é\83o\81[\83W\83\87\83\93\82Ì JavaVM \82Ì\8ew\92è</h5>
+<p class="noindent">\81u\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b (jvmservice.preload)\81v\82Í 1 \82Â\82µ\82©\91\8dÝ\82µ\82È\82¢\82½\82ß\81A\88Ù\82È\82é
+\83o\81[\83W\83\87\83\93\82Ì JavaVM \82ð\8ew\92è\82·\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81B
+<p class="indent">   \82à\82µ\95K\97v\82Å\82 \82ê\82Πjvmservice.exe \82Ì\83t\83@\83C\83\8b\96¼\82ð\95Ï\8dX\82·\82é\82±\82Æ\82Å\90Ø\82è\95ª\82¯\82é\82±\82Æ\82Í\89Â\94\\82Å
+\82 \82é\81B
+<p class="indent">   \82½\82Æ\82¦\82Î\81ujvmservice_jre131.exe\81v\82Ì\82æ\82¤\82É\83\8a\83l\81[\83\80\82·\82ê\82Î\81A\82»\82ê\82É\91Î\89\9e\82·\82é
+\81ujvmservice_jre131.preload\81v\82Æ\82¢\82¤\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82ª\8eg\82í\82ê\82é\82æ\82¤\82É\82È
+\82é\81B<a href="jvmservice_doc8.html#fn7x0"><sup >7</sup></a><a  id="x1-34001f7"></a> 
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.8    <a  id="x1-350002.8"></a>\83T\81[\83r\83X\82Ì\8eÀ\8ds</h4>
+<p class="noindent">\83T\81[\83r\83X\82ª\93o\98^\82³\82ê\81A\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82à\90Ý\92è\82µ\82½\82ç\81A\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\83T\81[\83r\83X
+\82©\82ç\93o\98^\82µ\82½\83T\81[\83r\83X\82ð\91I\91ð\82µ\81A\81u\8aJ\8en\81v\83{\83^\83\93\82ð\89\9f\82µ\82Ä\83T\81[\83r\83X\82ª\8bN\93®\82·\82é\82±\82Æ\82ð\8e\8e\82·\82±\82Æ
+\82ª\82Å\82«\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.8.1    <a  id="x1-360002.8.1"></a>\83T\81[\83r\83X\82Ì\8aJ\8en</h5>
+<p class="noindent">\81u\8aJ\8en\81v\83{\83^\83\93\82ð\89\9f\82·\82Æ\81A jvmservice.exe \82Ì\8bN\93®\82ª\8aJ\8en\82³\82ê\82é\81B\83G\83\89\81[\83_\83C\83A\83\8d\83O\82ª\8fo\82¸\82É
+\81u\8aJ\8en\81v\83{\83^\83\93\82ª\91I\91ð\95s\89Â\94\\82É\82È\82è\81u\92â\8e~\81v\83{\83^\83\93\82ª\91I\91ð\89Â\94\\82É\82È\82ê\82Î\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í
+\8eÀ\8ds\92\86\82Æ\82È\82Á\82Ä\82¢\82é\81B
+<p class="indent">   \90³\82µ\82­\93®\8dì\82µ\82Ä\82¢\82é\82©\94»\92f\82·\82é\82½\82ß\82É\81A\82³\82«\82Ù\82Ç\82Ì java.exe \82Å\82Ì\83e\83X\83g\82Å\8ds\82Á
+\82½\82æ\82¤\82É\81AC:/temp/test.txt \83t\83@\83C\83\8b\82É\90\94\8e\9a\82ª\8f\91\82«\8d\9e\82Ü\82ê\82Â\82Ã\82¯\82Ä\82¢\82é\82©\8am\94F\82·
+\82é\81B
+<p class="indent">   \82Ü\82½\81AC:/temp/sample/SampleJVMService.log \83t\83@\83C\83\8b\82É\83\8d\83O\82ð\8fo\97Í\82·\82é\82æ\82¤\82É\8ew\92è\82µ
+\82Ä\82¢\82é\82½\82ß\81A\82±\82±\82É JavaVM \82©\82ç\82Ì JNI \8aÖ\98A\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82ª\8fo\97Í\82³\82ê\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F
+\82Å\82«\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.8.2    <a  id="x1-370002.8.2"></a>\83T\81[\83r\83X\82Ì\8fI\97¹</h5>
+<p class="noindent">\81u\92â\8e~\81v\83{\83^\83\93\82ð\89\9f\82·\82Æ\81A\82µ\82Î\82ç\82­\82µ\82Ä\81u\92â\8e~\81v\83{\83^\83\93\82ª\91I\91ð\95s\89Â\94\\82É\82È\82è\81u\8aJ\8en\81v\83{\83^\83\93
+\82ª\91I\91ð\89Â\94\\82È\8fó\91Ô\82É\82È\82é\81B\82±\82Ì\8fó\91Ô\82Å\82 \82ê\82Î\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\8aù\82É\92â\8e~\82µ\82Ä\82¢
+\82é\81B
+<p class="indent">   \82½\82¾\82µ\82­\92â\8e~\82³\82ê\82½\82±\82Æ\82ð\8am\94F\82·\82é\82½\82ß\82ÉC:/temp/test.txt \83t\83@\83C\83\8b\82ð\8am\94F\82·
+\82é\81B
+<p class="indent">   \83t\83@\83C\83\8b\82Ì\96\96\94ö\82É\81u\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹\81v\82Æ\82 \82ê\82Î\81A\90³\82µ\82­\83V\83\83\83b\83g\83_\83E\83\93\82³\82ê\82Ä\82¢
+\82é\82±\82Æ\82ª\82í\82©\82é\81B
+<p class="indent">   \93¯\97l\82ÉC:/temp/sample/SampleJVMService.log \83t\83@\83C\83\8b\82ð\8am\94F\82µ\81A\8dÅ\8fI\8ds\82É\81u\83G\83\93\83h
+\83}\81[\83N\81v\82ª\82Â\82¯\82ç\82ê\82Ä\82¢\82ê\82Î\81A jvmservice.exe \8e©\90g\82à\90³\8fí\82È\83\8b\81[\83g\82Å exit \82µ\82½\82±\82Æ\82ª\82í\82©
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.8.3    <a  id="x1-380002.8.3"></a>\83\8d\83O\83I\83t\82Æ\83V\83\83\83b\83g\83_\83E\83\93\82Ì\83e\83X\83g</h5>
+<p class="noindent">\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\83\8d\83O\83I\83t\82µ\82Ä\82à\8fI\97¹\82µ\82È\82¢\82ª\81A JavaVM \82Å\82Í-Xrs \83I\83v\83V\83\87\83\93\82ð\8ew\92è\82µ\82È
+\82¢\8fê\8d\87\82Í\83\8d\83O\83I\83t\82ð\8c\9f\92m\82µ\82Ä\8e©\93®\93I\82É\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ä\82µ\82Ü\82¤\81B
+<p class="indent">   \82»\82¤\82È\82ç\82È\82¢\82±\82Æ\82ð\8am\94F\82·\82é\82½\82ß\82É\83T\81[\83r\83X\82ð\8aJ\8en\82µ\82½\82 \82Æ\81A\83\8d\83O\83I\83t\82µ\82Ä\82Ý\82é\82Æ\97Ç
+\82¢\81B
+<p class="indent">   \8dÄ\93x\83\8d\83O\83I\83\93\82µ\82Ä\83T\81[\83r\83X\82ª\8cp\91±\92\86\82ÅC:/temp/test.txt \83t\83@\83C\83\8b\82É\96Ù\81X\82Æ\90\94\92l\82ð\8f\91\82«\8d\9e\82ñ
+\82Å\82¢\82é\82Ì\82Å\82 \82ê\82Î\96â\91è\82È\82¢\81B
+<p class="indent">   \82Â\82¬\82É\81A\83T\81[\83r\83X\82ª\93®\8dì\82µ\82½\82Ü\82Ü\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ä\82Ý\82é\81B
+<p class="indent">   \8dÄ\8bN\93®\8cã\82É\83\8d\83O\83t\83@\83C\83\8b\82ð\92²\82×\82Ä\90³\8fí\82É\8fI\97¹\82µ\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F\82·
+                                                                    
+
+                                                                    
+\82é\81B<a href="jvmservice_doc9.html#fn8x0"><sup >8</sup></a><a  id="x1-38001f8"></a> 
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h4 class="subsectionHead">2.9    <a  id="x1-390002.9"></a>\83A\83\93\83C\83\93\83X\83g\81[\83\8b</h4>
+<p class="noindent">\93o\98^\82µ\82½\83T\81[\83r\83X\82ð\89ð\8f\9c\82·\82é\95û\96@\81A\82¨\82æ\82Ñ\81A jvmservice.exe \82ð\8dí\8f\9c\82·\82é\95û\96@\82É\82Â\82¢\82Ä\90à\96¾\82·
+\82é\81B
+<p class="noindent">
+   <h5 class="subsubsectionHead">2.9.1    <a  id="x1-400002.9.1"></a>\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c</h5>
+<p class="noindent">\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c\82Í\81A jvmservice.exe \82ð--unregist \83I\83v\83V\83\87\83\93\82ð\8ew\92è\82µ\82Ä\8bN\93®\82·\82é\82±\82Æ
+\82Å\8ds\82¤\81B\93\96\91R\81A\83T\81[\83r\83X\82Í\82 \82ç\82©\82\82ß\92â\8e~\82µ\82Ä\82¨\82©\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+<p class="indent">   \83R\83}\83\93\83h\83\89\83C\83\93\82É\82Í\88È\89º\82Ì\82æ\82¤\82È\8c`\8e®\82Å\8ew\92è\82·\82é\81B
+<p class="noindent"><div class="tabular"><table class="tabular" 
+cellspacing="0" cellpadding="0" rules="groups" 
+frame="border" id="TBL-10-" ><colgroup id="TBL-10-1g"><col 
+id="TBL-10-1"></colgroup><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-10-1-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-10-1-1"  
+class="td11">         <div class="quote">
+         <table width="100%" 
+class="verbatim"><tr class="verbatim"><td 
+class="verbatim"><div class="verbatim">
+   <br />jvmservice.exe --unregist \83T\81[\83r\83X\96¼ </div>
+   </td></tr></table>
+   <p class="nopar"></div><p class="noindent">                                        </td>
+</tr><tr 
+class="hline"><td><hr></td></tr><tr  
+ valign="baseline" id="TBL-10-2-"><td  style="white-space:nowrap; text-align:left;" valign="middle" id="TBL-10-2-1"  
+class="td11">                                                                                                            </td>
+   </tr></table></div>
+<p class="indent">   \89½\82à\83G\83\89\81[\83_\83C\83A\83\8d\83O\82ª\82Å\82È\82¯\82ê\82Î\81A\8ew\92è\82µ\82½\83T\81[\83r\83X\82ª\93o\98^\89ð\8f\9c\82³\82ê\82Ä\82¢
+\82é\81B
+<p class="indent">   \82½\82¾\82µ\81A\93o\98^\89ð\8f\9c\82Í\8dí\8f\9c\97\\96ñ\82Å\82 \82è\81A\8eÀ\8dÛ\82É\83T\81[\83r\83X\82Ì\93o\98^\82ª\83\8c\83W\83X\83g\83\8a\82©\82ç\8dí\8f\9c\82³\82ê\82é
+\82Ì\82Í\8e\9f\89ñ\82Ì\8dÄ\8bN\93®\8cã\82Å\82 \82é\81B
+<p class="indent">   \8dí\8f\9c\97\\96ñ\82µ\82½\82 \82Æ\82Å\93¯\82\83T\81[\83r\83X\96¼\82Å\83T\81[\83r\83X\82ð\93o\98^\82µ\82æ\82¤\82Æ\82·\82é\82Æ\92Ê\8fí\82Í\83G\83\89\81[\82Æ\82È
+\82é\81B\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\82È\82Ç\82Ì\90Ý\92è\93à\97e\82ð\95Ï\82¦\82½\82¢\8fê\8d\87\82Í\81A\8dí\8f\9c\82¹\82¸
+\82É\93o\98^\82ð\8dÄ\8eÀ\8ds\82·\82é\82±\82Æ\82Å\8ds\82¤\81B
+<p class="indent">   \8dÄ\93o\98^\82¨\82æ\82Ñ\93o\98^\89ð\8f\9c\82·\82é\82½\82ß\82É\82Í\81A\83T\81[\83r\83X\82ð\93o\98^\82µ\82½\82Æ\82«\82Ì jvmservice.exe \82Ì\83t\83\8b\83p
+\83X\82Æ\8c»\8dÝ\82Ì jvmservice.exe \82Ì\83t\83\8b\83p\83X\82ª\88ê\92v\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+<p class="indent">   \88Ù\82È\82é\83p\83X\82©\82ç\82Ì\8dÄ\93o\98^\81A\93o\98^\89ð\8f\9c\82Í\95s\90³\82È\91\80\8dì\82Æ\82µ\82Ä\83G\83\89\81[\82Æ\82È
+\82é\81B<a href="jvmservice_doc10.html#fn9x0"><sup >9</sup></a><a  id="x1-40001f9"></a> 
+   <h5 class="subsubsectionHead">2.9.2    <a  id="x1-410002.9.2"></a>jvmservice.exe \82Ì\8dí\8f\9c</h5>
+                                                                    
+
+                                                                    
+<p class="noindent">jvmservice.exe \82Í 1 \82Â\88È\8fã\82Ì\83T\81[\83r\83X\82ª\93o\98^\82³\82ê\82Ä\82¢\82é\8fê\8d\87\81A\83\8c\83W\83X\83g\83\8a\82É\91Î\82µ\82Ä\83T\81[\83r\83X\82Ì
+\8bN\93®\83\82\83W\83\85\81[\83\8b\81A\82¨\82æ\82Ñ\83C\83x\83\93\83g\83\8d\83O\82Ì\83\81\83b\83Z\81[\83W\83\8a\83\\81[\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê\82Ä\82¢
+\82é\81B
+<p class="indent">   \82·\82×\82Ä\82Ì\83T\81[\83r\83X\82ð\93o\98^\89ð\8f\9c\82·\82ê\82Î\81A jvmservice.exe \82ð\8dí\8f\9c\82µ\82Ä\82à\88À\91S\82Å\82 
+\82é\81B<a href="jvmservice_doc11.html#fn10x0"><sup >10</sup></a><a  id="x1-41001f10"></a> 
+<p class="indent">   \82»\82Ì\8fê\8d\87\81A\83C\83x\83\93\83g\83\8d\83O\82É\8bL\98^\82³\82ê\82Ä\82¢\82é\8c»\8dÝ\82Ì jvmservice.exe
+\82ª\8fo\97Í\82µ\82½\83\8d\83O\93à\97e\82É\82Â\82¢\82Ä\82Í\83\81\83b\83Z\81[\83W\82ª\93Ç\82Ý\8eæ\82ê\82È\82¢\8fó\91Ô\82É\82È
+\82é\81B<a href="jvmservice_doc12.html#fn11x0"><sup >11</sup></a><a  id="x1-41002f11"></a> 
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h3 class="sectionHead">3    <a  id="x1-420003"></a>\83}\83j\83\85\83A\83\8b</h3>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="noindent">
+   <h4 class="subsectionHead">3.1    <a  id="x1-430003.1"></a>jvmservice \8bN\93®\83I\83v\83V\83\87\83\93</h4>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="noindent">
+   <h4 class="subsectionHead">3.2    <a  id="x1-440003.2"></a>\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b</h4>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="noindent">
+   <h4 class="subsectionHead">3.3    <a  id="x1-450003.3"></a>\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b</h4>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="noindent">
+   <h4 class="subsectionHead">3.4    <a  id="x1-460003.4"></a>\83\8d\83O\83t\83@\83C\83\8b\82Ì\93à\97e</h4>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="noindent">
+   <h4 class="subsectionHead">3.5    <a  id="x1-470003.5"></a>\83C\83x\83\93\83g\83r\83\85\81[\83\8f\82Ì\93à\97e</h4>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+<p class="indent">
+                                                                    
+
+                                                                    
+   <h3 class="sectionHead">4    <a  id="x1-480004"></a>\83A\81[\83L\83e\83N\83`\83\83</h3>
+<p class="noindent">\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+    
+</body></html> 
+
+                                                                    
+
+
diff --git a/doc/html/jvmservice_doc10.html b/doc/html/jvmservice_doc10.html
new file mode 100644 (file)
index 0000000..f6b69f3
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn9x0">    <sup >9</sup></a>\83T\81[\83r\83X\96¼\82Í\8e©\97R\82É\82Â\82¯\82ç\82ê\82é\82½\82ß\81A\8aù\91\82Ì\83V\83X\83e\83\80\97p\82Ì\83T\81[\83r\83X\96¼\82ð\8cë\82Á\82Ä\8ew\92è\82·\82é\8fê\8d\87\82à\82 \82è\82¤\82é\81B\82±\82Ì \82æ\82¤\82È\8cë\91\80\8dì\82ð\96h\82®\82½\82ß\81A\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê\82Ä\82¢\82é\8eÀ\8ds\83t\83@\83C\83\8b\82Æ\8a®\91S\82É\93¯\82\83p\83X\82©\82ç\82Å\82È\82¯\82ê\82Î\8dÄ\93o\98^\81E\8dí\8f\9c
\82ð\8b\96\89Â\82µ\82È\82¢\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc11.html b/doc/html/jvmservice_doc11.html
new file mode 100644 (file)
index 0000000..e53371a
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+         <div class="footnote-text">
+   <p class="indent">      <a 
+ id="fn10x0">   <sup >10</sup></a>\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\89ð\8f\9c\82¹\82¸\82Éjvmservice.exe \82ð\83t\83@\83C\83\8b\83V\83X\83e\83\80\82©\82ç\8fÁ\82·\8cë\91\80\8dì\82É\82Â\82¢\82Ä\95Û\8cì\82·\82é\95û\96@\82Í \82È\82¢\81B</div>
+     
+</body></html> 
diff --git a/doc/html/jvmservice_doc12.html b/doc/html/jvmservice_doc12.html
new file mode 100644 (file)
index 0000000..e408dde
--- /dev/null
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+         <div class="footnote-text">
+   <p class="indent">      <a 
+ id="fn11x0">   <sup >11</sup></a>\82±\82ê\82Í\81AWindows \82Ì\83C\83x\83\93\83g\83\8d\83O\82Ì\8c`\8e®\82Å\82Í\81A\83\8d\83O\83t\83@\83C\83\8b\8fã\82É\82Í\83\81\83b\83Z\81[\83W\82Å\82Í\82È\82­\83f\81[\83^\82ª\8ai\94[\82³\82ê\82Ä \82¨\82è\81A\82±\82Ì\83f\81[\83^\82ð 
+jvmservice.exe \82Ì\83\8a\83\\81[\83X\92\86\82Ì\83\81\83b\83Z\81[\83W\83e\83\93\83v\83\8c\81[\83g\82ð\92Ê\82·\82±\82Æ\82Å\90l\8aÔ\82ª\93Ç\82ß\82é\83\81\83b\83Z\81[\83W\82É \95Ï\8a·\82·\82é\82½\82ß\82Å\82 \82é\81B</div>
+     
+</body></html> 
diff --git a/doc/html/jvmservice_doc2.html b/doc/html/jvmservice_doc2.html
new file mode 100644 (file)
index 0000000..5f83b1d
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn1x0">    <sup >1</sup></a>\8eÀ\8dÛ\82É\82Í\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Ì\8aÂ\8b«\82Å\82 \82é\82½\82ß\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94\82¾\82¯\82ª\94F\8e¯\82³\82ê\82é\82Æ\8dl\82¦\82Ä\82æ \82¢\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc3.html b/doc/html/jvmservice_doc3.html
new file mode 100644 (file)
index 0000000..98eb40d
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn2x0">    <sup >2</sup></a>\8ew\92è\82·\82é\8fê\8f\8a\82Í\8ds\93ª\82Å\82 \82è\81A\8ds\96\96\82Å\82Í\82È\82¢\82±\82Æ\82É\92\8d\88Ó\82·\82é\82±\82Æ\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc4.html b/doc/html/jvmservice_doc4.html
new file mode 100644 (file)
index 0000000..cb84e03
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn3x0">    <sup >3</sup></a>\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94PATH \82Éjvm.dll \82Ö\82Ì\83p\83X\82ª\92Ê\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\8bN\93®\82·\82é\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc5.html b/doc/html/jvmservice_doc5.html
new file mode 100644 (file)
index 0000000..123a0ce
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn4x0">    <sup >4</sup></a>\82Â\82Ü\82èWindows \82ÌKernel32.dll \82È\82Ç\82Ì\95W\8f\80DLL \82¾\82¯\82É\88Ë\91\82·\82éDLL</div>
+      
+</body></html> 
diff --git a/doc/html/jvmservice_doc6.html b/doc/html/jvmservice_doc6.html
new file mode 100644 (file)
index 0000000..e026f49
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn5x0">    <sup >5</sup></a>\8cJ\82è\95Ô\82µ\82É\82È\82é\82ª\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82É\82¨\82¯\82é\8aÂ\8b«\95Ï\90\94\82Í\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94\82Æ\8dl\82¦\82Ä\82æ\82¢\81B\8aÂ\8b«\95Ï\90\94\82ª\91\8dÝ\82µ \82È\82¢\8fê\8d\87\82Í\95Ï\8a·\82³\82ê\82¸\82É\8ec\82³\82ê\82é\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc7.html b/doc/html/jvmservice_doc7.html
new file mode 100644 (file)
index 0000000..7ad11a3
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn6x0">    <sup >6</sup></a>\8aÈ\92P\82É\82¢\82¦\82Î\8aÂ\8b«\95Ï\90\94PATH \82Ì\8co\98H\82Å\92T\82·\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc8.html b/doc/html/jvmservice_doc8.html
new file mode 100644 (file)
index 0000000..b89cb34
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn7x0">    <sup >7</sup></a>\83\8a\83l\81[\83\80\82·\82é\82±\82Æ\82ª\8fd\97v\82Å\82 \82é\81B\88Ù\82È\82é\83t\83H\83\8b\83_\82É\83R\83s\81[\82·\82é\82¾\82¯\82Å\82Í\95s\8f\\95ª\82Å\82 \82é\81B</div>
+    
+</body></html> 
diff --git a/doc/html/jvmservice_doc9.html b/doc/html/jvmservice_doc9.html
new file mode 100644 (file)
index 0000000..8daf792
--- /dev/null
@@ -0,0 +1,18 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
+  "http://www.w3.org/TR/html4/loose.dtd">  
+<html > 
+<head><title></title> 
+<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> 
+<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="originator" content="TeX4ht (http://www.cse.ohio-state.edu/~gurari/TeX4ht/mn.html)"> 
+<meta name="src" content="jvmservice_doc.tex"> 
+<meta name="date" content="2005-06-01 00:00:00"> 
+<link rel="stylesheet" type="text/css" href="jvmservice_doc.css"> 
+</head><body 
+>
+       <div class="footnote-text">
+  <p class="indent">      <a 
+ id="fn8x0">    <sup >8</sup></a>\83C\83x\83\93\83g\83\8d\83O\82É\82Í\8fI\97¹\82Ì\83C\83x\83\93\83g\82ª\8f\91\82«\8d\9e\82Ü\82ê\82È\82¢\81B\82±\82ê\82Í\83C\83x\83\93\83g\83\8d\83O\82ª\90æ\82É\95Â\82\82ç\82ê\82Ä\82µ\82Ü\82¤\82½\82ß\82Å\82  \82é\81B\90³\82µ\82­\8fI\97¹\82µ\82½\82©\82Ç\82¤\82©\82Í\83\8d\83O\83t\83@\83C\83\8b\82©\82ç\8am\94F\82·\82é\95K\97v\82ª\82 \82é\81B</div>
+    
+</body></html> 
diff --git a/doc/jvmservice.pdf b/doc/jvmservice.pdf
new file mode 100644 (file)
index 0000000..afe47ed
Binary files /dev/null and b/doc/jvmservice.pdf differ
diff --git a/doc/jvmservice.tex b/doc/jvmservice.tex
new file mode 100644 (file)
index 0000000..bfd94fb
--- /dev/null
@@ -0,0 +1,817 @@
+\documentclass{article}
+\setlength{\textwidth}{39zw}
+\setlength{\oddsidemargin}{1cm}
+
+\usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,bookmarkstype=toc]{hyperref}
+\AtBeginDvi{\special{pdf:tounicode 90ms-RKSJ-UCS2}}
+
+\usepackage{array}
+\usepackage{alltt}
+\usepackage{pifont}
+
+\usepackage[T1]{fontenc}
+\usepackage{textcomp}
+
+\newcommand{\return}{\Pisymbol{psy}{"BF}}
+
+\newcommand{\userinput}[1]{\underbar{\texttt{{#1}\return}}}
+\newcommand{\userkeyin}[1]{\underbar{\texttt{{#1}}}}
+
+\begin{document}
+\title{jvmservice\82É\82Â\82¢\82Ä(\83h\83\89\83t\83g)}
+\author{seraphy}
+\date{\today}
+\maketitle
+
+\hypertarget{\96Ú\8e\9f}{} 
+\tableofcontents
+
+\newpage
+\section{\82Í\82\82ß\82É}
+
+\subsection{\96{\83h\83L\83\85\83\81\83\93\83g\82É\82Â\82¢\82Ä}
+\96{\83h\83L\83\85\83\81\83\93\83g\82Í\today \8c»\8dÝ\82Ì\8aJ\94­\92\86\83o\81[\83W\83\87\83\93\82Ìjvmservice\82Ì\8c»\8fó\82É\82Â\82¢\82Ä\90à\96¾\82µ\82Ä\82¢\82é\81B
+\underbar{{\bf \96{\83h\83L\83\85\83\81\83\93\83g\82Í\83h\83\89\83t\83g\94Å\82Å\82 \82è\81A\90³\8am\82Å\82à\8a®\91S\82Å\82à\82È\82¢\81B}}
+
+\subsection{jvmservice\82Æ\82Í}
+
+\subsubsection{\96Ú\93I\81E\97p\93r}
+
+{\bf jvmservice}\82Í\81AWindows2000/XP/2003\8fã\82Å\82Ì\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä
+JAVA\8c¾\8cê\82Å\8bL\8fq\82³\82ê\82½\83N\83\89\83X\83t\83@\83C\83\8b\82ð\8bN\93®\82³\82¹\82é\82±\82Æ\82ª\82Å\82«\82é\82æ\82¤\82É\82·\82é\83\89\83\93\83`\83\83\81[\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Å\82 \82é\81B
+
+\82±\82ê\82Í\8eå\82É\81A\8e©\8dì\82ÌJAVA\82Å\8bL\8fq\82³\82ê\82½\83T\81[\83r\83X\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\81AWindows\82Ì\83T\81[\83r\83X\82Æ\82µ\82Ä\93\9d\8d\87\82Å\82«\82é\82æ\82¤\82É\82·\82é\82½\82ß\82Ì\83c\81[\83\8b\82Æ\82µ\82Ä
+\8eg\82í\82ê\82é\82±\82Æ\82ð\91z\92è\82µ\82Ä\82¢\82é\81B
+\8aù\91\82Ì\90»\95i\8cQ\81A\82½\82Æ\82¦\82ÎApache Tomcat\82È\82Ç\82É\82Í\81A\82·\82Å\82É\83T\81[\83r\83X\89»\82·\82é\82½\82ß\82Ì\8b@\8d\\82ð\8e©\95ª\82Å\82à\82Á\82Ä\82¨\82è\81A
+\82»\82Ì\82æ\82¤\82È\82à\82Ì\82É\82Æ\82Á\82Ä\82©\82í\82é\97\98\93_\82Í\96³\82¢\81B
+
+\82»\82Ì\82©\82í\82èjvmservice\82Í\83R\83\93\83\\81[\83\8b\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Æ\82µ\82Ä\90Ý\8cv\82³\82ê\82½JAVA\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\81A
+\94ä\8ar\93I\8aÈ\92P\82È\8fC\90³\82É\82æ\82è\81A\83T\81[\83r\83X\82É\91Î\89\9e\82µ\82½\83T\81[\83o\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82É\83A\83b\83v\83O\83\8c\81[\83h\82·\82é\82½\82ß\82Ì\8b@\8d\\82ð\92ñ\8b\9f\82·\82é\81B
+
+\82Ü\82½\81A\8e©\8dì\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ª\89½\8cÂ\82 \82Á\82Ä\82à\83T\81[\83r\83X\89»\82Å\82«\82é\82æ\82¤\82É\81Ajvmservice\82Å\82Í\82¢\82­\82Â\82Å\82à\83T\81[\83r\83X\82ð\8dì\90¬\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
+
+\subsubsection{\83R\83\93\83Z\83v\83g\81A\8eÀ\8c»\95û\96@}
+
+jvmservice\82Í\83T\81[\83r\83X\96¼\82ð\93o\98^\82·\82é\82Æ\82«\81AJavaVM\82ð\8bN\93®\82·\82é\83p\83\89\83\81\81[\83^\82Æ\8eÀ\8ds\82·\82é\83N\83\89\83X\82È\82Ç\82Ì\8fî\95ñ\82ð\8ai\94[\82µ\82½{\bf \8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}\82ð
+\82ð\83T\81[\83r\83X\82É\8aÖ\98A\82Ã\82¯\82é\81B\82»\82Ì\82½\82ß\81Ajvmservice\82Í1\82Â\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Å\81A\82¢\82­\82Â\82à\82ÌJAVA\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82ð\83T\81[\83r\83X\82Æ\82µ\82Ä\8eÀ\8ds\82Å\82«\82é\81B
+
+jvmservice\82ª\8eÀ\8dÛ\82É\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82½\82Æ\82«\81Ajvmservice\82Å\82ÍJNI\82Ì\8b@\8d\\82ð\97p\82¢\82Ä\83T\81[\83r\83X\83v\83\8d\83Z\83X\93à\82ÉJavaVM\82ð\8dì\90¬\82µ\83N\83\89\83X\82ð\83\8d\81[\83h\82µ\8eÀ\8ds\82·\82é\81B
+\82±\82Ì\82Æ\82«\81A\83T\81[\83r\83X\82É\8aÖ\98A\82Ã\82¯\82ç\82ê\82½{\bf \8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}\82©\82ç\95K\97v\82ÈJavaVM\82Ì\83p\83\89\83\81\81[\83^\82â\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82È\82Ç\82Ì\8fî\95ñ\82ð\8eæ\93¾\82·\82é\81B
+
+jvmservice\83v\83\8d\83Z\83X\82Í\8ew\92è\82³\82ê\82½\94C\88Ó\82Ì(\95¡\90\94\81E\95À\97ñ\89Â)\83N\83\89\83X\82Ì\90Ã\93I\83\81\83\\83b\83h\82ð\8cÄ\82Ñ\8fo\82µ\81A\82±\82ê\82ç\82Ì\91S\82Ä\82Ì\83X\83\8c\83b\83h\82ª\92â\8e~\82·\82é\82Æ
+\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ð\8fI\97¹\82µ\92â\8e~\8fó\91Ô\82Æ\82È\82é\81B
+
+jvmservice\82É\92â\8e~\8ew\8e¦\82ª\91\97\82ç\82ê\82é\82©\81A\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80\82ª\83V\83\83\83b\83g\83_\83E\83\93\82ð\8aJ\8en\82·\82é\82Æ\81A
+jvmservice\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ÍJavaVM\82É\91Î\82µ\82Ä\90V\82µ\82¢\92â\8e~\97p\83X\83\8c\83b\83h\82ð\8dì\90¬\82µ\81A
+JavaVM\93à\82©\82ç\verb/java.lang.System#exit(0)/ \82ð\8eÀ\8ds\82·\82é\81B
+
+\82±\82ê\82É\82æ\82è\81AJavaVM\82Í\verb/java.lang.Runtime#addShutdownHook(java.lang.Thread)/ \82Å\93o\98^\82³\82ê\82½\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\82ð\8eÀ\8ds\82µ\82Ä\82©\82ç
+JavaVM\82ª\92â\8e~\82µ\81AJavaVM\82ª\83T\81[\83r\83X\83v\83\8d\83Z\83X\82É\91Î\82µ\82Ä\verb/exit/ \82·\82é\82æ\82¤\82É\97v\8b\81\82µ\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ª\8fI\97¹\82·\82é\81B
+
+\subsection{\8aJ\94­\81E\93®\8dì\8aÂ\8b«}
+
+\subsubsection{\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80}
+
+{\bf jvmservice}\82ª\91Î\8fÛ\82Æ\82·\82é\83I\83y\83\8c\81[\83e\83B\83\93\83O\83V\83X\83e\83\80\82Í\88È\89º\82Ì\82à\82Ì\82Å\82 \82é\81B
+
+\begin{itemize}
+\item Windows2000 Professional/Server
+\item WindowsXP Professional
+\end{itemize}
+
+\82¨\82»\82ç\82­\81AWindows2000\88È\8d~\82ÌNT\8cn\82ÌOS\82Å\82 \82ê\82Î\93®\82­\82à\82Ì\82Æ\8ev\82í\82ê\82é\82ª\81A\93®\8dì\8am\94F\82Í\82µ\82Ä\82¢\82È\82¢\81B
+
+\subsubsection{JAVA\8aÂ\8b«(JDK/JRE)}
+
+{\bf jvmservice}\82Ì\8aJ\94­\82É\82 \82½\82è\91Î\8fÛ\82Æ\82µ\82½JavaVM\82Í\81ASun Microsystems\82ª\92ñ\8b\9f\82·\82éJDK/JRE\82Ì\82¤\82¿\81A\88È\89º\82Ì\82à\82Ì\82Å\82 \82é\81B
+
+\begin{itemize}
+\item JDK/JRE 1.3.1\_15
+\item JDK/JRE 1.4.2\_08
+\item JDK/JRE 1.5.0\_02
+\end{itemize}
+
+{\bf jvmservice}\82Í\81A\href{http://java.sun.com/j2se/1.3/ja/docs/ja/guide/jni/index.html}{JNI1.2\8ed\97l}\82É\8aî\82Ã\82¢\82ÄJavaVM\82ð\8dì\90¬\82µ\81A\91\80\8dì\82µ\82Ä\82¢\82é\81B
+
+\82±\82Ì\8ed\97l\82É\93K\8d\87\82·\82é\83o\81[\83W\83\87\83\931.3.1\88È\8d~\82ÌJava\8aÂ\8b«\82Å\82 \82ê\82Î\82Ç\82ê\82Å\82à\93®\8dì\82·\82é\82Æ\8ev\82í\82ê\82é\82ª\81A\93®\8dì\8am\94F\82Í\82µ\82Ä\82¢\82È\82¢\81B
+Sun Microsystems\88È\8aO\82ÌJavaVM\82Å\82Ì\93®\8dì\8am\94F\82Í\82µ\82Ä\82¢\82È\82¢\81B
+
+
+\subsubsection{\8aJ\94­\8c¾\8cê\81E\8aÂ\8b«}
+{\bf jvmservice}\82Í\81AMicrosoft Visual Studio.NET2003\82ÌVisual C++ \82É\82æ\82Á\82Ä\8bL\8fq\82³\82ê\82Ä\82¢\82é\81B
+
+MFC/ATL\82È\82Ç\82Ì\83\89\83C\83u\83\89\83\8a\82Í\8eg\82Á\82Ä\82¢\82È\82¢\81B
+
+\subsection{\83\89\83C\83Z\83\93\83X}
+Licensed under the Open Software License version 2.0
+
+\href{http://www.opensource.jp/licenses/osl-2.0.html}{\83I\81[\83v\83\93\81E\83\\83t\83g\83E\83F\83A\81E\83\89\83C\83Z\83\93\83X v. 2.0}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\section{\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93}
+
+{\bf jvmservice}\82Ì\97\98\97p\95û\96@\82Æ\82µ\82Ä\88È\89º\82É\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82ð\8e¦\82·\81B
+
+\subsection{\93ü\8eè\95û\96@}
+
+\href{http://sourceforge.jp/projects/jvmservice/}{sourceforge\82Ìjvmservice\83v\83\8d\83W\83F\83N\83g}\82©\82ç\81A
+jvmservice\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Æ\83T\83\93\83v\83\8b\97pJAVA\83R\81[\83h\82ð\8eæ\93¾\82·\82é\81B
+
+\83t\83@\83C\83\8b\96¼\82Í\today \8c»\8dÝ\82Å\82Í\81A\88È\89º\82Ì\82æ\82¤\82É\82È\82Á\82Ä\82¢\82é\81B
+(\8eÀ\8dÛ\82É\82Í\83t\83@\83C\83\8b\96¼\82Ì\8cã\82ë\82É\83o\81[\83W\83\87\83\93\82©\83\8a\83r\83W\83\87\83\93\82ð\8e¦\82·\90\94\8e\9a\82ª\82Â\82¯\82ç\82ê\82Ä\82¢\82é\81B)
+
+\begin{itemize}
+\item jvmservice.zip
+\item jvmservice\_binary.zip
+\item sample.zip
+\end{itemize}
+
+jvmservice.zip\82Í\81A\83\\81[\83X\83R\81[\83h\82ð\8aÜ\82Þ\8a®\91S\82È\83Z\83b\83g\82Å\82 \82è\81Ajvmservice\_binary.zip \82Ì\93à\97e\82Æ\81Asample.zip \82Ì\93à\97e\82ð\8aÜ\82ñ\82Å\82¢\82é\81B
+\82Æ\82è\82 \82¦\82¸\81Ajvmservice.zip \82ð\83_\83E\83\93\83\8d\81[\83h\82·\82ê\82Î\91S\82Ä\91µ\82¤\82Ì\82Å\8eè\82Á\8eæ\82è\91\81\82¢\82Æ\82¢\82¦\82é\81B
+
+\subsection{\93à\97e\90à\96¾}
+
+\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\88È\89º\82Ì\83t\83@\83C\83\8b\82ð\97\98\97p\82µ\82Ä\8ds\82¤\81B
+\begin{itemize}
+\item jvmservice.exe
+\item jvmservice.preload
+\item sample/jvmserv1.conf
+\item sample/SampleJVMService.java
+\end{itemize}
+
+\82±\82ê\82ç\82Ì\83t\83@\83C\83\8b\82Ì\92\86\90g\82É\82Â\82¢\82Ä\90à\96¾\82·\82é\81B
+
+\subsubsection{jvmservice.exe}
+{\bf jvmservice.exe}\82Í\96{\83A\83v\83\8a\83P\81[\83V\83\87\83\93\82Ì\92\86\8aj\82Å\82 \82é\81B
+\82±\82Ì\83t\83@\83C\83\8b\82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82é\8eÀ\8ds\83t\83@\83C\83\8b\96{\91Ì\82Å\82 \82é\82Æ\93¯\8e\9e\82É\81A\83T\81[\83r\83X\82Ì\93o\98^\82Æ\93o\98^\89ð\8f\9c\82ð\8ds\82¤\83c\81[\83\8b\82Å\82à\82 \82é\81B
+
+\subsubsection{jvmservice.preload}
+{\bf jvmservice.preload}\82Í{\bf jvmservice.exe}\82ª\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82½\82Æ\82«\82É\93Ç\82Ý\8d\9e\82Þ\83_\83C\83i\83~\83b\83N\83\8a\83\93\83N\83\89\83C\83u\83\89\83\8a(DLL)\82Ì
+\88ê\97\97\82ð\8bL\8fq\82µ\82½\83e\83L\83X\83g\83t\83@\83C\83\8b\82Å\82 \82è\81A\93¯\8d«\82³\82ê\82Ä\82¢\82é\82Ì\82Í\81A\82»\82Ì\90\97\8c`\82Å\82 \82é\81B
+
+\8eg\97p\82·\82é\83}\83V\83\93\82Ì\8aÂ\8b«\82É\82 \82í\82¹\82Ä\81A\82±\82Ì\83t\83@\83C\83\8b\82Å\8bN\93®\82·\82éJavaVM\82Ì\8eÀ\8dÛ\82ÌDLL\81u{\bf jvm.dll}\81v\82Ì\83t\83\8b\83p\83X\82ð\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\subsubsection{sample/jvmserv1.conf}
+{\bf sample/jvmserv1.conf}\82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82é\82Æ\82«\82ÉJavaVM\82É\93n\82³\82ê\82é\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82â\81A\82»\82Ì\88ø\90\94\82ð\8bL\8fq\82µ\82½
+\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82Å\82 \82è\81A\93¯\8d«\82³\82ê\82Ä\82¢\82é\82Ì\82Í\81A\82»\82Ì\90\97\8c`\82Å\82 \82é\81B
+
+\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\82±\82Ì\83t\83@\83C\83\8b\82ð\82à\82Æ\82É\90à\96¾\82ð\8ds\82¤\81B
+
+\subsubsection{sample/SampleJVMService.java}
+{\bf sample/SampleJVMService.java}\82Í\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\97p\82ÌJAVA\83\\81[\83X\83R\81[\83h\82Å\82 \82é\81B
+
+\93±\93ü\83f\83\82\83\93\83X\83g\83\8c\81[\83V\83\87\83\93\82Å\82Í\81A\82±\82Ì\83t\83@\83C\83\8b\82ðjavac\82É\82æ\82è\83R\83\93\83p\83C\83\8b\82µjava.exe\82Å\8eÀ\8ds\82·\82é\83P\81[\83X\82Æ\81A\82»\82ê\82ð\83T\81[\83r\83X\82É\93o\98^\82·\82é\82½\82ß\82Ì
+\8eè\8f\87\82É\82Â\82¢\82Ä\90à\96¾\82ð\8ds\82¤\81B
+
+\newpage
+\subsection{\83T\83\93\83v\83\8b\97pJAVA\83R\81[\83h\82Ì\8eÀ\8ds}
+
+\subsubsection{SampleJVMService\82Ì\90à\96¾}
+
+jvmservice\82Í\83T\81[\83r\83X\82Æ\82µ\82Ä\8eÀ\8ds\82·\82é\82½\82ß\89æ\96Ê\93\99\82Å\93®\8dì\82ð\8am\94F\82Å\82«\82È\82¢\81B
+
+\82»\82±\82Å\81A\82Ü\82¸\81A\83T\83\93\83v\83\8b\97p\83v\83\8d\83O\83\89\83\80\82ª\81A\82Ç\82Ì\82æ\82¤\82È\93®\82«\82ð\82·\82é\82à\82Ì\82©\82ð\8am\82©\82ß\82é\81B
+
+\82±\82Ìsample.zip\82É\82Í\81ASampleJVMService.java\82Æ\82¢\82¤\81A\92P\8f\83\82É1\95b\8aÔ\82É\88ê\93x\82Ì\8aÔ\8au\82Å\83t\83@\83C\83\8b\82É\90\94\8e\9a\82ð\8fo\97Í\82·\82é\96³\8cÀ\83\8b\81[\83v\82Ì\83v\83\8d\83O\83\89\83\80\82ª\82 \82é\81B
+
+\82±\82Ì\83v\83\8d\83O\83\89\83\80\82Í\8bN\93®\83I\83v\83V\83\87\83\93\82Æ\82µ\82Ä\8fo\97Í\90æ\83t\83@\83C\83\8b\82Ö\82Ì\83p\83X\82ð1\82Â\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\subsubsection{\83\\81[\83X\83R\81[\83h(\94²\90\88)}
+
+\88È\89º\82Í\81ASampleJVMService.java\82Ì\83\81\83C\83\93\83\81\83\\83b\83h\82ð\94²\90\88\82µ\82½\82à\82Ì\82Å\82 \82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{10pt}
+\begin{verbatim}
+public static void main( final String[] args ) throws Exception {
+    final PrintStream out = new PrintStream(
+        new FileOutputStream( args[ 0 ]  ) );
+
+    final Thread mainThread = Thread.currentThread();
+
+    final Thread shutdownThread = new Thread() {
+        public void run() {
+            out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8aJ\8en" );
+            for( int idx=0; idx<10 && mainThread.isAlive(); idx++) {
+                mainThread.interrupt();
+                try{
+                    mainThread.join( 100 );
+                }
+                catch( InterruptedException e ) {
+                }
+            }
+            out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹" );
+            out.close();
+        }
+    };
+    Runtime.getRuntime().addShutdownHook( shutdownThread );
+
+    int idx = 0;
+    for( ;; ) {
+        try{
+            out.println( idx++ );
+            Thread.sleep( 1000 );
+        }
+        catch( InterruptedException e ) {
+            break;
+        }
+    }
+    out.println( "\8fI\97¹\82µ\82Ü\82·\81B" );
+}
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+\newpage
+\subsubsection{SampleJVMService\82Ì\8eÀ\8ds}
+
+\88È\89º\82Í{\texttt C:/temp/sample}\82Æ\82¢\82¤\83t\83H\83\8b\83_\8fã\82É\83R\83\93\83p\83C\83\8b\82³\82ê\82½{\bf SampleJVMService.class}\82ª\94z\92u\82³\82ê\82Ä\82¢\82é\82Æ\89¼\92è\82·\82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{12pt}
+\begin{alltt}
+
+\userinput{java.exe -cp C:/temp/sample SampleJVMService C:/temp/test.txt }
+\end{alltt}
+\end{quote} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+{\texttt C:/temp/test.txt}\83t\83@\83C\83\8b\82ª\8dì\90¬\82³\82ê\81A\90\94\8e\9a\82ª\8fo\97Í\82³\82ê\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F\82·\82é\81B
+
+\subsubsection{\8fI\97¹\8f\88\97\9d}
+
+\8fI\97¹\82·\82é\82É\82Í\83R\83\93\83\\81[\83\8b\89æ\96Ê\82Å\userkeyin{CTRL-C}\82Ì\89\9f\89º\82É\82æ\82Á\82Äjava.exe\82ð\8b­\90§\8fI\97¹\82³\82¹\82é\81B
+
+\89æ\96Ê\8fã\82É\82Í\81u\8fI\97¹\82µ\82Ü\82·\81B\81v\82Æ\81A\82Â\82Ã\82¯\82Ä\81u\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹\81v\82Æ\8fo\82é\82Í\82¸\82Å\82 \82é\81B
+
+\vspace{\baselineskip}
+SampleJVMService.java\82Å\82Í\81A\verb/java.lang.Runtime#addShutdownHook()/ \82ð\97p\82¢\82Ä\81A\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\97p\83X\83\8c\83b\83h\82ð\93o\98^\82µ\82Ä\82¢\82é\81B
+
+\82»\82Ì\82½\82ß\81ACTRL-C\82ð\8eó\97\9d\82µ\82½JavaVM\82ªexit\82ð\8eÀ\8ds\82µ\82æ\82¤\82Æ\82µ\82½\8c\8b\89Ê\81A\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\82ª\93®\8dì\82µ\81A\82»\82ê\82ª\83\81\83C\83\93\83X\83\8c\83b\83h\82É\91Î\82µ\82Ä
+\verb/java.lang.Thread#interupt()/ \82É\82æ\82é\8a\84\82è\8d\9e\82Ý\82ð\94­\90\82³\82¹\81A\83\81\83C\83\93\83X\83\8c\83b\83h\82Ì\83\8b\81[\83v\82ª\92\86\92f\82µ\82Ä\82¢\82é\82±\82Æ\82ª\82í\82©\82é\81B
+
+\vspace{\baselineskip}
+\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä\8eÀ\8ds\82³\82¹\82é\83N\83\89\83X\82Í\89½\82ç\82©\82Ì\83V\83O\83i\83\8b\82ª\94­\90\82µ\82È\82¢\82©\82¬\82è\96³\8cÀ\83\8b\81[\83v\8d\\91¢\82É\82È\82Á\82Ä\82¢\82é\82à\82Ì\82ª\91½\82¢\82Æ\8dl\82¦\82ç\82ê\82é\81B
+
+\82±\82Ì\82æ\82¤\82È\83v\83\8d\83O\83\89\83\80\82ðjvmservice\82Å\83T\81[\83r\83X\89»\82·\82é\82½\82ß\82É\82Í\81Ajvmservice\82Ì\92â\8e~\97v\8b\81\82Å\82 \82é\verb/java.lang.System#exit(0)/ \82É\82æ\82Á\82Ä
+\83v\83\8d\83O\83\89\83\80\82ð\88À\91S\82É\83V\83\83\83b\83g\83_\83E\83\93\82Å\82«\82é\82æ\82¤\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\8eÀ\8dÛ\82É\83T\81[\83r\83X\89»\82·\82é\82Ü\82¦\82É\81A\82Ü\82¸\83R\83\93\83\\81[\83\8b\89æ\96Ê\8fã\82Å\82Ì\userkeyin{CTRL-C} \82Ì\89\9f\89º\82É\82æ\82è\81A\83V\83\83\83b\83g\83_\83E\83\93\83t\83b\83N\82Å\82Ì
+\8cã\8en\96\96\82ª\8aJ\8en\82³\82ê\81A\83v\83\8d\83Z\83X\82ª\88À\91S\82É\8fI\97¹\82·\82é\82±\82Æ\82ð\8am\94F\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\newpage
+\subsection{\83T\81[\83r\83X\93o\98^\81^\93o\98^\89ð\8f\9c\83c\81[\83\8b}
+
+{\bf jvmservice.exe}\82Í\83T\81[\83r\83X\93o\98^\81^\89ð\8f\9c\83c\81[\83\8b\82Å\82 \82é\82Æ\93¯\8e\9e\82É\81A
+\8eÀ\8dÛ\82É\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä\82à\8bN\93®\82³\82ê\82é\8eÀ\8ds\83t\83@\83C\83\8b\82Å\82 \82é\81B
+
+\83T\81[\83r\83X\82ð\93o\98^\82·\82é\82É\82Íjvmservice\82ð\verb/--regist/ \83I\83v\83V\83\87\83\93\82Å\8bN\93®\82·\82é\81B
+
+\83R\83}\83\93\83h\83\89\83C\83\93\82É\82Í\88È\89º\82Ì\82æ\82¤\82È\8c`\8e®\82Å\8ew\92è\82·\82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{12pt}
+\begin{verbatim}
+
+jvmservice.exe --regist \83T\81[\83r\83X\96¼ --config \8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b
+    [--log \83\8d\83O\83t\83@\83C\83\8b ] [--workingdir \8dì\8bÆ\83f\83B\83\8c\83N\83g\83\8a]
+    [--dependencies [\88Ë\91\83T\81[\83r\83X\96¼ ...] ]
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+
+\vspace{\baselineskip}
+
+\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82·\82é\82Ü\82¦\82É\81A\82Ü\82¸\81Ajvmservice.exe\82ð\93K\90Ø\82È\8fê\8f\8a\82É\94z\92u\82µ\82Ä\82¨\82­\95K\97v\82ª\82 \82é\81B
+
+jvmservice.exe\82Ì\8bN\93®\83I\83v\83V\83\87\83\93\82Å\verb/--regist/ \82Æ\8ew\92è\82·\82é\82±\82Æ\82Å\81A\8bN\93®\82³\82ê\82½jvmservice.exe\82Ì\underbar{\8c»\8e\9e\93_\82Å\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82Ì\91\8dÝ\82·\82é\83p\83X}\82ª\83T\81[\83r\83X\8bN\93®\83p\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê\82é\81B
+
+\82µ\82½\82ª\82Á\82Ä\81A\88ê\93x\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82µ\82½\82ç\81A\83T\81[\83r\83X\82ð\93o\98^\89ð\8f\9c\82µ\82È\82¢\82©\82¬\82èjvmservice.exe\82ð\8dí\8f\9c\82µ\82½\82è\91¼\82Ì\8fê\8f\8a\82É\88Ú\93®\82³\82¹\82Ä\82Í\82È\82ç\82È\82¢\81B
+
+\82Ü\82½\81A\8c©\82Ä\82Ì\82Æ\82¨\82è\81AJAVA\8bN\93®\82Ì\82½\82ß\82Ì\83p\83\89\83\81\81[\83^\82Í\92¼\90Ú\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\81B\82±\82ê\82Í\81u\8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b\81v\82É\8bL\8fq\82µ\82Ä\82¨\82«\81A\83T\81[\83r\83X\82É\93o\98^\82·\82é\8dÛ\82É\82Í
+\82»\82Ì\83t\83@\83C\83\8b\82Ö\82Ì\83p\83X\82ð\93o\98^\82·\82é\81B
+
+\81u\8bN\93®\83p\83\89\83\81\81[\83^\83t\83@\83C\83\8b\81v\82É\82Â\82¢\82Ä\82Í\8cã\8fq\82·\82é\81B
+
+
+\subsubsection{\93o\98^\83I\83v\83V\83\87\83\93\82Ì\8aÈ\92P\82È\90à\96¾}
+
+\88È\89º\82É\93o\98^\82Ì\82½\82ß\82Ì\83I\83v\83V\83\87\83\93\82Ì\90à\96¾\82ð\8aÈ\92P\82É\8ds\82¤\81B
+
+\begin{itemize}
+\item \verb/--regist/ \8ew\92è\82µ\82½\83T\81[\83r\83X\96¼\82Å\93o\98^\82·\82é
+\item \verb/--config/ \83T\81[\83r\83X\82ª\8eÀ\8ds\82·\82éJavaVM\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\81A\82¨\82æ\82Ñ\8eÀ\8ds\91Î\8fÛ\83N\83\89\83X\82È\82Ç\82Ì\92è\8b`\82ª\8ai\94[\82³\82ê\82½\83t\83@\83C\83\8b\82ð\8ew\92è\82·\82é\81B
+\item \verb/--log/ JavaVM\82¨\82æ\82Ñjvmservice\82ª\8fo\97Í\82·\82é\83\8d\83O\83\81\83b\83Z\81[\83W\82ð\8bL\98^\82·\82é\83t\83@\83C\83\8b\82ð\8ew\92è\82·\82é\81B{\small (\83f\83t\83H\83\8b\83g\82Í\8fo\97Í\82µ\82È\82¢)}
+\item \verb/--workingdir/ \83T\81[\83r\83X\82ª\8bN\93®\82³\82ê\82½\82Æ\82«\8ew\92è\82³\82ê\82½\83f\83B\83\8c\83N\83g\83\8a\82ð\83J\83\8c\83\93\83g\83f\83B\83\8c\83N\83g\83\8a\82É\95Ï\8dX\82·\82é\81B{\small (\83f\83t\83H\83\8b\83g\82Í\95Ï\8dX\82È\82µ)}
+\item \verb/--dependencies/ jvmservice\82ª\8bN\93®\82·\82é\8dÛ\82É\88Ë\91\82·\82é\91¼\82Ì\83T\81[\83r\83X\96¼\82ð\97ñ\8b\93\82·\82é\81B{\small (\83f\83t\83H\83\8b\83g\82Í\96³\82µ)}
+\end{itemize}
+
+\8f­\82È\82­\82Æ\82à\83T\81[\83r\83X\96¼\82Æ\90Ý\92è\83t\83@\83C\83\8b\82Í\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\83T\81[\83r\83X\96¼\82Í\83A\83\8b\83t\83@\83x\83b\83g\82Æ\90\94\8e\9a\82©\82ç\82È\82é\94C\88Ó\82Ì\96¼\91O\82ª\82Â\82¯\82ç\82ê\82é\82ª\81A\83X\83\89\83b\83V\83\85\82â\textyen \81A\82¨\82æ\82Ñ\83_\83u\83\8b\83N\83H\81[\83g\82È\82Ç\82Ì\8bL\8d\86\82Í\8eg\82¦\82È\82¢\81B
+
+\82Ü\82½\81Ajvmservice\82Ì\93®\82«\82ð\97\9d\89ð\82·\82é\82Ü\82Å\82Í\81A\90Ý\92è\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\82È\82Ç\82Ì\83p\83X\82Í\underbar{\90â\91Î\83p\83X\82Å\8bL\8fq\82·\82é}\82±\82Æ\82ð\90\84\8f§\82·\82é\81B
+
+
+\subsection{\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}
+
+{\bf jvmservice.exe}\82Ì\83T\81[\83r\83X\93o\98^\8e\9e\82É\82Í\81AJAVA\82Ì\83N\83\89\83X\82â\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82¢\82Á\82½\82à\82Ì\82Í\92¼\90Ú\82Í\8ew\92è\82µ\82È\82¢\81B
+
+\82©\82í\82è\82É\81A\82»\82¤\82¢\82Á\82½JavaVM\8bN\93®\8e\9e\82Ì\83p\83\89\83\81\81[\83^\82â\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82¨\82æ\82Ñ\83\81\83\\83b\83h\96¼\81A\82Ü\82½\81A\83\81\83\\83b\83h\82É\88ø\82«\93n\82·\83p\83\89\83\81\81[\83^\82Æ\82¢\82Á\82½\90Ý\92è\82ð\81A
+\8bL\8fq\82µ\82Ä\82¢\82é\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82ð\8ew\92è\82·\82é\81B
+
+\90Ý\92è\83t\83@\83C\83\8b\82Í\83V\83\93\83v\83\8b\82È\83e\83L\83X\83g\83t\83@\83C\83\8b\8c`\8e®\82Å\82 \82è\81A\8ew\92è\82·\82é\8d\80\96Ú\82²\82Æ\82É1\8ds\82Ã\82Â\8ew\92è\82·\82é\81B
+
+\82»\82ê\82¼\82ê\82Ì\8d\80\96Ú(1\8ds)\82Í\81A\88È\89º\82Ì\82¢\82¸\82ê\82©\82Æ\82È\82é\81B
+
+\begin{enumerate}
+\item \83R\83\81\83\93\83g\8ds
+\item JavaVM\82Ì\8bN\93®\83p\83\89\83\81\81[\83^
+\item \8eÀ\8ds\82·\82é\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8ew\92è
+\end{enumerate}
+
+\8bó\8ds\82Å\82 \82é\82©\81A\82·\82×\82Ä\82ª\8bó\94\92\82Å\82 \82é\82©\81A\8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª\verb/#/ {\small (\83V\83\83\81[\83v)}\82Å\8en\82Ü\82é\8fê\8d\87\82Í\83R\83\81\83\93\83g\8ds\82Æ\82·\82é\81B
+
+\8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª\verb/-/ {\small (\83n\83C\83t\83\93)}\82Å\8en\82Ü\82é\8fê\8d\87\82Í\81AJavaVM\82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82·\82é\81B
+
+\8dÅ\8f\89\82Ì\8bó\94\92\88È\8aO\82Ì\95\8e\9a\82ª\verb/-/ {\small (\83n\83C\83t\83\93)}\88È\8aO\82Å\82 \82ê\82Î\81A\8eÀ\8ds\82·\82é\83N\83\89\83X\82Æ\83\81\83\\83b\83h\81A\82¨\82æ\82Ñ\83p\83\89\83\81\81[\83^\82Æ\82·\82é\81B
+
+\82È\82¨\81A\83R\83\81\83\93\83g\8ds\88È\8aO\82Í\8aÂ\8b«\95Ï\90\94\82Ì\93W\8aJ\82ª\8ds\82í\82ê\82é\81B
+
+\verb/%\81`%/ \82Å\88Í\82Ü\82ê\82½\95\8e\9a\97ñ\82ð\95Ï\90\94\96¼\82Æ\82µ\82Ä\8aÂ\8b«\95Ï\90\94\82ª\91\8dÝ\82·\82ê\82Î\93W\8aJ\82·\82é\81B
+\95Ï\90\94\96¼\82Æ\82µ\82Ä\91\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\95Ï\8a·\82³\82ê\82¸\82É\81A\82»\82Ì\82Ü\82Ü\8ec\82³\82ê\82é\81B
+\footnote{\8eÀ\8dÛ\82É\82Í\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Ì\8aÂ\8b«\82Å\82 \82é\82½\82ß\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94\82¾\82¯\82ª\94F\8e¯\82³\82ê\82é\82Æ\8dl\82¦\82Ä\82æ\82¢\81B}
+
+\82±\82Ì\93®\8dì\82ÍWindowsNT\82Ì\83R\83}\83\93\83h\83v\83\8d\83\93\83v\83g\82Æ\93¯\82\82à\82Ì\82Å\82 \82é\81B
+
+\newpage
+\subsubsection{\83T\83\93\83v\83\8b\97p\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}
+
+\82Ü\82¸{\bf SampleJVMService}\82ð\8eÀ\8ds\82·\82é\82½\82ß\82É\95K\97v\82È\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82É\82Â\82¢\82Ä\90æ\82É\8e¦\82·\81B
+
+\82±\82ê\82Í\83T\83\93\83v\83\8b\83v\83\8d\83O\83\89\83\80\82É\8aÜ\82Ü\82ê\82é\81u{\bf SampleJVMService.conf}\81v\82Æ\82¢\82¤\96¼\91O\82Ì\83t\83@\83C\83\8b\82Ì\93à\97e\82Å\82 \82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{10pt}
+\begin{verbatim}
+-Xrs
+-Djava.class.path=C:/temp/sample
+-verbose:jni
+
+SampleJVMService C:/temp/test.txt
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+\88È\89º\81A\82±\82Ì\93à\97e\82ð\82à\82Æ\82É\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82É\8ew\92è\82·\82é\8d\80\96Ú\82É\82Â\82¢\82Ä\90à\96¾\82·\82é\81B
+
+\subsubsection{JavaVM\82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^}
+
+\verb/-/ {\small (\83n\83C\83t\83\93)}\82Å\82Í\82\82Ü\82é\83p\83\89\83\81\81[\83^\82ÍJavaVM\82Ö\91\97\82ç\82ê\82é\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+
+JavaVM\82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Í{\bf jvmservice}\82É\82Æ\82Á\82Ä\81A\94ñ\8fí\82É\8fd\97v\82Å\82 \82é\81B
+
+\88È\89º\82Ì\83p\83\89\83\81\81[\83^\82Í\95K\90{\82Æ\82¢\82Á\82Ä\82æ\82¢\81B
+
+\begin{itemize}
+\item -Xrs
+\item -Djava.class.path=\83N\83\89\83X\83p\83X
+\end{itemize}
+
+\verb/-Xrs/ \82ÍJDK/JRE1.3\82æ\82è\93±\93ü\82³\82ê\82½\83V\83\83\83b\83g\83_\83E\83\93\8aÄ\8e\8b\83X\83\8c\83b\83h\82ð\96³\8cø\82É\82·\82é\82½\82ß\82Ì\83I\83v\83V\83\87\83\93\82Å\82 \82é\81B
+
+\82±\82Ì\83I\83v\83V\83\87\83\93\82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\83\8d\83O\83I\83t\82È\82Ç\82Ì\83A\83N\83V\83\87\83\93\82ð\8c\9f\92m\82·\82é\82ÆJavaVM\82Í\83V\83\83\83b\83g\83_\83E\83\93\82ð\8aJ\8en\82µ\82Ä\82µ\82Ü\82¤\81B
+
+\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Æ\82µ\82Ä\82Í\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\82ÍWindows\82Ì\83T\81[\83r\83X\83}\83l\81[\83W\83\83\82©\82ç\97v\8b\81\82³\82ê\82é\82×\82«\82à\82Ì\82Ì\82½\82ß\81A
+JavaVM\82ª\8f\9f\8eè\82É\83V\83\83\83b\83g\83_\83E\83\93\82³\82¹\82È\82¢\82æ\82¤\82É\81A\verb/-Xrs/ \82ð\96Y\82ê\82¸\82É\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\82È\82¨\81A\verb/-X/ \83I\83v\83V\83\87\83\93\82Í\83x\83\93\83_\81[\8cÅ\97L\82Å\82 \82è\81A\83V\83\83\83b\83g\83_\83E\83\93\8aÄ\8e\8b\83X\83\8c\83b\83h\82àSun Microsystems\88È\8aO\82ÌJavaVM\82Å\82Í\88Ù\82È\82é\89Â\94\\90«\82ª\82 \82é\81B
+
+\vspace{\baselineskip}
+\verb/-Djava.class.path=/ \82Í\83N\83\89\83X\83p\83X\82Ì\8ew\92è\82Å\82 \82é\81B
+
+\8eÀ\8dÛ\82ÉSampleJVMService.class\82ª\94z\92u\82³\82ê\82Ä\82¢\82é\83f\83B\83\8c\83N\83g\83\8a\82ð\8ew\92è\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\verb/-D/ \82Í\83V\83X\83e\83\80\81E\83v\83\8d\83p\83e\83B\82Æ\82µ\82Ä\93o\98^\82·\82é\82±\82Æ\82ð\8ew\8e¦\82µ\82Ä\82¢\82é\81B
+
+\verb/java.exe/ \82©\82ç\8bN\93®\82·\82é\8fê\8d\87\82É\82Í\81A\82±\82ê\82ç\82Ì\83V\83X\83e\83\80\81E\83v\83\8d\83p\83e\83B\82Í\90Ý\92è\8dÏ\82Ý\82É\82È\82Á\82Ä\82¢\82é\82ª\81A
+{\bf jvmservice}\82Å\82Í\81AJNI\82©\82çJavaVM\82ð\8bN\93®\82·\82é\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä\81A\82±\82Ì\82æ\82¤\82É\8ew\8e¦\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\vspace{\baselineskip}
+\82»\82Ì\82Ù\82©\82É\82æ\82­\8eg\82í\82ê\82»\82¤\82È\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä\82Í\81A\88È\89º\82Ì\82æ\82¤\82È\82à\82Ì\82ª\82 \82é\81B
+
+\begin{itemize}
+\item -Xmx\83\81\83\82\83\8a\83T\83C\83Ym
+\item -verbose:[gc/jni]
+\end{itemize}
+
+\82¢\82¸\82ê\82àJavaVM\82Ö\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+
+\vspace{\baselineskip}
+\verb/-Xmx/ \82Íjava.exe\82Ì\8bN\93®\82Å\82à\93é\90õ\82Ý\90[\82¢\82Å\82 \82ë\82¤\81AJavaVM\82ª\8am\95Û\82·\82é\8dÅ\91å\83\81\83\82\83\8a\83T\83C\83Y\82ð\8ew\92è\82·\82é\83p\83\89\83\81\81[\83^\82Å\82 \82é\81B
+
+\91¼\82É\82à\verb/-X/ \82Å\8en\82Ü\82é{\bf java.exe}\82ª\8eó\97\9d\82·\82é\82æ\82¤\82ÈJavaVM\82ð\90§\8cä\82·\82é\83p\83\89\83\81\81[\83^\82Í\81A\96}\82»\8eó\97\9d\82Å\82«\82é\82Æ\8dl\82¦\82Ä\82æ\82¢\81B
+
+\vspace{\baselineskip}
+\verb/-verbose/ \82ÍJavaVM\82©\82ç\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82ð\8fo\97Í\82·\82é\82±\82Æ\82ð\8ew\92è\82·\82é\81B
+
+gc\82Å\82Í\83K\83x\81[\83W\83R\83\8c\83N\83^\82Ì\93®\8dì\81Ajni\82Å\82Í\83l\83C\83e\83B\83u\83\81\83\\83b\83h\82Ì\8cÄ\82Ñ\8fo\82µ\82È\82Ç\82ð\83g\83\8c\81[\83X\82·\82é\82±\82Æ\82ª\82Å\82«\82é\82æ\82¤\82É\82È\82é\81B
+\82Æ\82­\82Éjni\82Å\83g\83\8c\81[\83X\82·\82é\82ÆJavaVM\82ª\83V\83\83\83b\83g\83_\83E\83\93\82·\82é\97l\8eq\82à\8am\94F\82Å\82«\82é\81B
+
+\82½\82¾\82µ\81A{\bf java.exe}\82Ì\8fê\8d\87\82Æ\82Í\88Ù\82È\82è\81A{\bf jvmservice.exe}\82Ì\8fê\8d\87\82Å\82Í\verb/-verbose/ \82É\82æ\82é
+JavaVM\82©\82ç\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82Í\81A\83T\81[\83r\83X\93o\98^\8e\9e\82É\8ew\92è\82µ\82½\83\8d\83O\83t\83@\83C\83\8b\82Ö\82Æ\8f\91\82«\8d\9e\82Ü\82ê\82é\81B
+\83\8d\83O\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82È\82¢\8fê\8d\87\82Í\verb/-verbose/ \82ð\8ew\92è\82µ\82Ä\82à\8eÀ\8dÛ\82É\82Í\89½\8f\88\82É\82à\8fo\97Í\82³\82ê\82È\82¢\82±\82Æ\82É\82È\82é\81B
+
+\vspace{\baselineskip}
+
+\verb/-verbose/ \82ð\8ew\92è\82¹\82¸\81A\83\8d\83O\83t\83@\83C\83\8b\82¾\82¯\82ð\8ew\92è\82µ\82½\8fê\8d\87\82ÍJavaVM\82©\82ç\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82Í\8fo\97Í\82³\82ê\82È\82¢\82ª\81A
+{\bf jvmservice.exe}\82©\82ç\82Ì\83\81\83b\83Z\81[\83W\82Í\8bL\98^\82³\82ê\82é\81B
+
+\vspace{\baselineskip}
+
+{\bf jvmservice}\82Ì\93®\82«\97\9d\89ð\82Å\82«\82é\82æ\82¤\82É\82È\82é\82Ü\82Å\82Í\81A\82Æ\82è\82 \82¦\82¸\81A\83\8d\83O\83t\83@\83C\83\8b\82ð\8ew\92è\82µ\82Ä\83T\81[\83r\83X\82ð\93o\98^\82µ\81A
+JavaVM\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82Æ\82µ\82Ä\underbar{-verbose:jni} \82ð\8ew\92è\82µJavaVM\82©\82ç\82Ì\83\8d\83O\82ð\8c©\82é\82±\82Æ\82ð\90\84\8f§\82·\82é\81B
+
+
+\subsubsection{\8eÀ\8ds\82·\82é\83N\83\89\83X\82Ì\8ew\92è}
+
+\8eÀ\8ds\82·\82é\83N\83\89\83X\82Ì\8ew\92è\82Í\81A\88È\89º\82Ì\82æ\82¤\82È\8f\91\8e®\82Å\8ew\92è\82·\82é\81B
+
+\8eÀ\8ds\82·\82é\83N\83\89\83X\82Í\95¡\90\94\82 \82Á\82Ä\82à\82æ\82­\81A\82Ü\82½\95À\97ñ\8eÀ\8ds\82Ì\97L\96³\82ð\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{12pt}
+\begin{verbatim}
+
+[&]\83N\83\89\83X\82Ì\8a®\91S\8fC\8fü\96¼[#\83N\83\89\83X\83\81\83\\83b\83h\96¼] [ \88ø\90\941 [\88ø\90\942 [...] ] ]
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+
+\vspace{\baselineskip}
+
+\82»\82ê\82¼\82ê\82Ì\88Ó\96¡\82Í\88È\89º\82Ì\82Æ\82¨\82è\82Å\82 \82é\81B
+
+\begin{itemize}
+\item \verb/&/ \82Í\83t\83H\81[\83N(\95À\97ñ\8eÀ\8ds)\82Ì\97L\96³
+\item \83N\83\89\83X\96¼\82Í\83p\83b\83P\81[\83W\96¼\82©\82ç\82Í\82\82Ü\82é\8a®\91S\82È\96¼\91O
+\item \95\8e\9a\97ñ\94z\97ñ\82ð1\82Â\8eó\97\9d\82·\82éstatic\83\81\83\\83b\83h\82Ì\96¼\91O
+\item \95\8e\9a\97ñ\88ø\90\94(\95¡\90\94\89Â)
+\end{itemize}
+
+\83N\83\89\83X\96¼\82Í\83p\83b\83P\81[\83W\96¼\82©\82ç\82Í\82\82Ü\82é\8a®\91S\82È\96¼\91O\82Å\82È\82­\82Ä\82Í\82È\82ç\82È\82¢\81B
+
+\82Ü\82½\81A\93\96\91R\82Ì\82±\82Æ\82È\82ç\82ª\82ç\83N\83\89\83X\83p\83X\8fã\82É\91\8dÝ\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+
+\83N\83\89\83X\96¼\82É\82Í\verb/#/ {\small(\83V\83\83\81[\83v)} \82Å\8en\82Ü\82é\81A\83\81\83\\83b\83h\96¼\82ð\8ew\92è\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B
+
+\83\81\83\\83b\83h\96¼\82ð\8fÈ\97ª\82µ\82½\8fê\8d\87\82Í\81u{\bf main}\81v\82ª\8ew\92è\82³\82ê\82½\82à\82Ì\82Æ\82Ý\82È\82³\82ê\82é\81B
+
+\83\81\83\\83b\83h\82Í\83N\83\89\83X\82Å\92è\8b`\82³\82ê\82Ä\82¢\82épublic\8a\8e\82Âstatic\82È\83\81\83\\83b\83h\82Å\82 \82è\81A1\82Â\82Ì\95\8e\9a\97ñ\94z\97ñ\82ð\8eó\82¯\8eæ\82è\81A\96ß\82è\92l\82ð\95Ô\82³\82È\82¢
+\83\81\83\\83b\83h\82Å\82 \82é\95K\97v\82ª\82 \82é\81B
+
+\82Â\82Ü\82è\81A\88È\89º\82Ì\83V\83O\83l\83`\83\83\82ð\82à\82Â\82Ä\82¢\82é\95K\97v\82ª\82 \82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{12pt}
+\begin{verbatim}
+
+public static void \83\81\83\\83b\83h\96¼( String[] args ) throws Throwable {}
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+\83\81\83\\83b\83h\82Í\97á\8aO\82ð\95Ô\82µ\82Ä\82à\97Ç\82¢\81B
+
+\97á\8aO\82ª\95Ô\82³\82ê\82½\8fê\8d\87\82Í\81A\82»\82Ì\83\81\83\\83b\83h\82ª\83t\83H\81[\83N\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\92P\82É\83\8d\83O\82É\8bL\98^\82³\82ê\82é\81B
+
+\83t\83H\81[\83N\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82É\97á\8aO\82ª\95Ô\82³\82ê\82½\8fê\8d\87\81A\88È\8d~\82Ì\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8bN\93®\82Í\92\86\8e~\82³\82ê\82é\81B
+
+\82¢\82¸\82ê\82Ì\8fê\8d\87\82à\8eÀ\8ds\92\86\82Ì\83\86\81[\83U\83X\83\8c\83b\83h\82ª\82È\82­\82È\82é\82Æ{\bf jvmservice}\82Í\83T\81[\83r\83X\83v\83\8d\83Z\83X\82ð\8fI\97¹\82·\82é\81B
+
+
+\vspace{\baselineskip}
+\verb/&/ {\small (\83A\83\93\83p\83T\83\93\83h)} \82Í\8ew\92è\82³\82ê\82½\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82ð\91Ò\8b@\82µ\82È\82¢\82±\82Æ\82ð\8e¦\82·\81B
+\footnote{\8ew\92è\82·\82é\8fê\8f\8a\82Í\8ds\93ª\82Å\82 \82è\81A\underbar{\8ds\96\96\82Å\82Í\82È\82¢}\82±\82Æ\82É\92\8d\88Ó\82·\82é\82±\82Æ\81B}
+
+\82à\82µ\81A\verb/&/ {\small (\83A\83\93\83p\83T\83\93\83h)} \82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\8fê\8d\87\81A\82»\82Ì\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82Ì\82½\82ß\82Ì\83X\83\8c\83b\83h\82ª\8dì\82ç\82ê
+\83\81\83\\83b\83h\82ª\8eÀ\8ds\82³\82ê\82½\82 \82Æ\81A\82»\82Ì\8a®\97¹\82ð\91Ò\82½\82¸\82É\8e\9f\82Ì\83N\83\89\83X\82Ì\8bN\93®\82ª\8ds\82í\82ê\82é\81B
+
+\82±\82Ì\verb/&/ {\small (\83A\83\93\83p\83T\83\93\83h)} \82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\8ew\92è\82³\82ê\82½\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82ª\8a®\97¹\82·\82é\82Ì\82ð\91Ò\82Á\82Ä\81A
+\8e\9f\82Ì\83N\83\89\83X\82Ì\8bN\93®\82ð\8ds\82¤\81B
+\82½\82¾\82µ\81Ajvmservice\82Í\81A\verb/&/ {\small (\83A\83\93\83p\83T\83\93\83h)}\82Ì\97L\96³\82É\82©\82©\82í\82è\82È\82­\81A
+\83N\83\89\83X\83\81\83\\83b\83h\82Ì\8eÀ\8ds\82É\82Í\81A\95K\82¸1\82Â\82Ì\93Æ\97§\82µ\82½\83X\83\8c\83b\83h\82ð\8dì\90¬\82µ\8eÀ\8ds\82³\82ê\82é\81B
+\82Â\82Ü\82è\81A\verb/&/ {\small (\83A\83\93\83p\83T\83\93\83h)} \8ew\92è\96³\82µ\82É\82æ\82é\82Å\82Í\8bN\93®\82µ\82½\83X\83\8c\83b\83h\82Ì\8a®\97¹\82ð\82½\82¾\82¿\82Éjoin\82·\82é\8c`\82Æ\82È\82é\81B
+
+\vspace{\baselineskip}
+\83N\83\89\83X\83\81\83\\83b\83h\82É\82Í0\8cÂ\88È\8fã\82Ì\95\8e\9a\97ñ\82©\82ç\82È\82é\95\8e\9a\97ñ\94z\97ñ\82ª\93n\82³\82ê\82é\81B
+
+\88ø\90\94\82Í\81A\82»\82ê\82¼\82ê\8bó\94\92\82Å\8bæ\90Ø\82ç\82ê\82é\81B
+
+\88ø\90\94\82Ì\92\86\82É\8bó\94\92\82ð\8aÜ\82Þ\8fê\8d\87\82Í\81A\88ø\90\94\82Ì\91O\8cã\82ð\verb/"/ {\small (\83_\83u\83\8b\83N\83H\81[\83e\81[\83V\83\87\83\93)} \82Å\88Í\82Þ\81B
+\83_\83u\83\8b\83N\83H\81[\83e\81[\83V\83\87\83\93\8e©\90g\82ð\8aÜ\82ß\82½\82¢\8fê\8d\87\82Í\81A\83_\83u\83\8b\83N\83H\81[\83e\81[\83V\83\87\83\93\82Å\88Í\82Ü\82ê\82½\92\86\82Å\81A\verb/""/ \82Ì\82æ\82¤\82É\82»\82ê\82ð2\82Â\8fd\82Ë\82é\81B
+
+\newpage
+\subsection{\83T\81[\83r\83X\82Ì\93o\98^}
+
+{\bf jvmservice.exe}\82Ì\83R\83}\83\93\83h\8f\91\8e®\82Æ\81A{\bf \8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}\82Ì\90à\96¾\82ª\8fI\82í\82Á\82½\82Ì\82Å\81A\82æ\82¤\82â\82­\83T\81[\83r\83X\82ð\93o\98^\82·\82é\8f\80\94õ\82ª\82Å\82«\82½\81B
+
+\82±\82±\82Å\82Í\91O\8fq\82Ì\97á\82Ì\82Æ\82¨\82è\81A\verb#C:/temp/sample/# \83t\83H\83\8b\83_\8fã\82É\verb/SampleJVMService.class/ \82ª\82 \82é\82à\82Ì\82Æ\82µ\81A
+\83e\83X\83g\97p\83T\81[\83r\83X\81u{\bf jvmserv1}\81v\82ð\93o\98^\82·\82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{alltt}
+\small \setlength{\baselineskip}{12pt}
+\underbar{jvmservice.exe --regist jvmserv1}
+    \underbar{--config C:/temp/sample/SampleJVMService.conf}
+    \underbar{--log C:/temp/sample/SampleJVMService.log}
+    \underbar{--dependencies Eventlog \return}
+\end{alltt} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+\verb/--dependencies/ \82Æ\82µ\82Ä\verb/Eventlog/ \82ª\8ew\92è\82³\82ê\82Ä\82¢\82é\81B
+
+jvmservice.exe\82Í\83X\83\8c\83b\83h\82Å\94­\90\82µ\82½\97á\8aO\82È\82Ç\82ð\83C\83x\83\93\83g\83\8d\83O\82É\82à\8bL\98^\82·\82é\81B
+\82µ\82½\82ª\82Á\82Ä\81Ajvmservice.exe\82ÍEventlog\83T\81[\83r\83X\82É\88Ë\91\82µ\82Ä\82¢\82é\81A\82Æ\82¢\82¦\82é\81B
+
+\82±\82Ì\8ew\92è\82ª\83f\83t\83H\83\8b\83g\82Å\82Í\82È\82¢\82Ì\82Í\81u{\texttt{\bf Eventlog}}\81v\82Æ\82¢\82¤\96¼\91O\82ª\89Ê\82½\82µ\82Ä\8fí\82É\93¯\82\82Å\82 \82é\82Ì\82©\95s\96¾\82Å\82 \82é\82Æ\82¢\82¤\82±\82Æ\82Æ\81A
+Eventlog\83T\81[\83r\83X\82É\88Ë\91\82·\82é\95Ê\82Ì\83T\81[\83r\83X\82É\88Ë\91\82·\82é\8fê\8d\87\82ª\82 \82è\82¤\82é\82½\82ß\82Å\82 \82é\81B
+
+\95K\97v\82Å\82 \82ê\82Î\91¼\82Ì\83T\81[\83r\83X\82ð\92Ç\89Á\82·\82é\81B\83T\81[\83r\83X\96¼\82Í\83T\81[\83r\83X\81E\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82ð\8aJ\82­\82Æ\8am\94F\82Å\82«\82é\81B
+\96¼\91O\82Ì\91å\95\8e\9a\8f¬\95\8e\9a\82Í\8bæ\95Ê\82³\82ê\82È\82¢\82Ì\82Å\81A\verb/EventLog/ \82Æ\verb/eventlog/ \82Í\93¯\82\82±\82Æ\82Å\82 \82é\81B
+
+\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\81A\88Ë\91\8aÖ\8cW\82È\82Ç\82ð\95Ï\8dX\82µ\82½\82¢\8fê\8d\87\82Í\81A\8dÄ\93x\93o\98^\82ð\8eÀ\8ds\82·\82é\81B
+\82·\82Å\82É\93¯\82\96¼\91O\82Ì\83T\81[\83r\83X\82ª\82 \82è\81A\82»\82Ì\8eÀ\8ds\83t\83@\83C\83\8b\82ª\93o\98^\82ð\97v\8b\81\82µ\82½jvmservice.exe\82Æ\93¯\82\83p\83X\82Å\82 \82ê\82Î\81A\82»\82Ì\83T\81[\83r\83X\82É\91Î\82·\82é\8dX\90V\82Æ\82È\82é\81B
+
+\vspace{\baselineskip}
+\82¤\82Ü\82­\93o\98^\82³\82ê\82é\82Æ\81A\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\81u\83T\81[\83r\83X\81v\82Å\81A\90V\82µ\82­\81u{\bf JavaVMService(jvmserv1)}\81v\82Æ\82¢\82¤\83T\81[\83r\83X\96¼\82ª\92Ç\89Á\82³\82ê\82Ä\82¢\82é\82Í\82¸\82Å\82 \82é\81B
+\83T\81[\83r\83X\96¼\82Í\81ujvmserv1\81v\82Å\82 \82é\82ª\81A\95\\8e¦\96¼\82Æ\82µ\82Ä\82Í\95K\82¸\81uJavaVMService(\83T\81[\83r\83X\96¼)\81v\82Æ\82¢\82¤\8c`\8e®\82Å\95\\8e¦\82³\82ê\82é\81B
+
+jvmservice.exe\82Í\88Ù\82È\82é\81u\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\81v\82É\83T\81[\83r\83X\96¼\82ð\82Â\82¯\82Ä\95¡\90\94\8cÂ\82Ì\83T\81[\83r\83X\82ð\93o\98^\89Â\94\\82Å\82 \82é\81B
+
+\83T\81[\83r\83X\82Ì\93o\98^\92¼\8cã\81A\83T\81[\83r\83X\82Ì\8bN\93®\95û\96@\82Í\81u\8eè\93®\81v\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\81B
+
+\82½\82¾\82µ\81A\82Ü\82¾\81u\8aJ\8en\81v\83{\83^\83\93\82ð\82¨\82µ\82Ä\82Í\82¢\82¯\82È\82¢\81B
+
+\8bN\93®\82·\82×\82«JavaVM\82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\82½\82ß\81A\82¨\82»\82ç\82­\81A\8bN\93®\82É\8e¸\94s\82·\82é\82Í\82¸\82Å\82 \82é\81B
+\footnote{\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94PATH\82Éjvm.dll\82Ö\82Ì\83p\83X\82ª\92Ê\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\8bN\93®\82·\82é\81B}
+
+\newpage
+\subsection{\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\95Ò\8fW}
+
+{\texttt {\bf jvmservice.exe}}\82Æ\93¯\82\83f\83B\83\8c\83N\83g\83\8a\8fã\82É{\texttt{\bf jvmservice.preload}}\82Æ\82¢\82¤\83t\83@\83C\83\8b\82ª\82 \82é\81B
+
+\82±\82Ì\83t\83@\83C\83\8b\82Íjvmservice.exe\82ª\83T\81[\83r\83X\82Æ\82µ\82Ä\8bN\93®\82³\82ê\82é\82Æ\82«\93Ç\82Ý\8d\9e\82Ü\82ê\82é\83_\83C\83i\83~\83b\83N\83\8a\83\93\83N\83\89\83C\83u\83\89\83\8a(DLL)\82ð\8ew\92è\82µ\82Ä\82¢\82é\81B
+
+\subsubsection{\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Ì\8d\\91¢}
+
+\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Í\81A\95K\82¸\81A\underbar{\8bN\93®\82³\82ê\82½{\bf jvmservice.exe}\82Ì\8ag\92£\8eq}\82ð\underbar{{\bf *.preload}\82É\95Ï\8dX\82µ\82½\83t\83@\83C\83\8b\96¼}\82Æ\82È\82Á\82Ä\82¢\82é\81B
+\82Â\82Ü\82è\81Ajvmservice.exe\82É\91Î\82µ\82Ä\8fí\82É1\82Â\82Ì\8aÖ\8cW\82Å\82 \82é\81B
+
+\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82Í\92P\8f\83\82È\83e\83L\83X\83g\83t\83@\83C\83\8b\82Å\82 \82è\81A\8bó\8ds\82¨\82æ\82Ñ\8dÅ\8f\89\82Ì\95\8e\9a\82ª\verb/#/{\small(\83V\83\83\81[\83v)} \82Å\82Í\82\82Ü\82é\8ds\82ð\83R\83\81\83\93\83g\8ds\82Æ\82µ\81A
+\82»\82ê\88È\8aO\82Ì\8ds\82Í\81A\82·\82×\82ÄDLL\83t\83@\83C\83\8b\82Ö\82Ì\83t\83\8b\83p\83X\82ª\8f\91\82©\82ê\82Ä\82¢\82é\82à\82Ì\82Æ\82·\82é\81B
+
+\82µ\82½\82ª\82Á\82Ä\81A\95¡\90\94\8cÂ\82ÌDLL\82ð\93Ç\82Ý\8d\9e\82Ý\82±\82Æ\82ª\89Â\94\\82Å\82 \82é\81B
+
+\92è\8b`\82·\82é\8f\87\94Ô\82Í\88Ë\91\93x\82Ì\82à\82Á\82Æ\82à\96\96\92[\footnote{\82Â\82Ü\82èWindows\82ÌKernel32.dll\82È\82Ç\82Ì\95W\8f\80DLL\82¾\82¯\82É\88Ë\91\82·\82éDLL}\82ÌDLL\82©\82ç\8f\87\82É\8ew\92è\82µ\81A
+\82±\82Ì\8f\87\94Ô\82ÅDLL\82Ì\83\8d\81[\83h\82ª\8ds\82í\82ê\82é\81B
+
+\83t\83@\83C\83\8b\82Ö\82Ì\83p\83X\82Í\81A\82Ü\82¸\verb/%\81`%/ \82Å\88Í\82Ü\82ê\82½\95\8e\9a\97ñ\82ð\8aÂ\8b«\95Ï\90\94\96¼\82Æ\82µ\82Ä\8aÂ\8b«\95Ï\90\94\93W\8aJ
+\footnote{\8cJ\82è\95Ô\82µ\82É\82È\82é\82ª\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82É\82¨\82¯\82é\8aÂ\8b«\95Ï\90\94\82Í\83V\83X\83e\83\80\8aÂ\8b«\95Ï\90\94\82Æ\8dl\82¦\82Ä\82æ\82¢\81B
+\8aÂ\8b«\95Ï\90\94\82ª\91\8dÝ\82µ\82È\82¢\8fê\8d\87\82Í\95Ï\8a·\82³\82ê\82¸\82É\8ec\82³\82ê\82é\81B}
+\82ª\8ds\82í\82ê\82Ä\82©\82ç{\texttt LoadLibrary API}\82É\82æ\82Á\82Ä\93Ç\82Ý\8d\9e\82Ü\82ê\82é\81B
+
+\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82·\82é\82Æ\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\8bN\93®\82¹\82¸\82É\88Ù\8fí\8fI\97¹\82·\82é\81B
+
+\subsubsection{jvm.dll\82Ì\8ew\92è}
+
+jvmservice.exe\82ÍJNI\82É\82æ\82èJavaVM\82ð\8bN\93®\82·\82é\8dÛ\82É\81A\81u{\texttt{\bf jvm.dll}}\81v\82Æ\82¢\82¤\83_\83C\83i\83~\83b\83N\83\8a\83\93\83N\83\89\83C\83u\83\89\83\8a\82Ì\83\8d\81[\83h\82ð\97v\8b\81\82·\82é\81B
+
+\82±\82Ì{\texttt{\bf jvm.dll}}\82±\82»\82ªJavaVM\82Ì\96{\91Ì\82Å\82 \82é\81B
+
+\82à\82µ\81A\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\92\86\82Éjvm.dll\82Ö\82Ì\83p\83X\82ª\8ew\92è\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81Ajvmservice.exe\82Í\83f\83t\83H\83\8b\83g\82Ì\83\89\83C\83u\83\89\83\8a\8c\9f\8dõ\83p\83X\footnote{\8aÈ\92P\82É\82¢\82¦\82Î\8aÂ\8b«\95Ï\90\94PATH\82Ì\8co\98H\82Å\92T\82·\81B}\82ð\97p\82¢\82Ä
+\81u{\texttt{\bf jvm.dll}}\81v\82ð\83\8d\81[\83h\82µ\82æ\82¤\82Æ\82·\82é\81B
+
+\82»\82Ì\8c\8b\89Ê\81Ajvm.dll\82ª\83\8d\81[\83h\82Å\82«\82È\82¯\82ê\82Î\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\88Ù\8fí\8fI\97¹\82·\82é\81B
+
+\82µ\82©\82µ\81A\92Ê\8fí\81A\82±\82Ì{\texttt{\bf jvm.dll}}\82Í\8aÂ\8b«\95Ï\90\94PATH\82É\92Ê\82³\82ê\82Ä\82¨\82ç\82¸\81A\82Ü\82½\92Ê\82·\82×\82«\82à\82Ì\82Å\82à\82È\82¢\81B
+
+\82½\82Æ\82¦\82Î\81A1\82Â\82Ì\83o\81[\83W\83\87\83\93\82ÌJRE\82Å\82à\81AJRE1.4.2\_08 \82ð\97á\82É\82·\82ê\82Î\88È\89º\82Ì2\82Â\82ÌJavaVM(jvm.dll)\82ª\97p\88Ó\82³\82ê\82Ä\82¢\82é\81B
+
+\begin{itemize}
+\item \verb#%JAVA_HOME%#/jre/bin/client/jvm.dll
+\item \verb#%JAVA_HOME%#/jre/bin/server/jvm.dll
+\end{itemize}
+
+\82»\82±\82Å\81Ajvmservice.exe\82Å\82à\81A\83\8d\81[\83h\82·\82×\82«jvm.dll\82ð\8ew\92è\82·\82é\82½\82ß\82É\81u\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\81v\82É\81A\83\8d\81[\83h\82·\82×\82«jvm.dll\82Ö\82Ì\83t\83\8b\83p\83X\82ð\8bL\8fq\82·\82é\95K\97v\82ª\82 \82é\81B
+
+\88È\89º\82Í\81A\verb#C:/j2sdk1.4.2_08/# \82ÉJDK1.4.2\_08 \82ª\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82Æ\89¼\92è\82µ\82½\8fê\8d\87\82Ì\81u\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\81v\82Ì\97á\82Å\82 \82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{verbatim}
+
+C:\j2sdk1.4.2_08\jre\bin\server\jvm.dll
+#C:\jdk1.3.1_15\jre\bin\hotspot\jvm.dll
+#C:\jdk1.5.0_02\jre\bin\client\jvm.dll
+\end{verbatim} \\
+\hline
+\end{tabular}
+\vspace{\baselineskip}
+
+\82±\82Ì\97á\82Å\82Í\81A\82¢\82­\82Â\82©\82ÌJRE\82Ì\83o\81[\83W\83\87\83\93\82ÌDLL\82ª\82©\82©\82ê\82Ä\82¢\82é\82ª\83R\83\81\83\93\83g\83A\83E\83g\82³\82ê\82Ä\82¨\82è\81A
+\8eÀ\8dÛ\82É\83\8d\81[\83h\82·\82é\82æ\82¤\82É\8ew\92è\82³\82ê\82Ä\82¢\82é\82Ì\82Í\81Aj2sdk1.4.2\_08 \82Ìserver\83o\81[\83W\83\87\83\93\82Ìjvm.dll\82Å\82 \82é\81B
+
+\subsubsection{\88Ù\82È\82é\83o\81[\83W\83\87\83\93\82ÌJavaVM\82Ì\8ew\92è}
+
+\81u{\bf \83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b({\texttt jvmservice.preload})}\81v\82Í1\82Â\82µ\82©\91\8dÝ\82µ\82È\82¢\82½\82ß\81A
+\88Ù\82È\82é\83o\81[\83W\83\87\83\93\82ÌJavaVM\82ð\8ew\92è\82·\82é\82±\82Æ\82Í\82Å\82«\82È\82¢\81B
+
+\82à\82µ\95K\97v\82Å\82 \82ê\82Îjvmservice.exe\82Ì\83t\83@\83C\83\8b\96¼\82ð\95Ï\8dX\82·\82é\82±\82Æ\82Å\90Ø\82è\95ª\82¯\82é\82±\82Æ\82Í\89Â\94\\82Å\82 \82é\81B
+
+\82½\82Æ\82¦\82Î\81u{\texttt {\bf jvmservice\_jre131.exe}}\81v\82Ì\82æ\82¤\82É\83\8a\83l\81[\83\80\82·\82ê\82Î\81A\82»\82ê\82É\91Î\89\9e\82·\82é\81u{\texttt {\bf jvmservice\_jre131.preload}}\81v
+\82Æ\82¢\82¤\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82ª\8eg\82í\82ê\82é\82æ\82¤\82É\82È\82é\81B\footnote{\83\8a\83l\81[\83\80\82·\82é\82±\82Æ\82ª\8fd\97v\82Å\82 \82é\81B\88Ù\82È\82é\83t\83H\83\8b\83_\82É\83R\83s\81[\82·\82é\82¾\82¯\82Å\82Í\95s\8f\\95ª\82Å\82 \82é\81B}
+
+
+\newpage
+\subsection{\83T\81[\83r\83X\82Ì\8eÀ\8ds}
+
+\83T\81[\83r\83X\82ª\93o\98^\82³\82ê\81A\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b\82à\90Ý\92è\82µ\82½\82ç\81A\83R\83\93\83g\83\8d\81[\83\8b\83p\83l\83\8b\82Ì\83T\81[\83r\83X\82©\82ç\93o\98^\82µ\82½\83T\81[\83r\83X\82ð\91I\91ð\82µ\81A
+\81u\8aJ\8en\81v\83{\83^\83\93\82ð\89\9f\82µ\82Ä\83T\81[\83r\83X\82ª\8bN\93®\82·\82é\82±\82Æ\82ð\8e\8e\82·\82±\82Æ\82ª\82Å\82«\82é\81B
+
+\subsubsection{\83T\81[\83r\83X\82Ì\8aJ\8en}
+
+
+\81u\8aJ\8en\81v\83{\83^\83\93\82ð\89\9f\82·\82Æ\81Ajvmservice.exe\82Ì\8bN\93®\82ª\8aJ\8en\82³\82ê\82é\81B
+\83G\83\89\81[\83_\83C\83A\83\8d\83O\82ª\8fo\82¸\82É\81u\8aJ\8en\81v\83{\83^\83\93\82ª\91I\91ð\95s\89Â\94\\82É\82È\82è\81u\92â\8e~\81v\83{\83^\83\93\82ª\91I\91ð\89Â\94\\82É\82È\82ê\82Î\81A\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\8eÀ\8ds\92\86\82Æ\82È\82Á\82Ä\82¢\82é\81B
+
+\90³\82µ\82­\93®\8dì\82µ\82Ä\82¢\82é\82©\94»\92f\82·\82é\82½\82ß\82É\81A\82³\82«\82Ù\82Ç\82Ìjava.exe\82Å\82Ì\83e\83X\83g\82Å\8ds\82Á\82½\82æ\82¤\82É\81A{\texttt C:/temp/test.txt}\83t\83@\83C\83\8b\82É\90\94\8e\9a\82ª\8f\91\82«\8d\9e\82Ü\82ê\82Â\82Ã\82¯\82Ä\82¢\82é\82©
+\8am\94F\82·\82é\81B
+
+\82Ü\82½\81A{\texttt C:/temp/sample/SampleJVMService.log}\83t\83@\83C\83\8b\82É\83\8d\83O\82ð\8fo\97Í\82·\82é\82æ\82¤\82É\8ew\92è\82µ\82Ä\82¢\82é\82½\82ß\81A\82±\82±\82ÉJavaVM\82©\82ç\82ÌJNI\8aÖ\98A\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82ª
+\8fo\97Í\82³\82ê\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F\82Å\82«\82é\81B
+
+
+\subsubsection{\83T\81[\83r\83X\82Ì\8fI\97¹}
+
+\81u\92â\8e~\81v\83{\83^\83\93\82ð\89\9f\82·\82Æ\81A\82µ\82Î\82ç\82­\82µ\82Ä\81u\92â\8e~\81v\83{\83^\83\93\82ª\91I\91ð\95s\89Â\94\\82É\82È\82è\81u\8aJ\8en\81v\83{\83^\83\93\82ª\91I\91ð\89Â\94\\82È\8fó\91Ô\82É\82È\82é\81B
+\82±\82Ì\8fó\91Ô\82Å\82 \82ê\82Î\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\8aù\82É\92â\8e~\82µ\82Ä\82¢\82é\81B
+
+\82½\82¾\82µ\82­\92â\8e~\82³\82ê\82½\82±\82Æ\82ð\8am\94F\82·\82é\82½\82ß\82É{\texttt C:/temp/test.txt}\83t\83@\83C\83\8b\82ð\8am\94F\82·\82é\81B
+
+\83t\83@\83C\83\8b\82Ì\96\96\94ö\82É\81u\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹\81v\82Æ\82 \82ê\82Î\81A\90³\82µ\82­\83V\83\83\83b\83g\83_\83E\83\93\82³\82ê\82Ä\82¢\82é\82±\82Æ\82ª\82í\82©\82é\81B
+
+\93¯\97l\82É{\texttt C:/temp/sample/SampleJVMService.log}\83t\83@\83C\83\8b\82ð\8am\94F\82µ\81A\8dÅ\8fI\8ds\82É\81u\83G\83\93\83h\83}\81[\83N\81v\82ª\82Â\82¯\82ç\82ê\82Ä\82¢\82ê\82Î\81Ajvmservice.exe\8e©\90g\82à
+\90³\8fí\82È\83\8b\81[\83g\82Åexit\82µ\82½\82±\82Æ\82ª\82í\82©\82é\81B
+
+
+\subsubsection{\83\8d\83O\83I\83t\82Æ\83V\83\83\83b\83g\83_\83E\83\93\82Ì\83e\83X\83g}
+
+\83T\81[\83r\83X\83v\83\8d\83Z\83X\82Í\83\8d\83O\83I\83t\82µ\82Ä\82à\8fI\97¹\82µ\82È\82¢\82ª\81AJavaVM\82Å\82Í\verb/-Xrs/ \83I\83v\83V\83\87\83\93\82ð\8ew\92è\82µ\82È\82¢\8fê\8d\87\82Í\83\8d\83O\83I\83t\82ð\8c\9f\92m\82µ\82Ä\8e©\93®\93I\82É\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ä\82µ\82Ü\82¤\81B
+
+\82»\82¤\82È\82ç\82È\82¢\82±\82Æ\82ð\8am\94F\82·\82é\82½\82ß\82É\83T\81[\83r\83X\82ð\8aJ\8en\82µ\82½\82 \82Æ\81A\83\8d\83O\83I\83t\82µ\82Ä\82Ý\82é\82Æ\97Ç\82¢\81B
+
+\8dÄ\93x\83\8d\83O\83I\83\93\82µ\82Ä\83T\81[\83r\83X\82ª\8cp\91±\92\86\82Å{\texttt C:/temp/test.txt}\83t\83@\83C\83\8b\82É\96Ù\81X\82Æ\90\94\92l\82ð\8f\91\82«\8d\9e\82ñ\82Å\82¢\82é\82Ì\82Å\82 \82ê\82Î\96â\91è\82È\82¢\81B
+
+\82Â\82¬\82É\81A\83T\81[\83r\83X\82ª\93®\8dì\82µ\82½\82Ü\82Ü\83V\83\83\83b\83g\83_\83E\83\93\82µ\82Ä\82Ý\82é\81B
+
+\8dÄ\8bN\93®\8cã\82É\83\8d\83O\83t\83@\83C\83\8b\82ð\92²\82×\82Ä\90³\8fí\82É\8fI\97¹\82µ\82Ä\82¢\82é\82±\82Æ\82ð\8am\94F\82·\82é\81B
+\footnote{\83C\83x\83\93\83g\83\8d\83O\82É\82Í\8fI\97¹\82Ì\83C\83x\83\93\83g\82ª\8f\91\82«\8d\9e\82Ü\82ê\82È\82¢\81B\82±\82ê\82Í\83C\83x\83\93\83g\83\8d\83O\82ª\90æ\82É\95Â\82\82ç\82ê\82Ä\82µ\82Ü\82¤\82½\82ß\82Å\82 \82é\81B
+\90³\82µ\82­\8fI\97¹\82µ\82½\82©\82Ç\82¤\82©\82Í\83\8d\83O\83t\83@\83C\83\8b\82©\82ç\8am\94F\82·\82é\95K\97v\82ª\82 \82é\81B}
+
+\newpage
+\subsection{\83A\83\93\83C\83\93\83X\83g\81[\83\8b}
+
+\93o\98^\82µ\82½\83T\81[\83r\83X\82ð\89ð\8f\9c\82·\82é\95û\96@\81A\82¨\82æ\82Ñ\81Ajvmservice.exe\82ð\8dí\8f\9c\82·\82é\95û\96@\82É\82Â\82¢\82Ä\90à\96¾\82·\82é\81B
+
+\subsubsection{\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c}
+\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c\82Í\81Ajvmservice.exe\82ð\verb/--unregist/ \83I\83v\83V\83\87\83\93\82ð\8ew\92è\82µ\82Ä\8bN\93®\82·\82é\82±\82Æ\82Å\8ds\82¤\81B
+\93\96\91R\81A\83T\81[\83r\83X\82Í\82 \82ç\82©\82\82ß\92â\8e~\82µ\82Ä\82¨\82©\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+
+\83R\83}\83\93\83h\83\89\83C\83\93\82É\82Í\88È\89º\82Ì\82æ\82¤\82È\8c`\8e®\82Å\8ew\92è\82·\82é\81B
+
+\vspace{\baselineskip}
+\noindent
+\begin{tabular}{|m{38zw}|}
+\hline
+\begin{quote}
+\small
+\setlength{\baselineskip}{12pt}
+\begin{verbatim}
+
+jvmservice.exe --unregist \83T\81[\83r\83X\96¼
+\end{verbatim}
+\end{quote} \\
+\hline
+\end{tabular}
+
+\vspace{\baselineskip}
+
+\89½\82à\83G\83\89\81[\83_\83C\83A\83\8d\83O\82ª\82Å\82È\82¯\82ê\82Î\81A\8ew\92è\82µ\82½\83T\81[\83r\83X\82ª\93o\98^\89ð\8f\9c\82³\82ê\82Ä\82¢\82é\81B
+
+\82½\82¾\82µ\81A\93o\98^\89ð\8f\9c\82Í\8dí\8f\9c\97\\96ñ\82Å\82 \82è\81A\8eÀ\8dÛ\82É\83T\81[\83r\83X\82Ì\93o\98^\82ª\83\8c\83W\83X\83g\83\8a\82©\82ç\8dí\8f\9c\82³\82ê\82é\82Ì\82Í\8e\9f\89ñ\82Ì\8dÄ\8bN\93®\8cã\82Å\82 \82é\81B
+
+\8dí\8f\9c\97\\96ñ\82µ\82½\82 \82Æ\82Å\93¯\82\83T\81[\83r\83X\96¼\82Å\83T\81[\83r\83X\82ð\93o\98^\82µ\82æ\82¤\82Æ\82·\82é\82Æ\92Ê\8fí\82Í\83G\83\89\81[\82Æ\82È\82é\81B
+\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b\82â\83\8d\83O\83t\83@\83C\83\8b\82È\82Ç\82Ì\90Ý\92è\93à\97e\82ð\95Ï\82¦\82½\82¢\8fê\8d\87\82Í\81A\8dí\8f\9c\82¹\82¸\82É\93o\98^\82ð\8dÄ\8eÀ\8ds\82·\82é\82±\82Æ\82Å\8ds\82¤\81B
+
+\8dÄ\93o\98^\82¨\82æ\82Ñ\93o\98^\89ð\8f\9c\82·\82é\82½\82ß\82É\82Í\81A\83T\81[\83r\83X\82ð\93o\98^\82µ\82½\82Æ\82«\82Ìjvmservice.exe\82Ì\83t\83\8b\83p\83X\82Æ\8c»\8dÝ\82Ìjvmservice.exe\82Ì\83t\83\8b\83p\83X\82ª\88ê\92v\82µ\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B
+
+\88Ù\82È\82é\83p\83X\82©\82ç\82Ì\8dÄ\93o\98^\81A\93o\98^\89ð\8f\9c\82Í\95s\90³\82È\91\80\8dì\82Æ\82µ\82Ä\83G\83\89\81[\82Æ\82È\82é\81B
+\footnote{\83T\81[\83r\83X\96¼\82Í\8e©\97R\82É\82Â\82¯\82ç\82ê\82é\82½\82ß\81A\8aù\91\82Ì\83V\83X\83e\83\80\97p\82Ì\83T\81[\83r\83X\96¼\82ð\8cë\82Á\82Ä\8ew\92è\82·\82é\8fê\8d\87\82à\82 \82è\82¤\82é\81B
+\82±\82Ì\82æ\82¤\82È\8cë\91\80\8dì\82ð\96h\82®\82½\82ß\81A\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê\82Ä\82¢\82é\8eÀ\8ds\83t\83@\83C\83\8b\82Æ\8a®\91S\82É\93¯\82\83p\83X\82©\82ç\82Å\82È\82¯\82ê\82Î\8dÄ\93o\98^\81E\8dí\8f\9c\82ð\8b\96\89Â\82µ\82È\82¢\81B}
+
+\subsubsection{jvmservice.exe\82Ì\8dí\8f\9c}
+
+jvmservice.exe\82Í1\82Â\88È\8fã\82Ì\83T\81[\83r\83X\82ª\93o\98^\82³\82ê\82Ä\82¢\82é\8fê\8d\87\81A\83\8c\83W\83X\83g\83\8a\82É\91Î\82µ\82Ä\83T\81[\83r\83X\82Ì\8bN\93®\83\82\83W\83\85\81[\83\8b\81A\82¨\82æ\82Ñ\83C\83x\83\93\83g\83\8d\83O\82Ì\83\81\83b\83Z\81[\83W\83\8a\83\\81[\83X\82Æ\82µ\82Ä\93o\98^\82³\82ê\82Ä\82¢\82é\81B
+
+\82·\82×\82Ä\82Ì\83T\81[\83r\83X\82ð\93o\98^\89ð\8f\9c\82·\82ê\82Î\81Ajvmservice.exe\82ð\8dí\8f\9c\82µ\82Ä\82à\88À\91S\82Å\82 \82é\81B
+\footnote{\83T\81[\83r\83X\82Æ\82µ\82Ä\93o\98^\89ð\8f\9c\82¹\82¸\82Éjvmservice.exe\82ð\83t\83@\83C\83\8b\83V\83X\83e\83\80\82©\82ç\8fÁ\82·\8cë\91\80\8dì\82É\82Â\82¢\82Ä\95Û\8cì\82·\82é\95û\96@\82Í\82È\82¢\81B}
+
+\82»\82Ì\8fê\8d\87\81A\83C\83x\83\93\83g\83\8d\83O\82É\8bL\98^\82³\82ê\82Ä\82¢\82é\8c»\8dÝ\82Ìjvmservice.exe\82ª\8fo\97Í\82µ\82½\83\8d\83O\93à\97e\82É\82Â\82¢\82Ä\82Í\83\81\83b\83Z\81[\83W\82ª\93Ç\82Ý\8eæ\82ê\82È\82¢\8fó\91Ô\82É\82È\82é\81B
+\footnote{\82±\82ê\82Í\81AWindows\82Ì\83C\83x\83\93\83g\83\8d\83O\82Ì\8c`\8e®\82Å\82Í\81A\83\8d\83O\83t\83@\83C\83\8b\8fã\82É\82Í\83\81\83b\83Z\81[\83W\82Å\82Í\82È\82­\83f\81[\83^\82ª\8ai\94[\82³\82ê\82Ä\82¨\82è\81A
+\82±\82Ì\83f\81[\83^\82ðjvmservice.exe\82Ì\83\8a\83\\81[\83X\92\86\82Ì\83\81\83b\83Z\81[\83W\83e\83\93\83v\83\8c\81[\83g\82ð\92Ê\82·\82±\82Æ\82Å\90l\8aÔ\82ª\93Ç\82ß\82é\83\81\83b\83Z\81[\83W\82É\95Ï\8a·\82·\82é\82½\82ß\82Å\82 \82é\81B}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\section{\83}\83j\83\85\83A\83\8b}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\subsection{jvmservice\8bN\93®\83I\83v\83V\83\87\83\93}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\subsection{\8bN\93®\83p\83\89\83\81\81[\83^\92è\8b`\83t\83@\83C\83\8b}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\subsection{\83\89\83C\83u\83\89\83\8a\92è\8b`\83t\83@\83C\83\8b}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\subsection{\83\8d\83O\83t\83@\83C\83\8b\82Ì\93à\97e}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\subsection{\83C\83x\83\93\83g\83r\83\85\81[\83\8f\82Ì\93à\97e}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\newpage
+\section{\83A\81[\83L\83e\83N\83`\83\83}
+
+\82Ü\82¾\8bL\8fq\82ª\82 \82è\82Ü\82¹\82ñ\81B
+
+\end{document}
diff --git a/doc/spaneliminator.pl b/doc/spaneliminator.pl
new file mode 100644 (file)
index 0000000..ffce30f
--- /dev/null
@@ -0,0 +1,179 @@
+use strict;
+
+sub main($);
+sub convert($);
+
+my $dir = ".";
+
+if( $#ARGV >= 0 ) {
+       $dir = $ARGV[ 0 ];
+}
+
+main( $dir );
+
+sub main($)
+{
+       my ($dir) = @_;
+       
+       opendir DIR, $dir;
+       my @files = readdir DIR;
+       closedir DIR;
+
+       foreach my $file( sort (@files ) ) {
+               if( ( $file ne ".." and $file ne "." ) and $file =~ /\.html$/ ) {
+                       convert( $dir . "/" . $file );
+               }
+       }
+}
+
+sub convert($)
+{
+       my ($file) = @_;
+       my $tmp = $file . ".tmp";
+       
+       print $file, "\n";
+       open IN, $file;
+       open OUT, ">$tmp";
+       
+       my $state = 0;
+       my $indent = 0;
+       
+       my $ch;
+       while( defined( $ch = getc( IN ) ) ) {
+               if( $state == 0 ) {
+                       if( $ch eq '<' ) {
+                               $state = 1;
+                       }
+                       else {
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 1 ) {
+                       if( $ch eq 's' ) {
+                               $state = 2;
+                       }
+                       elsif( $ch eq '/' ) {
+                               $state = 8;
+                       }
+                       elsif( $ch eq '!' ) {
+                               $state = 20;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "<";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 2 ) {
+                       if( $ch eq 'p' ) {
+                               $state = 3;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "<s";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 3 ) {
+                       if( $ch eq 'a' ) {
+                               $state = 4;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "<sp";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 4 ) {
+                       if( $ch eq 'n' ) {
+                               $state = 5;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "<spa";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 5 ) {
+                       if( $ch eq '>' ) {
+                               $state = 0;
+                               $indent++;
+                       }
+               }
+               elsif( $state == 8 ) {
+                       if( $ch eq 's' ) {
+                               $state = 9;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "</";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 9 ) {
+                       if( $ch eq 'p' ) {
+                               $state = 10;
+                       }
+                       else {
+                               print OUT "</s";
+                               $state = 0;
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 10 ) {
+                       if( $ch eq 'a' ) {
+                               $state = 11;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "</sp";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 11 ) {
+                       if( $ch eq 'n' ) {
+                               $state = 12;
+                       }
+                       else {
+                               $state = 0;
+                               print OUT "</spa";
+                               print OUT $ch;
+                       }
+               }
+               elsif( $state == 12 ) {
+                       if( $ch eq '>' ) {
+                               $state = 0;
+                       }
+               }
+               elsif( $state == 20 ) {
+                       if( $ch eq '-' ) {
+                               $state = 21;
+                       }
+                       else {
+                               print OUT "<!";
+                               print OUT $ch;
+                               $state = 0;
+                       }
+               }
+               elsif( $state == 21 ) {
+                       if( $ch eq '-' ) {
+                               $state = 22;
+                       }
+               }
+               elsif( $state == 22 ) {
+                       if( $ch eq '>' ) {
+                               $state = 0;
+                       }
+                       elsif( $ch ne '-' ) {
+                               $state = 21;
+                       }
+               }
+       }
+       close IN;
+       close OUT;
+
+       my $bak = $file . ".bak";
+       unlink( $bak );
+       rename( $file, $bak );
+       rename( $tmp, $file );
+}
diff --git a/jvmservice.sln b/jvmservice.sln
new file mode 100644 (file)
index 0000000..292affa
--- /dev/null
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jvmservice", "jvmservice\jvmservice.vcproj", "{6192CE08-387E-427B-B053-BF2BEA6A85FD}"
+       ProjectSection(ProjectDependencies) = postProject
+       EndProjectSection
+EndProject
+Global
+       GlobalSection(SolutionConfiguration) = preSolution
+               Debug = Debug
+               Release = Release
+       EndGlobalSection
+       GlobalSection(ProjectConfiguration) = postSolution
+               {6192CE08-387E-427B-B053-BF2BEA6A85FD}.Debug.ActiveCfg = Debug|Win32
+               {6192CE08-387E-427B-B053-BF2BEA6A85FD}.Debug.Build.0 = Debug|Win32
+               {6192CE08-387E-427B-B053-BF2BEA6A85FD}.Release.ActiveCfg = Release|Win32
+               {6192CE08-387E-427B-B053-BF2BEA6A85FD}.Release.Build.0 = Release|Win32
+       EndGlobalSection
+       GlobalSection(ExtensibilityGlobals) = postSolution
+       EndGlobalSection
+       GlobalSection(ExtensibilityAddIns) = postSolution
+       EndGlobalSection
+EndGlobal
diff --git a/jvmservice/Command.cpp b/jvmservice/Command.cpp
new file mode 100644 (file)
index 0000000..181867d
--- /dev/null
@@ -0,0 +1,85 @@
+#include "stdafx.h"
+
+#include "Command.hpp"
+#include "ServiceRegisterCommand.hpp"
+#include "ServiceLaunchCommand.hpp"
+
+#include <assert.h>
+
+namespace
+{
+       class ShowHelpCommand : public Command
+       {
+       public:
+               ShowHelpCommand( const CommandArgument& v_argument ) throw ( std::exception )
+                       : Command( v_argument )
+               {
+               }
+
+               virtual ~ShowHelpCommand() throw()
+               {
+               }
+
+               virtual void execute() throw ( std::exception )
+               {
+                       CommandArgumentFactory::showHelp();
+               }
+       };
+
+}
+
+Command::Command( const CommandArgument& v_argument ) throw ( std::exception )
+       : argument_( v_argument )
+{
+}
+
+Command::~Command() throw()
+{
+}
+
+CommandPtr Command::create( const CommandArgument& v_argument ) throw ( std::exception )
+{
+       // Windows2000/XP/2003\88È\8d~\82Å\82 \82é\82©\83`\83F\83b\83N\82·\82é
+
+       OSVERSIONINFOEX versionInfo = { 0 };
+       versionInfo.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );
+       versionInfo.dwMajorVersion = 5;
+
+       DWORDLONG dwlConditionMask = 0;
+       VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL );
+       
+       if( VerifyVersionInfo( &versionInfo, VER_MAJORVERSION, dwlConditionMask ) == 0 ) {
+               Win32Exception::throwWin32Exception( GetLastError() );
+       }
+
+       // \83R\83}\83\93\83h\82ð\8a\84\82è\93\96\82Ä\82é
+
+       CommandPtr cmd;
+
+       switch( v_argument.getCommandType() )
+       {
+       case CommandArgument::cmdtype_none:
+               cmd = CommandPtr( new ShowHelpCommand( v_argument ) );
+               break;
+
+       case CommandArgument::cmdtype_regist:
+               cmd = CommandPtr( new ServiceRegisterCommand( v_argument ) );
+               break;
+
+       case CommandArgument::cmdtype_unregist:
+               cmd = CommandPtr( new ServiceUnregisterCommand( v_argument ) );
+               break;
+
+       case CommandArgument::cmdtype_runservice:
+               cmd = CommandPtr( new ServiceLaunchCommand( v_argument ) );
+               break;
+
+       default:
+               assert( false && "\95s\96¾\82È\83R\83}\83\93\83h\83^\83C\83v" );
+               throw std::invalid_argument( "\95s\96¾\82È\83R\83}\83\93\83h\83^\83C\83v\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82·\81B" );
+       }
+
+       assert( cmd.get() != NULL );
+       return cmd;
+}
+
diff --git a/jvmservice/Command.hpp b/jvmservice/Command.hpp
new file mode 100644 (file)
index 0000000..4962f8f
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef INCLUDE_H_COMMAND
+#define INCLUDE_H_COMMAND
+
+#include <exception>
+#include <memory>
+
+#include "CommandArgument.hpp"
+
+class Command;
+typedef std::auto_ptr<Command> CommandPtr;
+
+class Command
+{
+protected:
+       Command( const CommandArgument& v_argument ) throw ( std::exception );
+
+public:
+       virtual ~Command() throw();
+       virtual void execute() throw ( std::exception ) = 0;
+
+       static CommandPtr create( const CommandArgument& v_argument ) throw ( std::exception );
+
+protected:
+       const CommandArgument argument_;
+};
+
+#endif
diff --git a/jvmservice/CommandArgument.cpp b/jvmservice/CommandArgument.cpp
new file mode 100644 (file)
index 0000000..365488d
--- /dev/null
@@ -0,0 +1,269 @@
+#include "stdafx.h"
+
+#include "CommandArgument.hpp"
+
+#include <assert.h>
+
+CommandArgument::CommandArgument() throw()
+       : cmdtype_( cmdtype_none )
+{
+}
+
+CommandArgument::CommandArgument( const CommandArgument& v_other ) throw()
+       : cmdtype_( v_other.cmdtype_ )
+       , serviceName_( v_other.serviceName_ )
+       , configPath_( v_other.configPath_ )
+       , logPath_( v_other.logPath_ )
+       , dependencies_( v_other.dependencies_ )
+       , workdir_( v_other.workdir_ )
+{
+}
+
+CommandArgument::~CommandArgument() throw()
+{
+}
+
+CommandArgument::size_type CommandArgument::size() const throw()
+{
+       return dependencies_.size();
+}
+
+CommandArgument::const_iterator CommandArgument::begin() const throw()
+{
+       return dependencies_.begin();
+}
+
+CommandArgument::const_iterator CommandArgument::end() const throw()
+{
+       return dependencies_.end();
+}
+
+const CommandArgument::cmdtype CommandArgument::getCommandType() const throw()
+{
+       return cmdtype_;
+}
+
+const std::string& CommandArgument::getServiceName() const throw()
+{
+       return serviceName_;
+}
+
+const std::string& CommandArgument::getConfigPath() const throw()
+{
+       return configPath_;
+}
+
+const std::string& CommandArgument::getLogPath() const throw()
+{
+       return logPath_;
+}
+
+const std::string& CommandArgument::getWorkDir() const throw()
+{
+       return workdir_;
+}
+
+
+////////////////////
+
+CommandArgumentFactory::CommandArgumentFactory() throw()
+       : acceptDependencies_( false )
+{
+}
+
+CommandArgumentFactory::~CommandArgumentFactory() throw()
+{
+}
+
+CommandArgument CommandArgumentFactory::create( int argc, char* argv[] ) throw ( std::exception )
+{
+       //required:
+       assert( argc > 0 );
+       assert( argv != NULL );
+
+       //do:
+       CommandArgumentFactory inst;
+       StringVector args;
+
+       int optionLen = 0;
+       for( int idx=1; idx<argc; idx++ ) {
+               const std::string arg = argv[ idx ];
+               if( optionLen == 0 ) {
+                       optionLen = inst.getOptionLength( arg );
+                       if( optionLen <= 0 ) {
+                               throw std::invalid_argument( std::string( "\94F\8e¯\82Å\82«\82È\82¢\83I\83v\83V\83\87\83\93\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82·\81B" ) + arg );
+                       }
+                       args.clear();
+               }
+               args.push_back( arg );
+               if( --optionLen == 0 ) {
+                       inst.parse( args );
+               }
+       }
+       if( optionLen != 0 ) {
+               throw std::invalid_argument( "\88ø\90\94\82ª\95s\91«\82µ\82Ä\82¢\82Ü\82·\81B" );
+       }
+
+       inst.validate();
+       return inst.target_;
+}
+
+void CommandArgumentFactory::validate() const throw ( std::exception )
+{
+       // \83T\81[\83r\83X\96¼\82Ì\8c\9f\8fØ
+       switch( target_.cmdtype_ )
+       {
+       case CommandArgument::cmdtype_runservice:
+       case CommandArgument::cmdtype_regist:
+       case CommandArgument::cmdtype_unregist:
+               if( target_.serviceName_.empty() ) {
+                       throw std::invalid_argument( "\83T\81[\83r\83X\96¼\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+               }
+               break;
+
+       case CommandArgument::cmdtype_none:
+               break;
+
+       default:
+               assert( false );
+               throw std::runtime_error( "\95s\96¾\82È\83R\83}\83\93\83h\83^\83C\83v\82ª\90Ý\92è\82³\82ê\82Ü\82µ\82½\81B" );
+               break;
+       }
+
+       // \90Ý\92è\83t\83@\83C\83\8b\82Æ\88Ë\91\8aÖ\8cW\81A\83\8f\81[\83L\83\93\83O\83f\83B\83\8c\83N\83g\83\8a\82Ì\8c\9f\8fØ
+       switch( target_.cmdtype_ )
+       {
+       case CommandArgument::cmdtype_runservice:
+       case CommandArgument::cmdtype_regist:
+               if( target_.configPath_.empty() ) {
+                       throw std::invalid_argument( "\90Ý\92è\83t\83@\83C\83\8b\96¼\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+               }
+               break;
+
+       case CommandArgument::cmdtype_unregist:
+       case CommandArgument::cmdtype_none:
+       default:
+               if( ! target_.configPath_.empty() ) {
+                       throw std::invalid_argument( "\90Ý\92è\83t\83@\83C\83\8b\96¼\82Í\93o\98^\8e\9e\88È\8aO\82Å\82Í\8ew\92è\82Å\82«\82Ü\82¹\82ñ\81B" );
+               }
+               if( ! target_.logPath_.empty() ) {
+                       throw std::invalid_argument( "\83\8d\83O\83t\83@\83C\83\8b\96¼\82Í\93o\98^\8e\9e\88È\8aO\82Å\82Í\8ew\92è\82Å\82«\82Ü\82¹\82ñ\81B" );
+               }
+               if( ! target_.workdir_.empty() ) {
+                       throw std::invalid_argument( "\83\8f\81[\83L\83\93\83O\83f\83B\83\8c\83N\83g\83\8a\96¼\82Í\93o\98^\8e\9e\88È\8aO\82Å\82Í\8ew\92è\82Å\82«\82Ü\82¹\82ñ\81B" );
+               }
+               if( target_.dependencies_.size() > 0 ) {
+                       throw std::invalid_argument( "\88Ë\91\83T\81[\83r\83X\96¼\82Í\93o\98^\8e\9e\88È\8aO\82Å\82Í\8ew\92è\82Å\82«\82Ü\82¹\82ñ\81B" );
+               }
+               break;
+       }
+}
+
+int CommandArgumentFactory::getOptionLength( const std::string& v_arg ) throw( std::exception )
+{
+       if( target_.cmdtype_ == CommandArgument::cmdtype_none ) {
+               if( v_arg == "-h" || v_arg == "--help" ) {
+                       return 1;
+               }
+               else if( v_arg == "-r" || v_arg == "--regist" ) {
+                       return 2;
+               }
+               else if( v_arg == "-u" || v_arg == "--unregist" ) {
+                       return 2;
+               }
+               else if( v_arg == "--runService" ) {
+                       return 2;
+               }
+               else if( v_arg[ 0 ] != '-' ) {
+                       return 1;
+               }
+       }
+       else {
+               if( ! acceptDependencies_ ) {
+                       if( v_arg == "-c" || v_arg == "--config" ) {
+                               return 2;
+                       }
+                       else if( v_arg == "-l" || v_arg == "--log" ) {
+                               return 2;
+                       }
+                       else if( v_arg == "-w" || v_arg == "--workingdir" ) {
+                               return 2;
+                       }
+                       else if( v_arg == "-d" || v_arg == "--dependencies" ) {
+                               return 1;
+                       }
+               }
+               else {
+                       if( v_arg[ 0 ] == '-' ) {
+                               return 0;
+                       }
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+void CommandArgumentFactory::parse( const StringVector& v_args ) throw ( std::exception )
+{
+       if( target_.cmdtype_ == CommandArgument::cmdtype_none ) {
+               if( v_args[ 0 ] == "-h" || v_args[ 0 ] == "--help" ) {
+                       target_.cmdtype_ = CommandArgument::cmdtype_none;
+               }
+               else if( v_args[ 0 ] == "-r" || v_args[ 0 ] == "--regist" ) {
+                       target_.cmdtype_ = CommandArgument::cmdtype_regist;
+                       target_.serviceName_ = v_args[ 1 ];
+               }
+               else if( v_args[ 0 ] == "-u" || v_args[ 0 ] == "--unregist" ) {
+                       target_.cmdtype_ = CommandArgument::cmdtype_unregist;
+                       target_.serviceName_ = v_args[ 1 ];
+               }
+               else if( v_args[ 0 ] == "--runService" ) {
+                       target_.cmdtype_ = CommandArgument::cmdtype_runservice;
+                       target_.serviceName_ = v_args[ 1 ];
+               }
+               else if( v_args[ 0 ][ 0 ] != '-' ) {
+                       target_.cmdtype_ = CommandArgument::cmdtype_regist;
+                       target_.serviceName_ = v_args[ 0 ];
+               }
+               else {
+                       assert( false );
+               }
+       }
+       else {
+               if( ! acceptDependencies_ ) {
+                       if( v_args[ 0 ] == "-c" || v_args[ 0 ] == "--config" ) {
+                               target_.configPath_ = v_args[ 1 ];
+                       }
+                       else if( v_args[ 0 ] == "-l" || v_args[ 0 ] == "--log" ) {
+                               target_.logPath_ = v_args[ 1 ];
+                       }
+                       else if( v_args[ 0 ] == "-w" || v_args[ 0 ] == "--workingdir" ) {
+                               target_.workdir_ = v_args[ 1 ];
+                       }
+                       else if( v_args[ 0 ] == "-d" || v_args[ 0 ] == "--dependencies" ) {
+                               acceptDependencies_ = true;
+                       }
+                       else {
+                               assert( false );
+                       }
+               }
+               else {
+                       if( v_args[ 0 ][ 0 ] != '-' ) {
+                               target_.dependencies_.push_back( v_args[ 0 ] );
+                       }
+                       else {
+                               assert( false );
+                       }
+               }
+       }
+}
+
+void CommandArgumentFactory::showHelp() throw()
+{
+       fputs( "\82Â\82¬\82Ì\82¢\82¸\82ê\82©\82Ì\8c`\8e®\82Å\83R\83}\83\93\83h\82ð\8ew\92è\82µ\82Ü\82·\81B\n", stdout );
+       fputs( "\83T\81[\83r\83X\82Ì\93o\98^\n  jvmservice.exe [ --regist ] \83T\81[\83r\83X\96¼ --config \90Ý\92è\83t\83@\83C\83\8b [--log \83\8d\83O\83t\83@\83C\83\8b] [--workingdir \8dì\8bÆ\83f\83B\83\8c\83N\83g\83\8a] [ --dependencies [ \88Ë\91\83T\81[\83r\83X\96¼ ... ]]\n", stdout );
+       fputs( "\83T\81[\83r\83X\82Ì\93o\98^\89ð\8f\9c\n  jvmservice.exe --unregist \83T\81[\83r\83X\96¼\n", stdout );
+}
+
+
+
diff --git a/jvmservice/CommandArgument.hpp b/jvmservice/CommandArgument.hpp
new file mode 100644 (file)
index 0000000..c00de41
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef INCLUDE_H_SERVICEAGUMENT
+#define INCLUDE_H_SERVICEAGUMENT
+
+#include <vector>
+#include <string>
+
+class CommandArgument
+{
+private:
+       typedef std::vector<std::string> StringVector;
+       
+       friend class CommandArgumentFactory;
+
+       CommandArgument() throw();
+       CommandArgument& operator=( const CommandArgument& ) throw(); //<! \8eÀ\91\95\82È\82µ
+
+public:
+
+       typedef StringVector::const_iterator const_iterator;
+       typedef StringVector::size_type size_type;
+       typedef StringVector::value_type value_type;
+       typedef StringVector::const_reference const_reference;
+
+       enum cmdtype
+       {
+               cmdtype_none,
+               cmdtype_runservice,
+               cmdtype_regist,
+               cmdtype_unregist
+       };
+
+       CommandArgument( const CommandArgument& ) throw();
+       ~CommandArgument() throw();
+
+       size_type size() const throw();
+       const_iterator begin() const throw();
+       const_iterator end() const throw();
+
+       const cmdtype getCommandType() const throw();
+       const std::string& getServiceName() const throw();
+       const std::string& getConfigPath() const throw();
+       const std::string& getLogPath() const throw();
+       const std::string& getWorkDir() const throw();
+
+private:
+       cmdtype cmdtype_;
+       std::string serviceName_;
+       std::string configPath_;
+       std::string logPath_;
+       std::string workdir_;
+       StringVector dependencies_;
+};
+
+class CommandArgumentFactory
+{
+private:
+       typedef std::vector<std::string> StringVector;
+
+       CommandArgumentFactory() throw();
+       ~CommandArgumentFactory() throw();
+
+public:
+       static CommandArgument create( int argc, char* argv[] ) throw ( std::exception );
+       static void showHelp() throw();
+
+private:
+       void validate() const throw ( std::exception );
+
+       int getOptionLength( const std::string& v_arg ) throw( std::exception );
+       void parse( const StringVector& v_args ) throw ( std::exception );
+
+       bool acceptDependencies_;
+       CommandArgument target_;
+};
+
+
+#endif
diff --git a/jvmservice/ConfigParser.cpp b/jvmservice/ConfigParser.cpp
new file mode 100644 (file)
index 0000000..36a46f1
--- /dev/null
@@ -0,0 +1,210 @@
+#include "stdafx.h"
+
+#include "ConfigParser.hpp"
+#include <fstream>
+
+ConfigParser::ConfigParser()
+{
+}
+
+ConfigParser::~ConfigParser()
+{
+}
+
+void ConfigParser::parse( const std::string& v_fileName )
+{
+       std::ifstream fin;
+       fin.open( v_fileName.c_str() );
+       if( ! fin.is_open() ) {
+               throw std::runtime_error( "\90Ý\92è\83t\83@\83C\83\8b\82ª\8aJ\82¯\82Ü\82¹\82ñ\81B" );
+       }
+       std::string line;
+       while( getline( fin, line ) ) {
+               char firstChar = 0;
+               for( std::string::const_iterator p=line.begin(), last=line.end();
+                       p != last;
+                       ++p)
+               {
+                       if( *p == '#' || *p == ';' ) {
+                               break;
+                       }
+                       if( ! ( *p >= 0 && *p <= ' ' ) ) {
+                               firstChar = *p;
+                               break;
+                       }
+               }
+               if( firstChar == 0 ) {
+                       continue;
+               }
+
+               line = expandEnvironmentStrings( line );
+               if( firstChar == '-' ) {
+                       parseJVMOption( line );
+               }
+               else {
+                       parseMethodOption( line );
+               }
+       }
+       fin.close();
+}
+
+const JavaVMStartupInfo& ConfigParser::getJavaVMStartupInfo() const
+{
+       return jvmStartupInfo_;
+}
+
+ConfigParser::iterator ConfigParser::begin()
+{
+       return methods_.begin();
+}
+
+ConfigParser::const_iterator ConfigParser::begin() const
+{
+       return methods_.begin();
+}
+
+ConfigParser::iterator ConfigParser::end()
+{
+       return methods_.end();
+}
+
+ConfigParser::const_iterator ConfigParser::end() const
+{
+       return methods_.end();
+}
+
+ConfigParser::size_type ConfigParser::size() const
+{
+       return methods_.size();
+}
+
+std::string ConfigParser::expandEnvironmentStrings( const std::string& v_line )
+{
+       DWORD siz = MAX_PATH * 2;
+       for(;;) {
+               std::vector<char> buf( siz );
+               const DWORD needsize = ExpandEnvironmentStrings( v_line.c_str(), &buf[0], siz );
+               if( needsize >= siz ) {
+                       siz *= 2;
+                       continue;
+               }
+               return std::string( &buf[0] );
+       }
+}
+
+void ConfigParser::parseJVMOption( const std::string& v_line )
+{
+       jvmStartupInfo_.push_back( v_line );
+}
+
+void ConfigParser::parseMethodOption( const std::string& v_line )
+{
+       std::string className;
+       std::string methodName;
+       
+       const char *p = v_line.c_str();
+       while( *p > 0 && *p <= ' ' ) {
+               p++;
+       }
+
+       bool bFork = false;
+       if( *p == '&' ) {
+               bFork = true;
+               p++;
+               while( *p > 0 && *p <= ' ' ) {
+                       p++;
+               }
+       }
+
+       while(*p) {
+               if( *p == '#' || ( *p > 0 && *p <= ' ' ) ) {
+                       break;
+               }
+               className += *p;
+               p++;
+       }
+       while( *p > 0 && *p <= ' ' ) {
+               p++;
+       }
+
+       if( *p == '#' ) {
+               p++;
+               while( *p > 0 && *p <= ' ' ) {
+                       p++;
+               }
+               while(*p) {
+                       if( *p > 0 && *p <= ' ' ) {
+                               break;
+                       }
+                       methodName += *p;
+                       p++;
+               }
+       }
+
+       if( methodName.empty() ) {
+               methodName = "main";
+       }
+
+       if( ! className.empty() && ! methodName.empty() ) {
+               StartupInfo startupInfo( className, methodName, bFork );
+               std::string arg;
+               enum escape_mode {
+                       escape_mode_init = 0,
+                       escape_mode_normal = 1,
+                       escape_mode_escape = 2,
+                       escape_mode_cancel = 3
+               } mode = escape_mode_init;
+               while(*p) {
+                       const char c = *p;
+                       if( mode == escape_mode_init ) {
+                               if( c == '\"' ) {
+                                       arg.clear();
+                                       mode = escape_mode_escape;
+                               }
+                               else if( c > 0 && c <= ' ' ) {
+                                       // do nothing.
+                               }
+                               else {
+                                       mode = escape_mode_normal;
+                                       arg.clear();
+                                       arg += c;
+                               }
+                       }
+                       else if( mode == escape_mode_normal ) {
+                               if( c > 0 && c <= ' ' ) {
+                                       if( ! arg.empty() ) {
+                                               startupInfo.push_back( arg );
+                                       }
+                                       mode = escape_mode_init;
+                               }
+                               else {
+                                       arg += c;
+                               }
+                       }
+                       else if( mode == escape_mode_escape ) {
+                               if( c == '\"' ) {
+                                       mode = escape_mode_cancel;
+                               }
+                               else {
+                                       arg += c;
+                               }
+                       }
+                       else if( mode == escape_mode_cancel ) {
+                               if( c == '\"' ) {
+                                       mode = escape_mode_escape;
+                                       arg += c;
+                               }
+                               else {
+                                       mode = escape_mode_normal;
+                                       continue;
+                               }
+                       }
+                       p++;
+               }
+               if( ! arg.empty() ) {
+                       startupInfo.push_back( arg );
+               }
+
+               methods_.push_back( startupInfo );
+       }
+}
diff --git a/jvmservice/ConfigParser.hpp b/jvmservice/ConfigParser.hpp
new file mode 100644 (file)
index 0000000..5b16aa0
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef INCLUDE_H_CONFIGPARSER
+#define INCLUDE_H_CONFIGPARSER
+
+#include <list>
+
+#include "JavaVMMainThread.hpp"
+
+class ConfigParser
+{
+public:
+       typedef std::list<StartupInfo> StartupInfoList;
+
+       typedef StartupInfoList::iterator iterator;
+       typedef StartupInfoList::const_iterator const_iterator;
+       typedef StartupInfoList::value_type value_type;
+       typedef StartupInfoList::size_type size_type;
+       typedef StartupInfoList::reference reference;
+       typedef StartupInfoList::const_reference const_reference;
+
+       ConfigParser();
+       ~ConfigParser();
+
+       void parse( const std::string& v_fileName );
+
+       const JavaVMStartupInfo& getJavaVMStartupInfo() const;
+       ConfigParser::iterator begin();
+       ConfigParser::const_iterator begin() const;
+       ConfigParser::iterator end();
+       ConfigParser::const_iterator end() const;
+       ConfigParser::size_type size() const;
+
+protected:
+       static std::string expandEnvironmentStrings( const std::string& v_line );
+       void parseJVMOption( const std::string& v_line );
+       void parseMethodOption( const std::string& v_line );
+
+private:
+       JavaVMStartupInfo jvmStartupInfo_;
+       StartupInfoList methods_;
+};
+
+
+#endif
diff --git a/jvmservice/Event.cpp b/jvmservice/Event.cpp
new file mode 100644 (file)
index 0000000..c36f873
--- /dev/null
@@ -0,0 +1,100 @@
+#include "stdafx.h"
+
+#include "Event.hpp"
+
+namespace
+{
+       volatile LONG lock_ = 0L;
+}
+
+EventRef::EventRef( bool v_auto, bool v_initialState ) throw ( std::exception )
+{
+       HANDLE hEvent = CreateEvent( NULL, v_auto ? FALSE : TRUE, v_initialState ? TRUE : FALSE, NULL );
+       if( hEvent == NULL ) {
+               throw std::runtime_error( "\83C\83x\83\93\83g\82Ì\8dì\90¬\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+       }
+
+       try{
+               pEventData_ = new EventData_();
+               while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+                       Sleep( 0 );
+               }
+               pEventData_->hEvent_ = hEvent;
+               pEventData_->ref_ = 1;
+               InterlockedExchange( &lock_, 0L );
+       }
+       catch( ... ) {
+               CloseHandle( hEvent );
+               throw;
+       }
+}
+
+EventRef::EventRef( const EventRef& v_event ) throw()
+{
+       while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+               Sleep( 0 );
+       }
+       __try{
+               pEventData_ = v_event.pEventData_;
+               pEventData_->ref_++;
+       }
+       __finally{
+               InterlockedExchange( &lock_, 0L );
+       }
+}
+
+EventRef& EventRef::operator=( const EventRef& v_event ) throw()
+{
+       if( this != &v_event ) {
+               while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+                       Sleep( 0 );
+               }
+               __try{
+                       if( --pEventData_->ref_ == 0 ) {
+                               delete pEventData_;
+                       }
+                       pEventData_ = v_event.pEventData_;
+                       pEventData_->ref_++;
+               }
+               __finally {
+                       InterlockedExchange( &lock_, 0L );
+               }
+       }
+       return *this;
+}
+
+EventRef::~EventRef() throw()
+{
+       while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+               Sleep( 0 );
+       }
+       __try{
+               if( --pEventData_->ref_ == 0 ) {
+                       delete pEventData_;
+               }
+       }
+       __finally {
+               InterlockedExchange( &lock_, 0L );
+       }
+}
+
+bool EventRef::waitForSignal( DWORD v_wait ) throw()
+{
+       return WaitForSingleObject( pEventData_->hEvent_ , v_wait ) != WAIT_TIMEOUT;
+}
+
+void EventRef::signal( bool v_state ) throw()
+{
+       if( v_state ) {
+               SetEvent( pEventData_->hEvent_ );
+       }
+       else {
+               ResetEvent( pEventData_->hEvent_ );
+       }
+}
+
+void EventRef::pulse() throw()
+{
+       PulseEvent( pEventData_->hEvent_ );
+}
+
diff --git a/jvmservice/Event.hpp b/jvmservice/Event.hpp
new file mode 100644 (file)
index 0000000..ceb0366
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef INCLUDE_H_EVENTOBJECT
+#define INCLUDE_H_EVENTOBJECT
+
+#include <exception>
+
+class EventRef
+{
+public:
+       EventRef( bool v_auto = false, bool v_initialState = false ) throw ( std::exception );
+       EventRef( const EventRef& v_event ) throw();
+       EventRef& operator=( const EventRef& v_event ) throw();
+       ~EventRef() throw();
+
+       bool waitForSignal( DWORD v_wait = INFINITE ) throw();
+       void signal( bool v_state ) throw();
+       void pulse() throw();
+
+private:
+       struct EventData_
+       {
+               HANDLE hEvent_;
+               int ref_;
+       };
+
+       mutable EventData_* pEventData_;
+};
+
+template< class T >
+class EventSentinel
+{
+private:
+       EventSentinel( const EventSentinel& ); //<! \8eÀ\91\95\82È\82µ
+       operator=( const EventSentinel& ); //<! \8eÀ\91\95\82È\82µ
+
+public:
+       EventSentinel( T& v_eventRef ) throw()
+               : eventRef_( v_eventRef )
+               , signaled_( false )
+       {
+       }
+
+       ~EventSentinel() throw()
+       {
+               signal();
+       }
+
+       void signal() throw()
+       {
+               if( ! signaled_ ) {
+                       eventRef_.signal();
+                       signaled_ = true;
+               }
+       }
+
+private:
+       T& eventRef_;
+       bool signaled_;
+};
+
+#endif
diff --git a/jvmservice/EventLog.cpp b/jvmservice/EventLog.cpp
new file mode 100644 (file)
index 0000000..64f8b3a
--- /dev/null
@@ -0,0 +1,130 @@
+#include "stdafx.h"
+
+#include "EventLog.hpp"
+
+#include <assert.h>
+
+EventLog::EventLog( const std::string& v_eventSourceName ) throw()
+       : eventSourceName_( v_eventSourceName )
+       , hEventLog_( NULL )
+{
+       assert( ! v_eventSourceName.empty() && "\83C\83x\83\93\83g\83\\81[\83X\96¼\82ª\8bó\82Å\82·\81B" );
+}
+
+EventLog::~EventLog() throw()
+{
+       close();
+}
+
+void EventLog::open() throw ( std::exception )
+{
+       //required:
+       assert( hEventLog_ == NULL && "\82·\82Å\82É\83C\83x\83\93\83g\83\8d\83O\82Í\8aJ\82©\82ê\82Ä\82¢\82Ü\82·\81B" );
+       
+       //do:
+       if( hEventLog_ == NULL ) {
+               hEventLog_ = RegisterEventSource( NULL, eventSourceName_.c_str() );
+               Win32Exception::checkAndThrow( hEventLog_ != NULL );
+       }
+}
+
+void EventLog::close() throw()
+{
+       if( hEventLog_ != NULL ) {
+               DeregisterEventSource( hEventLog_ );
+               hEventLog_ = NULL;
+       }
+}
+
+void EventLog::reportEvent( DWORD v_eventID, WORD cnt, LPCSTR* messages, WORD v_eventType ) const throw()
+{
+       //required:
+       assert( hEventLog_ != NULL && "\83C\83x\83\93\83g\83\8d\83O\82ª\8aJ\82©\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+
+       //do:
+       if( hEventLog_ != NULL ) {
+               ReportEvent(
+                       hEventLog_,
+                       v_eventType,
+                       0,
+                       v_eventID,
+                       NULL,
+                       cnt,
+                       0,
+                       (LPCTSTR*) messages,
+                       NULL
+                       );
+       }
+}
+
+void EventLog::registerEventSource( const std::string& v_modulePath ) throw ( std::exception )
+{
+       //required:
+       assert( ! v_modulePath.empty() );
+
+       //do:
+
+       std::string regEntry( "System\\CurrentControlSet\\Services\\EventLog\\Application\\" );
+       regEntry += eventSourceName_;
+
+       HKEY hKey = NULL;
+       DWORD disp = 0;
+
+       LONG ret;
+       ret = RegCreateKeyEx(
+               HKEY_LOCAL_MACHINE,
+               regEntry.c_str(),
+               0,
+               NULL,
+               REG_OPTION_NON_VOLATILE,
+               KEY_ALL_ACCESS,
+               NULL,
+               &hKey,
+               &disp
+        );
+       Win32Exception::checkAndThrow( ret == ERROR_SUCCESS );
+
+       try{
+               ret = RegSetValueEx(
+                       hKey,
+                       "EventMessageFile",
+                       0,
+                       REG_EXPAND_SZ,
+                       (LPBYTE) v_modulePath.c_str(),
+                       (DWORD)( v_modulePath.size() + 1 )
+                       );
+               Win32Exception::checkAndThrow( ret == ERROR_SUCCESS );
+
+               DWORD typ = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+               ret = RegSetValueEx(
+                       hKey,
+                       "TypesSupported",
+                       0,
+                       REG_DWORD,
+                       (LPBYTE) &typ,
+                       sizeof(DWORD)
+                       );
+               Win32Exception::checkAndThrow( ret == ERROR_SUCCESS );
+       }
+       catch( ... ) {
+               RegCloseKey( hKey );
+               throw;
+       }
+
+       RegCloseKey( hKey );
+}
+
+void EventLog::unregisterEventSource( const std::string& v_modulePath ) throw ( std::exception )
+{
+       //required:
+       assert( ! v_modulePath.empty() );
+
+       //do:
+       
+       std::string regEntry( "System\\CurrentControlSet\\Services\\EventLog\\Application\\" );
+       regEntry += eventSourceName_;
+
+       LONG ret = RegDeleteKey( HKEY_LOCAL_MACHINE, regEntry.c_str() );
+       Win32Exception::checkAndThrow( ret == ERROR_SUCCESS );
+}
+
diff --git a/jvmservice/EventLog.hpp b/jvmservice/EventLog.hpp
new file mode 100644 (file)
index 0000000..704d694
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef INCLUDE_H_EVENTLOG
+#define INCLUDE_H_EVENTLOG
+
+#include <string>
+#include <exception>
+
+#include <windows.h>
+
+#include "Win32Exception.hpp"
+
+class EventLog
+{
+private:
+       EventLog( const EventLog& ); //<! \8eÀ\91\95\82È\82µ
+       operator=( const EventLog& ); //<! \8eÀ\91\95\82È\82µ
+
+public:
+       EventLog( const std::string& v_eventSourceName ) throw();
+       ~EventLog() throw();
+
+       void open() throw ( std::exception );
+       void close() throw();
+       void reportEvent( DWORD v_eventID, WORD cnt = 0, LPCSTR* messages = NULL, WORD v_eventType = EVENTLOG_ERROR_TYPE ) const throw();
+
+       void registerEventSource( const std::string& v_modulePath ) throw( std::exception );
+       void unregisterEventSource( const std::string& v_modulePath ) throw ( std::exception );
+
+private:
+       std::string eventSourceName_;
+       HANDLE hEventLog_;
+};
+
+#endif
diff --git a/jvmservice/ExceptionFilter.cpp b/jvmservice/ExceptionFilter.cpp
new file mode 100644 (file)
index 0000000..2e59ac4
--- /dev/null
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+
+#include "ExceptionFilter.hpp"
+
+#include "message.h"
+
+#include <assert.h>
+
+namespace
+{
+       const EventLog* pEventLog_ = NULL;
+
+       LONG ExceptionFilter( EXCEPTION_POINTERS* v_pExceptionInfo )
+       {
+               if( pEventLog_ != NULL ) {
+                       pEventLog_->reportEvent(
+                               MSG_UNHANDLED_EXCEPTION,
+                               0,
+                               NULL,
+                               EVENTLOG_ERROR_TYPE
+                               );
+               }
+               return EXCEPTION_EXECUTE_HANDLER;
+       }
+}
+
+void UnhandledExceptionHandler::setUnhandledExceptionHandler() throw()
+{
+       SetUnhandledExceptionFilter( (LPTOP_LEVEL_EXCEPTION_FILTER) ExceptionFilter );
+}
+
+void UnhandledExceptionHandler::setEventLog( const EventLog* v_pEventLog ) throw()
+{
+       //required:
+       assert( pEventLog_ == NULL && "\82·\82Å\82É\83C\83x\83\93\83g\83\8d\83O\82ª\93o\98^\82³\82ê\82Ä\82¢\82Ü\82·\81B" );
+       
+       //do:
+       pEventLog_ = v_pEventLog;
+}
+
diff --git a/jvmservice/ExceptionFilter.hpp b/jvmservice/ExceptionFilter.hpp
new file mode 100644 (file)
index 0000000..b34550e
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef INCLUDE_H_EXCEPTIONFILTER
+#define INCLUDE_H_EXCEPTIONFILTER
+
+#include "EventLog.hpp"
+
+class UnhandledExceptionHandler
+{
+private:
+       UnhandledExceptionHandler(); //<! \8eÀ\91\95\82È\82µ
+
+public:
+       static void setUnhandledExceptionHandler() throw();
+       static void setEventLog( const EventLog* v_pEventLog ) throw();
+};
+
+#endif
diff --git a/jvmservice/JVMException.cpp b/jvmservice/JVMException.cpp
new file mode 100644 (file)
index 0000000..3f15769
--- /dev/null
@@ -0,0 +1,53 @@
+#include "stdafx.h"
+
+#include "JVMException.hpp"
+
+#include <assert.h>
+
+#include <string>
+#include <vector>
+
+JVMException::JVMException( const char* v_message )
+       : std::runtime_error( v_message )
+{
+}
+
+/*!
+ * JavaVM\8fã\82Å\97á\8aO\82ª\94­\90\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\82µ\81A\94­\90\82µ\82Ä\82¢\82ê\82ÎJVMException\97á\8aO\82ð\94­\90\82³\82¹\82Ü\82·\81B
+ * \param env JNI\83A\83N\83Z\83X\82Ì\82½\82ß\82Ì\83X\83\8c\83b\83h\82²\82Æ\82Ì\8aÂ\8b«
+ */
+void JVMException::checkAndThrow( JNIEnv* env ) throw( JVMException )
+{
+       //required:
+       assert( env != NULL );
+
+       //do:
+       jthrowable err = env->ExceptionOccurred();
+       env->ExceptionClear();
+       if( err != NULL ) {
+               jclass throwableClass = env->GetObjectClass( err );
+               jmethodID toStringMethodID = env->GetMethodID( throwableClass, "toString", "()Ljava/lang/String;" );
+               assert( toStringMethodID != NULL );
+               jstring errDescription = reinterpret_cast<jstring>(env->CallObjectMethod( err, toStringMethodID ));
+               
+               std::string message( "unknown exception" );
+
+               const jsize len = env->GetStringLength( errDescription );
+               const jchar* szErrDescription = env->GetStringChars( errDescription, NULL );
+               if( szErrDescription != NULL ) {
+                       int buflen = WideCharToMultiByte( GetACP(), 0, reinterpret_cast<LPCWSTR>( szErrDescription ), len, NULL, 0, NULL, NULL );
+                       if( buflen != 0 ) {
+                               std::vector<char> buf( buflen + 1 );
+                               buflen = WideCharToMultiByte( GetACP(), 0, reinterpret_cast<LPCWSTR>( szErrDescription ), len, &buf[ 0 ], buflen, NULL, NULL );
+                               if( buflen != 0 ) {
+                                       buf[ buflen ] = 0;
+                                       message = &buf[ 0 ];
+                               }
+                       }
+                       env->ReleaseStringChars( errDescription, szErrDescription );
+               }
+               
+               throw JVMException( message.c_str() );
+       }
+}
+
diff --git a/jvmservice/JVMException.hpp b/jvmservice/JVMException.hpp
new file mode 100644 (file)
index 0000000..c13b750
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef INCLUDE_H_JVMEXCEPTION
+#define INCLUDE_H_JVMEXCEPTION
+
+#include <exception>
+#include <jni.h>
+
+class JVMException : public std::runtime_error
+{
+public:
+       /*!
+        * JavaVM\97á\8aO\82ð\82 \82ç\82í\82·\97á\8aO\83I\83u\83W\83F\83N\83g\82ð\8d\\92z\82µ\82Ü\82·\81B
+        * \param v_message \83\81\83b\83Z\81[\83W
+        */
+       JVMException( const char* v_message );
+
+       /*!
+        * JavaVM\8fã\82Å\97á\8aO\82ª\94­\90\82µ\82Ä\82¢\82é\82©\83`\83F\83b\83N\82µ\81A\94­\90\82µ\82Ä\82¢\82ê\82ÎJVMException\97á\8aO\82ð\94­\90\82³\82¹\82Ü\82·\81B
+        * \param env JNI\83A\83N\83Z\83X\82Ì\82½\82ß\82Ì\83X\83\8c\83b\83h\82²\82Æ\82Ì\8aÂ\8b«
+        */
+       static void checkAndThrow( JNIEnv* env ) throw( JVMException );
+};
+
+#endif
diff --git a/jvmservice/JVMLauncher.cpp b/jvmservice/JVMLauncher.cpp
new file mode 100644 (file)
index 0000000..e58ebed
--- /dev/null
@@ -0,0 +1,147 @@
+#include "stdafx.h"
+
+#include <assert.h>
+#include <process.h>
+
+#include <exception>
+#include <fstream>
+
+#include "ConfigParser.hpp"
+#include "JavaVMMainThread.hpp"
+#include "EventLog.hpp"
+
+#include "JVMLauncher.hpp"
+
+JVMLauncher::JVMLauncher( JVMEventListener& v_eventListener ) throw ()
+       : eventListener_( v_eventListener )
+{
+}
+
+void JVMLauncher::preloadLibrary( const std::string& v_preloadConfPath ) throw ( Win32Exception )
+{
+       if( v_preloadConfPath.empty() ) {
+               return;
+       }
+
+       try{
+               std::ifstream fin;
+               fin.open( v_preloadConfPath.c_str() );
+               if( ! fin.is_open() ) {
+                       return;
+               }
+               
+               std::string line;
+               while( getline( fin, line ) ) {
+                       CHAR dllPath[ MAX_PATH ];
+                       ExpandEnvironmentStrings( line.c_str(), dllPath, MAX_PATH );
+                       LPCSTR p = dllPath;
+                       while(*p) {
+                               if( *p == '#' || *p == ';' ) {
+                                       break;
+                               }
+                               if( ! ( *p > 0 && *p <= ' ' ) ) {
+                                       if( LoadLibrary( p ) == NULL ) {
+                                               Win32Exception::throwWin32Exception( GetLastError() );
+                                       }
+                                       break;
+                               }
+                               p = CharNext( p );
+                       }
+               }
+               fin.close();
+       }
+       catch( const std::exception& v_exception ) {
+               eventListener_.notifyLibraryLoadFailure( v_exception.what() );
+               throw;
+       }
+       catch( ... ) {
+               eventListener_.notifyLibraryLoadFailure( "\95s\96¾\82È\97á\8aO\82É\82æ\82è\83\89\83C\83u\83\89\83\8a\82Ì\83\8d\81[\83h\82ª\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+               throw Win32Exception( "\95s\96¾\82È\97á\8aO\82É\82æ\82è\83\89\83C\83u\83\89\83\8a\82Ì\83\8d\81[\83h\82ª\8e¸\94s\82µ\82Ü\82µ\82½\81B", ERROR_FILE_NOT_FOUND );
+       }
+}
+
+void JVMLauncher::launchJVM( const std::string& v_configPath ) throw( std::exception )
+{
+       try{
+               if( pJVM_.get() != NULL ) {
+                       throw std::logic_error( "\82·\82Å\82ÉJVM\82Í\8aJ\8en\82³\82ê\82Ä\82¢\82Ü\82·\81B" );
+               }
+
+               ConfigParser parser;
+               parser.parse( v_configPath );
+
+               JavaVMMainThreadPtr pJVM( new JavaVMMainThread( eventListener_, parser.getJavaVMStartupInfo() ) );
+               pJVM->start();
+               pJVM_ = pJVM; // \8aJ\8en\82Å\82«\82½\82ç\83\8d\81[\83J\83\8b\95Ï\90\94\82©\82ç\83C\83\93\83X\83^\83\93\83X\95Ï\90\94\82É\88Ú\93®\82·\82é
+               assert( pJVM.get() == NULL );
+
+               eventListener_.notifyJVMStarted();
+
+               const ConfigParser::size_type mx = parser.size();
+               ConfigParser::size_type idx = 1;
+               for( ConfigParser::const_iterator p=parser.begin(), last=parser.end();
+                       p != last;
+                       ++p, ++idx)
+               {
+                       const StartupInfo& startupInfo = *p;
+                       if( ! pJVM_->invokeClassMethod( startupInfo, ( idx == mx ) || ! startupInfo.isFork() ) ) {
+                               break;
+                       }
+               }
+       }
+       catch( const std::exception& v_exception ) {
+               eventListener_.notifyException( v_exception.what() );
+               throw;
+       }
+       catch( ... ) {
+               eventListener_.notifyException( "JVMLauncher#execute\82Å\95s\96¾\82È\97á\8aO\82ª\94­\90\82µ\82Ü\82µ\82½\81B" );
+               throw std::runtime_error( "JVMLauncher#execute\82Å\95s\96¾\82È\97á\8aO\82ª\94­\90\82µ\82Ü\82µ\82½\81B" );
+       }
+}
+
+unsigned __stdcall JVMLauncher::stopThreadProc( void* v_pData ) throw()
+{
+       JVMLauncher* me = reinterpret_cast<JVMLauncher*>( v_pData );
+       assert( me != NULL );
+
+       try{
+               JavaVMMainThread& jvm = *me->pJVM_.get();
+               jvm.stopInterrupt();
+               return 0;
+       }
+       catch( const std::exception& v_exception ) {
+               std::string mes( "JVM\82Ì\92â\8e~\97v\8b\81\82ª\97á\8aO\82É\82æ\82è\8e¸\94s\82µ\82Ü\82µ\82½\81B:" );
+               mes += v_exception.what();
+               me->eventListener_.notifyException( mes.c_str() );
+       }
+       catch( ... ) {
+               me->eventListener_.notifyException( "JVM\82Ì\92â\8e~\97v\8b\81\82ª\95s\96¾\82È\97á\8aO\82É\82æ\82è\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+       }
+
+       me->eventListener_.notifyJVMAborted();
+       exit( 3 );
+       return 0;
+}
+
+bool JVMLauncher::shutdown() throw()
+{
+       assert( pJVM_.get() != NULL );
+       
+       unsigned tid = 0;
+       HANDLE hThread = (HANDLE) _beginthreadex( NULL, 0, stopThreadProc, this, 0, &tid );
+       if( hThread != NULL ) {
+               CloseHandle( hThread );
+               return true;
+       }
+       eventListener_.notifyException( "JVM\82Ì\92â\8e~\97v\8b\81\83X\83\8c\83b\83h\82ª\8dì\90¬\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½\81B" );
+       return false;
+}
+
+void JVMLauncher::switchToJVM() throw()
+{
+       assert( pJVM_.get() != NULL );
+
+       JavaVMMainThread& jvm = *pJVM_.get();
+       jvm.waitForFinishedAll();
+}
+
diff --git a/jvmservice/JVMLauncher.hpp b/jvmservice/JVMLauncher.hpp
new file mode 100644 (file)
index 0000000..5bb7f7a
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef INCLUDE_H_JVMLAUNCHER
+#define INCLUDE_H_JVMLAUNCHER
+
+#include "JavaVMCallback.hpp"
+#include "JavaVMMainThread.hpp"
+
+#include "Win32Exception.hpp"
+
+#include <string>
+#include <memory>
+
+class JVMLauncher
+{
+private:
+       JVMLauncher( const JVMLauncher& ); //<! \8eÀ\91\95\82È\82µ
+       operator=( const JVMLauncher& ); //<! \8eÀ\91\95\82È\82µ
+
+public:
+       JVMLauncher( JVMEventListener& v_eventListener ) throw ();
+       void preloadLibrary( const std::string& v_preloadConfPath ) throw ( Win32Exception );
+       void launchJVM( const std::string& v_configPath ) throw ( std::exception );
+       void switchToJVM() throw();
+       bool shutdown() throw();
+
+private:
+       static unsigned __stdcall stopThreadProc( void* v_pData ) throw();
+
+       JVMEventListener& eventListener_;
+       typedef std::auto_ptr<JavaVMMainThread> JavaVMMainThreadPtr;
+       JavaVMMainThreadPtr pJVM_;
+};
+
+#endif
diff --git a/jvmservice/JVMStartupInfo.cpp b/jvmservice/JVMStartupInfo.cpp
new file mode 100644 (file)
index 0000000..5f59680
--- /dev/null
@@ -0,0 +1,67 @@
+#include "stdafx.h"
+
+#include "JavaVMStartupInfo.hpp"
+
+JavaVMStartupInfo::JavaVMStartupInfo( const bool v_ignoreUnrecognized ) throw()
+       : ignoreUnrecognized_( v_ignoreUnrecognized )
+{
+}
+
+JavaVMStartupInfo::JavaVMStartupInfo( const JavaVMStartupInfo& v_other ) throw()
+       : ignoreUnrecognized_( v_other.ignoreUnrecognized_ )
+       , options_( v_other.options_ )
+{
+}
+
+JavaVMStartupInfo& JavaVMStartupInfo::operator=( const JavaVMStartupInfo& v_other ) throw()
+{
+       if( this != &v_other ) {
+               ignoreUnrecognized_ = v_other.ignoreUnrecognized_;
+               options_ = v_other.options_;
+       }
+       return *this;
+}
+
+JavaVMStartupInfo::~JavaVMStartupInfo() throw()
+{
+}
+
+bool JavaVMStartupInfo::isIgnoreUnrecognized() const throw()
+{
+       return ignoreUnrecognized_;
+}
+
+JavaVMStartupInfo::iterator JavaVMStartupInfo::begin() throw()
+{
+       return options_.begin();
+}
+
+JavaVMStartupInfo::const_iterator JavaVMStartupInfo::begin() const throw()
+{
+       return options_.begin();
+}
+
+JavaVMStartupInfo::iterator JavaVMStartupInfo::end() throw()
+{
+       return options_.end();
+}
+
+JavaVMStartupInfo::const_iterator JavaVMStartupInfo::end() const throw()
+{
+       return options_.end();
+}
+
+JavaVMStartupInfo::size_type JavaVMStartupInfo::size() const throw()
+{
+       return options_.size();
+}
+
+bool JavaVMStartupInfo::push_back( const std::string& v_arg ) throw()
+{
+       if( ! v_arg.empty() ) {
+               options_.push_back( v_arg );
+               return true;
+       }
+       return false;
+}
+
diff --git a/jvmservice/JVMThreadAttacher.cpp b/jvmservice/JVMThreadAttacher.cpp
new file mode 100644 (file)
index 0000000..49c87a9
--- /dev/null
@@ -0,0 +1,49 @@
+#include "stdafx.h"
+
+#include "JVMThreadAttacher.hpp"
+
+#include <assert.h>
+
+/*!
+ * \83X\83\8c\83b\83h\82É\83A\83^\83b\83`\82µ\82Ü\82·\81B
+ * \82·\82Å\82É\83A\83^\83b\83`\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\82È\82É\82à\82µ\82Ü\82¹\82ñ\81B
+ * \83A\83^\83b\83`\82Å\82«\82È\82¢\8fê\8d\87\82Í\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+ * \param v_jvm JavaVM\82Ö\82Ì\83|\83C\83\93\83^
+ */
+JVMThreadAttacher::JVMThreadAttacher( JavaVM* v_jvm ) throw ( std::runtime_error )
+       : jvm_( v_jvm )
+       , env_( NULL )
+       , attached_( false )
+{
+       //required:
+       assert( v_jvm != NULL );
+
+       //do:
+       if( jvm_->GetEnv( (void**) &env_, JNI_VERSION_1_2 ) != JNI_OK || env_ == NULL ) {
+               // \83A\83^\83b\83`\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í\83A\83^\83b\83`\82·\82é\81B
+               JavaVMAttachArgs attach_args;
+               attach_args.version = JNI_VERSION_1_2;
+               attach_args.name = NULL;
+               attach_args.group = NULL;
+               if( jvm_->AttachCurrentThread( (void**) &env_, &attach_args ) != 0 || env_ == NULL ) {
+                       throw std::runtime_error( "\83X\83\8c\83b\83h\82É\83A\83^\83b\83`\82Å\82«\82Ü\82¹\82ñ\81B" );
+               }
+               attached_ = true;
+       }
+}
+
+/*!
+ * \83A\83^\83b\83`\82³\82ê\82½\8fê\8d\87\82Í\81A\82»\82Ì\83A\83^\83b\83`\82ð\89ð\8f\9c\82µ\82Ü\82·\81B
+ * \82±\82Ì\83I\83u\83W\83F\83N\83g\82É\82æ\82è\83A\83^\83b\83`\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í\89½\82à\82µ\82Ü\82¹\82ñ\81B
+ */
+JVMThreadAttacher::~JVMThreadAttacher() throw()
+{
+       if( attached_ ) {
+               jvm_->DetachCurrentThread();
+       }
+}
+
+JNIEnv* JVMThreadAttacher::getJNIEnv()
+{
+       return env_;
+}
diff --git a/jvmservice/JVMThreadAttacher.hpp b/jvmservice/JVMThreadAttacher.hpp
new file mode 100644 (file)
index 0000000..d476c24
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef INCLUDE_H_JVMTHREADATTACHER
+#define INCLUDE_H_JVMTHREADATTACHER
+
+/*!
+ * \83l\83C\83e\83B\83u\83X\83\8c\83b\83h\82ðJAVA\83X\83\8c\83b\83h\82É\83A\83^\83b\83`\82µ\82Ü\82·\81B
+ * \82·\82Å\82É\83A\83^\83b\83`\8dÏ\82Ý\82Å\82 \82ê\82Î\89½\82à\82µ\82Ü\82¹\82ñ\81B
+ */
+class JVMThreadAttacher
+{
+private:
+       JVMThreadAttacher( const JVMThreadAttacher& ); //<! \8eÀ\91\95\96³\82µ
+       operator=( const JVMThreadAttacher& ); //<! \8eÀ\91\95\96³\82µ
+
+public:
+       /*!
+        * \83X\83\8c\83b\83h\82É\83A\83^\83b\83`\82µ\82Ü\82·\81B
+        * \82·\82Å\82É\83A\83^\83b\83`\82³\82ê\82Ä\82¢\82é\8fê\8d\87\82Í\82È\82É\82à\82µ\82Ü\82¹\82ñ\81B
+        * \83A\83^\83b\83`\82Å\82«\82È\82¢\8fê\8d\87\82Í\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+        * \param v_jvm JavaVM\82Ö\82Ì\83|\83C\83\93\83^
+        */
+       JVMThreadAttacher( JavaVM* v_jvm ) throw ( std::runtime_error );
+
+       /*!
+        * \83A\83^\83b\83`\82³\82ê\82½\8fê\8d\87\82Í\81A\82»\82Ì\83A\83^\83b\83`\82ð\89ð\8f\9c\82µ\82Ü\82·\81B
+        * \82±\82Ì\83I\83u\83W\83F\83N\83g\82É\82æ\82è\83A\83^\83b\83`\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í\89½\82à\82µ\82Ü\82¹\82ñ\81B
+        */
+       ~JVMThreadAttacher() throw();
+
+       /*!
+        * JAVA\83X\83\8c\83b\83h\82²\82Æ\82ÌJNI\8aÂ\8b«\82Ö\82Ì\83|\83C\83\93\83^\82ð\8eæ\93¾\82µ\82Ü\82·\81B
+        * \return JNI\8aÂ\8b«\82Ö\82Ì\83|\83C\83\93\83^
+        */
+       JNIEnv* getJNIEnv();
+
+private:
+       JavaVM* jvm_;
+       JNIEnv* env_;
+       bool attached_;
+};
+
+#endif
diff --git a/jvmservice/JavaVMCallback.cpp b/jvmservice/JavaVMCallback.cpp
new file mode 100644 (file)
index 0000000..eab0411
--- /dev/null
@@ -0,0 +1,16 @@
+#include "stdafx.h"
+
+#include "JavaVMCallback.hpp"
+
+JavaVMCallback::JavaVMCallback()
+       : onJVMStarted( NULL )
+       , onJVMNormalExit( NULL )
+       , onJVMExit( NULL )
+       , onJVMAbort( NULL )
+       , onJVMVfprintf( NULL )
+       , onJVMNotifyException( NULL )
+       , onJVMNotifyPreloadLibFailure( NULL )
+       , onJVMThreadNormalyTerminated( NULL )
+       , onJVMThreadAbnormalTerminated( NULL )
+{
+}
diff --git a/jvmservice/JavaVMCallback.hpp b/jvmservice/JavaVMCallback.hpp
new file mode 100644 (file)
index 0000000..2442520
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef INCLUDE_H_JAVAVMCALLBACK
+#define INCLUDE_H_JAVAVMCALLBACK
+
+class JVMEventListener
+{
+public:
+       virtual ~JVMEventListener() throw() {}
+
+       virtual void notifyLibraryLoadFailure( const std::string& v_dllPath ) throw() = 0;
+
+       virtual void notifyJVMStarted() throw() = 0;
+
+       /*!
+        * JavaVM\82ª\8fI\97¹\82µ\82½\82±\82Æ\82ð\92Ê\92m\82µ\82Ü\82·\81B
+        * \82±\82Ì\83R\81[\83\8b\83o\83b\83N\82©\82ç\96ß\82é\82Æexit(0)\82Ì\8cÄ\82Ñ\8fo\82µ\82ª\8ds\82í\82ê\82é\82½\82ß\81A
+        * \95K\97v\82È\82ç\82Î\81A\82±\82Ì\83R\81[\83\8b\83o\83b\83N\8fã\82Åexit()\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82à\82©\82Ü\82¢\82Ü\82¹\82ñ\81B
+        */
+       virtual void notifyJVMExited( int v_exitCode ) throw() = 0;
+
+       /*!
+        * JavaVM\82ª\88Ù\8fí\8fI\97¹\82µ\82½\82±\82Æ\82ð\92Ê\92m\82µ\82Ü\82·\81B
+        * \82±\82Ì\83R\81[\83\8b\83o\83b\83N\82©\82ç\96ß\82é\82Æexit(3)\82Ì\8cÄ\82Ñ\8fo\82µ\82ª\8ds\82í\82ê\82é\82½\82ß\81A
+        * \95K\97v\82È\82ç\82Î\81A\82±\82Ì\83R\81[\83\8b\83o\83b\83N\8fã\82Åexit()\82ð\8cÄ\82Ñ\8fo\82µ\82Ä\82à\82©\82Ü\82¢\82Ü\82¹\82ñ\81B
+        */
+       virtual void notifyJVMAborted() throw() = 0;
+
+       virtual void notifyException( const std::string& v_target ) throw() = 0;
+
+       virtual int notifyJVMLog( FILE* v_fp, const char* v_format, va_list v_args ) throw() = 0;
+
+       virtual void notifyJVMThreadNormalyTerminated( const std::string& v_target ) throw() = 0;
+       
+       virtual void notifyJVMThreadAbnomalTerminated( const std::string& v_target, const std::string& v_reason ) throw() = 0;
+};
+
+#endif
diff --git a/jvmservice/JavaVMMainThread.cpp b/jvmservice/JavaVMMainThread.cpp
new file mode 100644 (file)
index 0000000..773d30b
--- /dev/null
@@ -0,0 +1,378 @@
+#include "stdafx.h"
+
+#include "JavaVMMainThread.hpp"
+
+#include "JVMThreadAttacher.hpp"
+
+#include <assert.h>
+#include <process.h>
+
+namespace
+{
+       volatile LONG run_ = 1L;
+       volatile LONG lock_ = 0L;
+
+       JVMEventListener* pEventListener_;
+}
+
+///////////////
+
+JavaVMMainThread::InvokeInfoRef::InvokeInfoData_::InvokeInfoData_( JavaVMMainThread* v_pThis, const StartupInfo& v_startupInfo, EventRef& v_hStarted ) throw()
+       : pThis_( v_pThis )
+       , startupInfo_( v_startupInfo )
+       , hStarted_( v_hStarted )
+{
+       assert( v_pThis != NULL );
+}
+
+JavaVMMainThread::InvokeInfoRef::InvokeInfoRef( JavaVMMainThread* v_pThis, const StartupInfo& v_startupInfo, EventRef& v_hStarted ) throw()
+{
+       assert( v_pThis != NULL );
+
+       pInvokeInfoData_ = new InvokeInfoData_( v_pThis, v_startupInfo, v_hStarted );
+       while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+               Sleep( 0 );
+       }
+       pInvokeInfoData_->pThis_ = v_pThis;
+       pInvokeInfoData_->startupInfo_ = v_startupInfo;
+       pInvokeInfoData_->hStarted_ = v_hStarted;
+       pInvokeInfoData_->ref_ = 1;
+       InterlockedExchange( &lock_, 0L );
+}
+
+JavaVMMainThread::InvokeInfoRef::InvokeInfoRef( const InvokeInfoRef& v_other ) throw()
+{
+       while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+               Sleep( 0 );
+       }
+       __try{
+               pInvokeInfoData_ = v_other.pInvokeInfoData_;
+               pInvokeInfoData_->ref_++;
+       }
+       __finally {
+               InterlockedExchange( &lock_, 0L );
+       }
+}
+
+JavaVMMainThread::InvokeInfoRef& JavaVMMainThread::InvokeInfoRef::operator=( const InvokeInfoRef& v_other ) throw()
+{
+       if( this != &v_other ) {
+               while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+                       Sleep( 0 );
+               }
+               __try{
+                       if( --pInvokeInfoData_->ref_ == 0 ) {
+                               delete pInvokeInfoData_;
+                       }
+                       pInvokeInfoData_ = v_other.pInvokeInfoData_;
+                       pInvokeInfoData_->ref_++;
+               }
+               __finally {
+                       InterlockedExchange( &lock_, 0L );
+               }
+       }
+       return *this;
+}
+
+JavaVMMainThread::InvokeInfoRef::~InvokeInfoRef() throw()
+{
+       while( InterlockedExchange( &lock_, 1L ) != 0L ) {
+               Sleep( 0 );
+       }
+       __try{
+               if( --pInvokeInfoData_->ref_ == 0 ) {
+                       delete pInvokeInfoData_;
+               }
+       }
+       __finally {
+               InterlockedExchange( &lock_, 0L );
+       }
+}
+
+void JavaVMMainThread::InvokeInfoRef::setExceptionReason( const std::string& v_exceptionReason ) throw()
+{
+       pInvokeInfoData_->exceptionReason_ = v_exceptionReason;
+}
+
+const StartupInfo& JavaVMMainThread::InvokeInfoRef::getStartupInfo() const throw()
+{
+       return pInvokeInfoData_->startupInfo_;
+}
+
+const std::string& JavaVMMainThread::InvokeInfoRef::getExceptionReason() const throw()
+{
+       return pInvokeInfoData_->exceptionReason_;
+}
+
+JavaVMMainThread* JavaVMMainThread::InvokeInfoRef::getJavaVMMainThread() const throw()
+{
+       return pInvokeInfoData_->pThis_;
+}
+
+void JavaVMMainThread::InvokeInfoRef::signal() throw()
+{
+       pInvokeInfoData_->hStarted_.signal( true );
+}
+
+///////////////
+
+JavaVMMainThread::JavaVMMainThread( JVMEventListener& v_eventListener, const JavaVMStartupInfo& v_jvmStartupInfo )  throw ( std::exception )
+       : jvm_( NULL )
+       , jvmStartupInfo_( v_jvmStartupInfo )
+{
+       if( InterlockedIncrement( &run_ ) < 0L ) {
+               throw std::runtime_error( "JVM\82ð\90V\82½\82É\8dì\90¬\82·\82é\82±\82Æ\82ª\82Å\82«\82Ü\82¹\82ñ\81B" );
+       }
+       pEventListener_ = &v_eventListener;
+}
+
+JavaVMMainThread::~JavaVMMainThread() throw()
+{
+}
+
+void JavaVMMainThread::start() throw ( std::exception )
+{
+       //required:
+       assert( jvm_ == NULL && "\82·\82Å\82ÉJVM\82ª\8bN\93®\82³\82ê\82Ä\82¢\82Ü\82·\81B" );
+       if( jvm_ != NULL ) {
+               throw std::logic_error( "\82·\82Å\82ÉJVM\82ª\8bN\93®\82³\82ê\82Ä\82¢\82Ü\82·\81B" );
+       }
+
+       //do:
+       JavaVMInitArgs vm_args;
+       std::vector<JavaVMOption> options( jvmStartupInfo_.size() + 3 );
+       int idx=0;
+       for( StartupInfo::const_iterator p=jvmStartupInfo_.begin(), last=jvmStartupInfo_.end();
+               p != last;
+               ++p, ++idx)
+       {
+               const std::string& option = *p;
+               options[ idx ].optionString = (char*) option.c_str();
+               options[ idx ].extraInfo = NULL;
+       }
+
+       options[ idx + 0 ].optionString = "exit";
+       options[ idx + 0 ].extraInfo = jvm_exit;
+       options[ idx + 1 ].optionString = "abort";
+       options[ idx + 1 ].extraInfo = jvm_abort;
+       options[ idx + 2 ].optionString = "vfprintf";
+       options[ idx + 2 ].extraInfo = jvm_vfprintf;
+
+       vm_args.version = JNI_VERSION_1_2;
+       vm_args.options = &options[0];
+       vm_args.nOptions = (int) options.size();
+       vm_args.ignoreUnrecognized = jvmStartupInfo_.isIgnoreUnrecognized() ? JNI_TRUE : JNI_FALSE;
+
+       JNIEnv* env;
+
+       bool created = false;
+       try{
+               if( JNI_CreateJavaVM( &jvm_, (void **)&env, &vm_args) == 0 ) {
+                       created = true;
+               }
+       }
+       catch( ... ) {
+               created = false;
+       }
+       if( ! created ) {
+               throw std::runtime_error( "JVM\82Ì\8bN\93®\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+       }
+}
+
+bool JavaVMMainThread::invokeClassMethod( const StartupInfo& v_startupInfo, bool v_wait ) throw( std::exception )
+{
+       //required:
+       assert( jvm_ != NULL && "JVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       if( jvm_ == NULL ) {
+               throw std::logic_error( "JVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+
+       //do:
+       JNIEnv* env;
+       if( jvm_->GetEnv( (void**) &env, JNI_VERSION_1_2 ) != JNI_OK || env == NULL ) {
+               throw std::runtime_error( "\83X\83\8c\83b\83h\82ªJVM\82É\83A\83^\83b\83`\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+
+       EventRef hStarted;
+       InvokeInfoRef invokeInfo( this, v_startupInfo, hStarted );
+
+       unsigned int threadid = 0;
+       HANDLE hThread = (HANDLE) _beginthreadex(
+               NULL,
+               0,
+               invokeClassMethodProc,
+               &invokeInfo,
+               0,
+               &threadid
+               );
+       if( hThread == NULL ) {
+               throw std::runtime_error( "\83X\83\8c\83b\83h\82ª\8dì\90¬\82Å\82«\82Ü\82¹\82ñ\81B" );
+       }
+
+       hStarted.waitForSignal();
+
+       bool result = true;
+       if( v_wait ) {
+               WaitForSingleObject( hThread, INFINITE );
+               result = invokeInfo.getExceptionReason().empty();
+       }
+       CloseHandle( hThread );
+
+       return result;
+}
+
+void JavaVMMainThread::waitForFinishedAll() throw ( std::exception )
+{
+       assert( jvm_ != NULL && "JVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       if( jvm_ == NULL ) {
+               throw std::logic_error( "JVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+
+       jvm_->DestroyJavaVM();
+}
+
+void JavaVMMainThread::stopInterrupt() throw ( std::exception )
+{
+       //required:
+       assert( jvm_ != NULL && "JVM\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       if( jvm_ == NULL ) {
+               throw std::logic_error( "JVM\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+
+       //do:
+       JVMThreadAttacher jvmAttachThread( jvm_ );
+       JNIEnv* env = jvmAttachThread.getJNIEnv();
+
+       jclass systemClass = env->FindClass( "java/lang/System" );
+       JVMException::checkAndThrow( env );
+
+       jmethodID exitMethod = env->GetStaticMethodID( systemClass, "exit", "(I)V");
+       JVMException::checkAndThrow( env );
+
+       env->CallStaticVoidMethod( systemClass, exitMethod, (jint)0 );
+       JVMException::checkAndThrow( env );
+
+       throw std::runtime_error( "stopInterrupt\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+}
+
+void __stdcall JavaVMMainThread::jvm_exit( jint v_exitCode )
+{
+       pEventListener_->notifyJVMExited( v_exitCode );
+       exit( v_exitCode );
+}
+
+void __stdcall JavaVMMainThread::jvm_abort()
+{
+       pEventListener_->notifyJVMAborted();
+       exit( 3 ); // abort
+}
+
+jint __stdcall JavaVMMainThread::jvm_vfprintf( FILE* v_fp, const char* v_format, va_list v_args )
+{
+       return pEventListener_->notifyJVMLog( v_fp, v_format, v_args );
+}
+
+
+std::string JavaVMMainThread::ConvertToJNIClassName( const std::string& v_className ) throw() {
+       std::vector<char> buf( v_className.size() + 1 );
+       strcpy( &buf[0], v_className.c_str() );
+       for( std::vector<char>::iterator p=buf.begin(), last=buf.end();
+               p != last;
+               ++p)
+       {
+               if( *p == '.' ) {
+                       *p = '/';
+               }
+       }
+       return std::string( &buf[0] );
+}
+
+unsigned __stdcall JavaVMMainThread::invokeClassMethodProc( void* v_pData )
+{
+       //required:
+       assert( v_pData != NULL );
+       InvokeInfoRef invokeInfo = *reinterpret_cast<InvokeInfoRef*>( v_pData );
+       JavaVMMainThread* me = invokeInfo.getJavaVMMainThread();
+       assert( me != NULL );
+
+       // \83X\83\8c\83b\83h\91Ò\8b@\83C\83x\83\93\83g\82ª\8am\8eÀ\82É\83V\83O\83i\83\8b\82É\82È\82é\82±\82Æ\82ð\95Û\8fØ\82·\82é
+       EventSentinel<InvokeInfoRef> sentinel( invokeInfo );
+
+       //do:
+       try{
+               const StartupInfo& startupInfo = invokeInfo.getStartupInfo();
+
+               JavaVM* jvm = me->jvm_;
+               assert( jvm != NULL && "JVM\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+               if( jvm == NULL ) {
+                       throw std::logic_error( "JVM\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+               }
+
+               // JVM\82É\83X\83\8c\83b\83h\82ð\83A\83^\83b\83`\82·\82é\81B
+               JVMThreadAttacher jvmAttachThread( jvm );
+               JNIEnv* env = jvmAttachThread.getJNIEnv();
+
+               const std::string mainClassName = ConvertToJNIClassName( startupInfo.getMainClassName() );
+               jclass mainClass = env->FindClass( mainClassName.c_str() );
+               JVMException::checkAndThrow( env );
+
+               const std::string mainMethodName = startupInfo.getMainMethodName();
+               jmethodID mainMethodID = env->GetStaticMethodID( mainClass, mainMethodName.c_str(), "([Ljava/lang/String;)V");
+               JVMException::checkAndThrow( env );
+
+               // \8bN\93®\88ø\90\94\83I\83v\83V\83\87\83\93\82Ì\8d\\92z
+               jclass stringClass = env->FindClass( "java/lang/String" );
+               JVMException::checkAndThrow( env );
+
+               jobjectArray args = env->NewObjectArray( (jsize) startupInfo.size(), stringClass, NULL );
+               JVMException::checkAndThrow( env );
+
+               int idx=0;
+               for( StartupInfo::const_iterator p=startupInfo.begin(), last=startupInfo.end();
+                       p != last;
+                       ++p, ++idx)
+               {
+                       const std::string arg = *p;
+                       jstring arg1 = env->NewStringUTF( arg.c_str() );
+                       env->SetObjectArrayElement( args, idx, arg1 );
+                       JVMException::checkAndThrow( env );
+               }
+
+               // \8cÄ\82Ñ\8fo\82µ\82à\82Æ\82Ì\91Ò\8b@\89ð\8f\9c
+               me->notifyThreadEvent( ThreadEvent_Starting, invokeInfo );
+               sentinel.signal();
+
+               // \83\81\83\\83b\83h\82Ì\8bN\93®
+               env->CallStaticVoidMethod( mainClass, mainMethodID, args );
+               JVMException::checkAndThrow( env );
+       }
+       catch( const std::exception& v_exception ) {
+               invokeInfo.setExceptionReason( v_exception.what() );
+       }
+       catch( ... ) {
+               invokeInfo.setExceptionReason( "\95s\96¾\82È\97á\8aO\82É\82æ\82è\83X\83\8c\83b\83h\82ª\8fI\97¹\82µ\82Ü\82µ\82½\81B" );
+       }
+
+       me->notifyThreadEvent( ThreadEvent_Terminated, invokeInfo );
+       return 0;
+}
+
+void JavaVMMainThread::notifyThreadEvent( ThreadEvent v_eventType, const InvokeInfoRef& v_invokeInfo ) throw()
+{
+       const std::string methodSig =
+               v_invokeInfo.getStartupInfo().getMainClassName() + "#" + 
+               v_invokeInfo.getStartupInfo().getMainMethodName() + "(java.lang.String[])";
+
+       if( v_eventType == ThreadEvent_Starting ) {
+               // do nothing.
+       }
+       else if( v_eventType == ThreadEvent_Terminated ) {
+               const std::string& exceptionReason = v_invokeInfo.getExceptionReason();
+               if( ! exceptionReason.empty() ) {
+                       pEventListener_->notifyJVMThreadAbnomalTerminated( methodSig, exceptionReason );
+               }
+               else {
+                       pEventListener_->notifyJVMThreadNormalyTerminated( methodSig );
+               }
+       }
+}
diff --git a/jvmservice/JavaVMMainThread.hpp b/jvmservice/JavaVMMainThread.hpp
new file mode 100644 (file)
index 0000000..0de2b3b
--- /dev/null
@@ -0,0 +1,185 @@
+#ifndef INCLUDE_H_JAVAVMMAINTHREAD
+#define INCLUDE_H_JAVAVMMAINTHREAD
+
+#include <string>
+#include <vector>
+#include <exception>
+
+#include "JavaVMCallback.hpp"
+#include "JVMException.hpp"
+#include "StartupInfo.hpp"
+#include "JavaVMStartupInfo.hpp"
+#include "Event.hpp"
+
+class JavaVMMainThread
+{
+public:
+       /*!
+        * JVM\82Ì\8bN\93®\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82Ä\8d\\92z\82µ\82Ü\82·\81B
+        * \8c»\8fó(JNI1.2)\82Å\82ÍJVM\82Í\88ê\89ñ\82µ\82©\8dì\90¬\82Å\82«\82È\82¢\82½\82ß\81A
+        * \82±\82Ì\83I\83u\83W\83F\83N\83g\82à\88ê\93x\82µ\82©\8d\\92z\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81
+        * \param v_callback JavaVM\82Ì\83C\83x\83\93\83g\82ð\92Ê\92m\82µ\82Ü\82·\81B
+        * \param v_jvmStartupInfo JVM\82Ì\8bN\93®\83p\83\89\83\81\81[\83^
+        * \exception std::exception JVM\82ð\90V\82½\82É\8d\\92z\82Å\82«\82È\82¢\8fê\8d\87
+        */
+       JavaVMMainThread( JVMEventListener& v_eventListener, const JavaVMStartupInfo& v_jvmStartupInfo ) throw ( std::exception );
+       
+       /*!
+        * \83f\83X\83g\83\89\83N\83^
+        */
+       ~JavaVMMainThread() throw();
+
+       /*!
+        * \8c»\8dÝ\82Ì\83X\83\8c\83b\83h\8fã\82ÅJavaVM\82Ì\83\81\83C\83\93\83X\83\8c\83b\83h\82ð\8aJ\8en\82µ\82Ü\82·\81B
+        * \8aJ\8en\82Å\82«\82È\82¢\82©\81A\82·\82Å\82É\8aJ\8en\8dÏ\82Ý\82Å\82 \82ê\82Î\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+        * \exception std::exception JVM\82ð\90V\82½\82É\8aJ\8en\82Å\82«\82È\82¢\8fê\8d\87
+        */
+       void start() throw ( std::exception );
+
+       /*!
+        * \8c»\8dÝ\82Ì\83X\83\8c\83b\83h\82ÅJavaVM\82Ì\82·\82×\82Ä\82Ì\83X\83\8c\83b\83h\82Ì\8fI\97¹\82ð\91Ò\8b@\82µ\82Ü\82·\81B
+        * JavaVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\82Í\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+        * \81¦ \8c»\8fó(JNI1.2)\82Å\82Í\81AJVM\82Í\94j\8aü\82³\82ê\82é\82±\82Æ\82Í\82 \82è\82Ü\82¹\82ñ\81B
+        * \exception std::exception \97á\8aO
+        */
+       void waitForFinishedAll() throw ( std::exception );
+
+       /*!
+        * \90V\82µ\82¢\83X\83\8c\83b\83h\82ð\8dì\90¬\82µ\81A\83\81\83\\83b\83h\82ð\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B
+        * JavaVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\82¨\82æ\82Ñ\83\81\83\\83b\83h\82Ì\8cÄ\82Ñ\8fo\82µ\82ª\82Å\82«\82È\82¢\8fê\8d\87\82Í\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+        * v_wait\82ªtrue\82Ì\8fê\8d\87\82Í\83X\83\8c\83b\83h\82ª\8fI\97¹\82·\82é\82Ü\82Å\90§\8cä\82ð\96ß\82µ\82Ü\82¹\82ñ\81B
+        * \82»\82¤\82Å\82È\82¯\82ê\82Î\8a®\97¹\82ð\91Ò\82½\82¸\82É\90§\8cä\82ð\95Ô\82µ\82Ü\82·\81B
+        * \8a®\97¹\82ð\91Ò\8b@\82·\82é\8fê\8d\87\81A\82»\82Ì\83X\83\8c\83b\83h\82ª\97á\8aO\82ð\94­\90\82³\82¹\82Ä\82¢\82é\8fê\8d\87\82Ífalse\82ð\95Ô\82µ\82Ü\82·\81B
+        * \8a®\97¹\82ð\91Ò\8b@\82µ\82È\82¢\82©\81A\83X\83\8c\83b\83h\82ª\97á\8aO\82ð\94­\90\82³\82¹\82¸\82É\8fI\97¹\82µ\82½\8fê\8d\87\82Ítrue\82ð\95Ô\82µ\82Ü\82·\81B
+        * \param v_startupInfo \8bN\93®\83p\83\89\83\81\81[\83^
+        * \param v_wait \83X\83\8c\83b\83h\82Ì\8fI\97¹\82ð\91Ò\8b@\82·\82é\8fê\8d\87\81Atrue
+        * \return \90³\8fí\82È\82çtrue\81A\82»\82¤\82Å\82È\82¯\82ê\82Îfalse
+        * \exception std::exception \97á\8aO
+        */
+       bool invokeClassMethod( const StartupInfo& v_startupInfo, bool v_wait = false ) throw ( std::exception );
+
+       /*!
+        * \8c»\8dÝ\82Ì\83X\83\8c\83b\83h\82ðJavaVM\82É\90Ú\91±\82µ\81ASystem.exit()\82ð\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B
+        * \82±\82Ì\83\81\83\\83b\83h\82Í\8c\88\82µ\82Ä\90³\8fí\82É\95\9c\8bA\82µ\82Ü\82¹\82ñ\81B
+        * JavaVM\82ª\8aJ\8en\82³\82ê\82Ä\82¢\82È\82¢\8fê\8d\87\81A\82à\82µ\82­\82ÍSystem.exit()\82Ì\8cÄ\82Ñ\8fo\82µ\82ª\82Å\82«\82È\82¢\8fê\8d\87\82Í\97á\8aO\82ª\94­\90\82µ\82Ü\82·\81B
+        * \90³\8fí\82É\8cÄ\82Ñ\8fo\82³\82ê\82½\8fê\8d\87\81AJavaVM\82Íexit\83C\83x\83\93\83g\82ð\94­\90\82³\82¹\81A\82±\82ê\82Íexit\82ð\8cÄ\82Ñ\8fo\82µ\82Ü\82·\81B
+        * \exception std::exception \97á\8aO
+        */
+       void stopInterrupt() throw ( std::exception );
+
+protected:
+
+       enum ThreadEvent
+       {
+               ThreadEvent_Starting = 0,
+               ThreadEvent_Terminated = 1
+       };
+
+       /*!
+        * \83X\83\8c\83b\83h\82É\88ø\82«\93n\82·\82½\82ß\82Ì\83p\83\89\83\81\81[\83^\81B
+        */
+       class InvokeInfoRef
+       {
+       public:
+               InvokeInfoRef( JavaVMMainThread* v_pThis, const StartupInfo& v_startupInfo, EventRef& v_hStarted ) throw();
+               InvokeInfoRef( const InvokeInfoRef& v_other ) throw();
+               InvokeInfoRef& operator=( const InvokeInfoRef& v_other ) throw();
+               ~InvokeInfoRef() throw();
+
+               void setExceptionReason( const std::string& v_exceptionReason ) throw();
+               const StartupInfo& getStartupInfo() const throw();
+               const std::string& getExceptionReason() const throw();
+               JavaVMMainThread* getJavaVMMainThread() const throw();
+               void signal() throw();
+
+       private:
+               struct InvokeInfoData_
+               {
+                       InvokeInfoData_( JavaVMMainThread* v_pThis, const StartupInfo& v_startupInfo, EventRef& v_hStarted );
+
+                       /*!
+                       * \83X\83\8c\83b\83h\8cÄ\82Ñ\8fo\82µ\82à\82Æ
+                       */
+                       JavaVMMainThread* pThis_;
+
+                       /*!
+                       * JAVA\83\81\83\\83b\83hID\82É\88ø\82«\93n\82·\83p\83\89\83\81\81[\83^
+                       */
+                       StartupInfo startupInfo_;
+
+                       /*!
+                       * \97á\8aO\82É\82æ\82è\8fI\97¹\82µ\82½\8fê\8d\87\82Ì\8e\96\97R
+                       * \82È\82¯\82ê\82Î\8bó\82Å\82·\81B
+                       */
+                       std::string exceptionReason_;
+
+                       /*!
+                       * \83X\83\8c\83b\83h\82ª\8bN\93®\82µ\82½\82±\82Æ\82ð\8e¦\82·\83C\83x\83\93\83g\81B
+                       * \83X\83\8c\83b\83h\82Í\81AJVM\82É\83X\83\8c\83b\83h\82ð\83A\83^\83b\83`\82µ\81A
+                       * \82±\82Ì\83f\81[\83^\82ð\83R\83s\81[\82µ\82½\82 \82Æ\82É\83C\83x\83\93\83g\82ð\83V\83O\83i\83\8b\8fó\91Ô\82É\82µ\82Ü\82·\81B
+                       * \82»\82ê\82Ü\82Å\83X\83\8c\83b\83h\8dì\90¬\8c³\82Í\91Ò\8b@\82µ\82È\82¯\82ê\82Î\82È\82è\82Ü\82¹\82ñ\81B
+                       */
+                       EventRef hStarted_;
+
+                       /*!
+                        * \8eQ\8fÆ\83J\83E\83\93\83g
+                        */
+                       int ref_;
+               };
+               
+               mutable InvokeInfoData_* pInvokeInfoData_;
+       };
+
+       /*!
+        * \83X\83\8c\83b\83h\82©\82ç\82Ì\8aJ\8en\81^\8fI\97¹\83C\83x\83\93\83g\82ð\8eó\82¯\8eæ\82é\83n\83\93\83h\83\89\82Å\82·\81B
+        * \param v_eventType \83C\83x\83\93\83g\83^\83C\83v
+        * \param v_invokeInfo \8bN\93®\83p\83\89\83\81\81[\83^
+        */
+       void notifyThreadEvent( ThreadEvent v_eventType, const InvokeInfoRef& v_invokeInfo ) throw();
+
+       /*!
+        * \83h\83b\83g\95\\8bL\82Ì\83N\83\89\83X\96¼\82ðJNI\82ª\97v\8b\81\82·\82é\83X\83\89\83b\83V\83\85\8bæ\90Ø\82è\82Ì\82à\82Ì\82É\95Ï\8a·\82µ\82Ä\95Ô\82µ\82Ü\82·\81B
+        */
+       static std::string ConvertToJNIClassName( const std::string& v_className ) throw();
+
+       /*!
+        * \83X\83\8c\83b\83h\82Ì\83G\83\93\83g\83\8a\82Å\82·\81B
+        * \param v_pData \83X\83\8c\83b\83h\82É\93n\82³\82ê\82éInvokeInfo\8d\\91¢\91Ì\82Ö\82Ì\83|\83C\83\93\83^
+        */
+       static unsigned __stdcall invokeClassMethodProc( void* v_pData ) throw();
+
+       /*!
+        * JVM\8fã\82Å\96¾\8e¦\93I\82Éexit\82³\82ê\82½\8fê\8d\87\82É\8cÄ\82Ñ\8fo\82³\82ê\82Ü\82·\81B
+        * \90§\8cä\82Í\95Ô\82³\82¸\82Éexit\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+        */
+       static void __stdcall jvm_exit( jint );
+
+       /*!
+        * JVM\8fã\82Åabort\82³\82ê\82½\8fê\8d\87\82É\8cÄ\82Ñ\8fo\82³\82ê\82Ü\82·\81B
+        * \90§\8cä\82Í\95Ô\82³\82¸\82Éabort\82·\82é\95K\97v\82ª\82 \82è\82Ü\82·\81B
+        */
+       static void __stdcall jvm_abort();
+
+       /*!
+        * JVM\82ª\83\81\83b\83Z\81[\83W\82ð\8fo\97Í\82·\82é\82½\82Ñ\82É\8cÄ\82Ñ\8fo\82³\82ê\82Ü\82·\81B
+        * \param v_fp \8fo\97Í\90æ
+        * \param v_format \83t\83H\81[\83}\83b\83g\8f\91\8e®
+        * \param v_args \88ø\90\94\83\8a\83X\83g
+        * \return \8f\91\82«\8d\9e\82Ý\95\8e\9a\90\94
+        */
+       static jint __stdcall jvm_vfprintf( FILE* v_fp, const char* v_format, va_list v_args );
+
+private:
+
+       /*!
+        * JavaVM\8bN\93®\83p\83\89\83\81\81[\83^
+        */
+       JavaVMStartupInfo jvmStartupInfo_;
+
+       /*!
+        * JavaVM\82Ö\82Ì\83|\83C\83\93\83^
+        */
+       JavaVM* jvm_;
+};
+
+#endif
diff --git a/jvmservice/JavaVMStartupInfo.hpp b/jvmservice/JavaVMStartupInfo.hpp
new file mode 100644 (file)
index 0000000..6b765e3
--- /dev/null
@@ -0,0 +1,40 @@
+#ifndef INCLUDE_H_JVMSTARTUPINFO
+#define INCLUDE_H_JVMSTARTUPINFO
+
+#include <vector>
+#include <string>
+
+class JavaVMStartupInfo
+{
+public:
+       typedef std::vector<std::string> StringVector;
+
+       typedef StringVector::iterator iterator;
+       typedef StringVector::const_iterator const_iterator;
+       typedef StringVector::value_type value_type;
+       typedef StringVector::size_type size_type;
+       typedef StringVector::reference reference;
+       typedef StringVector::const_reference const_reference;
+
+       JavaVMStartupInfo( const bool v_ignoreUnrecognized = true ) throw();
+       JavaVMStartupInfo( const JavaVMStartupInfo& v_other ) throw();
+       JavaVMStartupInfo& operator=( const JavaVMStartupInfo& v_other ) throw();
+       ~JavaVMStartupInfo() throw();
+
+       bool isIgnoreUnrecognized() const throw();
+
+       JavaVMStartupInfo::iterator begin() throw();
+       JavaVMStartupInfo::const_iterator begin() const throw();
+       JavaVMStartupInfo::iterator end() throw();
+       JavaVMStartupInfo::const_iterator end() const throw();
+       JavaVMStartupInfo::size_type size() const throw();
+       
+       bool push_back( const std::string& v_arg ) throw();
+
+private:
+       bool ignoreUnrecognized_;
+       StringVector options_;
+};
+
+
+#endif
diff --git a/jvmservice/MSG00409.bin b/jvmservice/MSG00409.bin
new file mode 100644 (file)
index 0000000..4ce73c7
Binary files /dev/null and b/jvmservice/MSG00409.bin differ
diff --git a/jvmservice/MSG00411.bin b/jvmservice/MSG00411.bin
new file mode 100644 (file)
index 0000000..55dd527
Binary files /dev/null and b/jvmservice/MSG00411.bin differ
diff --git a/jvmservice/ReadMe.txt b/jvmservice/ReadMe.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/jvmservice/Release/jvmservice.exe b/jvmservice/Release/jvmservice.exe
new file mode 100644 (file)
index 0000000..9c21d68
Binary files /dev/null and b/jvmservice/Release/jvmservice.exe differ
diff --git a/jvmservice/Release/jvmservice.preload b/jvmservice/Release/jvmservice.preload
new file mode 100644 (file)
index 0000000..fb53f80
--- /dev/null
@@ -0,0 +1,11 @@
+# 
+# jvmservice.exe\82Ì\83T\81[\83r\83X\8bN\93®\8e\9e\82É\83\8d\81[\83h\82³\82ê\82éDLL\82ð\83\8d\81[\83h\8f\87\82É\83t\83\8b\83p\83X\82Å\8ew\92è\82µ\82Ü\82·\81B
+# 
+
+##
+# \88È\89º\82ÉJavaVM\82Ì\88Ê\92u\82ð\83t\83\8b\83p\83X\82Å\8ew\92è\82µ\82Ä\82­\82¾\82³\82¢\81B
+
+C:\j2sdk1.4.2_08\jre\bin\client\jvm.dll
+
+# C:\j2sdk1.5\jre\bin\client\jvm.dll
+# C:\jdk1.3.1_15\jre\bin\hotspot\jvm.dll
diff --git a/jvmservice/ServiceControlManager.cpp b/jvmservice/ServiceControlManager.cpp
new file mode 100644 (file)
index 0000000..39e84fb
--- /dev/null
@@ -0,0 +1,352 @@
+#include "stdafx.h"
+
+#include "ServiceControlManager.hpp"
+#include "EventLog.hpp"
+
+#include <algorithm>
+#include <iterator>
+
+#include <assert.h>
+#include <string.h>
+
+////
+
+ServiceIdentifier::ServiceIdentifier( const std::string& v_serviceName ) throw( std::exception )
+       : serviceName_( v_serviceName )
+{
+       if( v_serviceName.empty() ) {
+               throw std::invalid_argument( "\83T\81[\83r\83X\96¼\82É\8bó\95\8e\9a\82Í\8ew\92è\82Å\82«\82Ü\82¹\82ñ\81B" );
+       }
+       for( std::string::const_iterator p = v_serviceName.begin(), last = v_serviceName.end();
+               p != last;
+               ++p )
+       {
+               const char c = *p;
+               if( ( c > 0 && c <= ' ' ) || c == '/' || c == '\\' || c == '\"' ) {
+                       throw std::invalid_argument( "\83T\81[\83r\83X\96¼\82É\8eg\82¦\82È\82¢\95\8e\9a\82ª\8aÜ\82Ü\82ê\82Ä\82¢\82Ü\82·\81B(\8bó\94\92\81A/\81A\\\81A\")" );
+               }
+       }
+}
+
+ServiceIdentifier::ServiceIdentifier( const ServiceIdentifier& v_other ) throw()
+       : serviceName_( v_other.serviceName_ )
+{
+}
+
+ServiceIdentifier& ServiceIdentifier::operator=( const ServiceIdentifier& v_other ) throw()
+{
+       if( this != &v_other ) {
+               serviceName_ = v_other.serviceName_;
+       }
+       return *this;
+}
+
+const std::string& ServiceIdentifier::getServiceName() const throw()
+{
+       return serviceName_;
+}
+
+////
+
+ServiceRegistParam::ServiceRegistParam( const std::string& v_serviceName, const std::string& v_displayName, const std::string& v_command ) throw ( std::exception )
+       : ServiceIdentifier( v_serviceName )
+       , displayName_( v_displayName.empty() ? v_serviceName : v_displayName )
+       , command_( v_command )
+{
+}
+
+ServiceRegistParam::ServiceRegistParam( const ServiceRegistParam& v_other ) throw()
+       : ServiceIdentifier( v_other )
+       , dependencies_( v_other.dependencies_ )
+       , displayName_( v_other.displayName_ )
+       , command_( v_other.command_ )
+{
+}
+
+ServiceRegistParam& ServiceRegistParam::operator=( const ServiceRegistParam& v_other ) throw()
+{
+       if( this != &v_other ) {
+               ServiceIdentifier::operator=( v_other );
+               dependencies_ = v_other.dependencies_;
+               displayName_ = v_other.displayName_;
+               command_ = v_other.command_;
+       }
+       return *this;
+}
+
+const std::string& ServiceRegistParam::getDisplayName() const throw()
+{
+       return displayName_;
+}
+
+const std::string& ServiceRegistParam::getCommand() const throw()
+{
+       return command_;
+}
+
+const ServiceRegistParam::StringVector& ServiceRegistParam::dependencies() const throw()
+{
+       return dependencies_;
+}
+
+ServiceRegistParam::StringVector& ServiceRegistParam::dependencies() throw()
+{
+       return dependencies_;
+}
+
+////
+
+ServiceControlManager::ServiceHandleHolder::ServiceHandleHolderData_::~ServiceHandleHolderData_()
+{
+       if( hService_ != NULL ) {
+               CloseServiceHandle( hService_ );
+       }
+}
+
+
+ServiceControlManager::ServiceHandleHolder::ServiceHandleHolder( SC_HANDLE v_hService ) throw()
+       : pData_( NULL )
+{
+       pData_ = new ServiceHandleHolderData_();
+       pData_->hService_ = v_hService;
+       pData_->ref_ = 1;
+}
+
+ServiceControlManager::ServiceHandleHolder::ServiceHandleHolder( const ServiceHandleHolder& v_other ) throw()
+{
+       pData_ = v_other.pData_;
+       pData_->ref_++;
+}
+
+ServiceControlManager::ServiceHandleHolder::~ServiceHandleHolder() throw()
+{
+       if( --pData_->ref_ == 0 ) {
+               delete pData_;
+       }
+}
+
+ServiceControlManager::ServiceHandleHolder& ServiceControlManager::ServiceHandleHolder::operator=( const ServiceHandleHolder& v_other ) throw()
+{
+       if( this != &v_other ) {
+               if( --pData_->ref_ == 0 ) {
+                       delete pData_;
+               }
+               pData_ = v_other.pData_;
+               pData_->ref_++;
+       }
+       return *this;
+}
+
+ServiceControlManager::ServiceHandleHolder::operator SC_HANDLE() const throw()
+{
+       return pData_->hService_;
+}
+
+SC_HANDLE ServiceControlManager::ServiceHandleHolder::get() const throw()
+{
+       return pData_->hService_;
+}
+
+////
+
+ServiceControlManager::ServiceControlManager() throw( std::exception )
+       : hServiceControlManager_( NULL )
+{
+       hServiceControlManager_ = OpenSCManager( NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS );
+       Win32Exception::checkAndThrow( hServiceControlManager_ != NULL );
+}
+
+ServiceControlManager::~ServiceControlManager() throw()
+{
+       CloseServiceHandle( hServiceControlManager_ );
+}
+
+void ServiceControlManager::allocDependenciesString( const std::vector<std::string> v_dependencies, std::vector<char>& v_buffer )
+{
+       std::back_insert_iterator<std::vector<char> > d( std::back_inserter( v_buffer ) );
+
+       for( std::vector<std::string>::const_iterator p = v_dependencies.begin(), last = v_dependencies.end();
+               p != last;
+               ++p )
+       {
+               const std::string dependency = *p;
+               std::copy( dependency.begin(), dependency.end(), d );
+               *d++ = 0;
+       }
+       *d++ = 0;
+
+       if( v_dependencies.empty() ) {
+               *d++ = 0;
+       }
+}
+
+void ServiceControlManager::createOrReplaceService( const ServiceRegistParam& v_serviceParam ) throw ( std::exception )
+{
+       std::vector<char> dependencies;
+       allocDependenciesString( v_serviceParam.dependencies(), dependencies );
+
+       const std::string exeModulePath( getOwnModuleFileName() );
+       const std::string serviceLaunchCommand( "\"" + exeModulePath + "\" " + v_serviceParam.getCommand() );
+
+       ServiceHandleHolder service_handle( CreateService(
+               hServiceControlManager_,
+               v_serviceParam.getServiceName().c_str(),
+               v_serviceParam.getDisplayName().c_str(),
+               SERVICE_ALL_ACCESS,
+               SERVICE_WIN32_OWN_PROCESS,
+               SERVICE_DEMAND_START, // \8eè\93®\8aJ\8en
+               SERVICE_ERROR_NORMAL,
+               serviceLaunchCommand.c_str(),
+               NULL,
+               NULL,
+               &dependencies[ 0 ],
+               NULL, // local system account
+               NULL
+               ) );
+       if( service_handle.get() == NULL ) {
+               const DWORD err = GetLastError();
+               if( err != ERROR_SERVICE_EXISTS ) {
+                       Win32Exception::throwWin32Exception( err );
+               }
+               updateService( v_serviceParam );
+       }
+       else {
+               EventLog eventLog( v_serviceParam.getServiceName() );
+               eventLog.registerEventSource( exeModulePath );
+       }
+}
+
+void ServiceControlManager::updateService( const ServiceRegistParam& v_serviceParam ) throw ( std::exception )
+{
+       ServiceHandleHolder service_handle( OpenService(
+               hServiceControlManager_,
+               v_serviceParam.getServiceName().c_str(),
+               SERVICE_ALL_ACCESS
+               ) );
+       Win32Exception::checkAndThrow( service_handle.get() != NULL );
+
+       checkOwnService( service_handle );
+
+       std::vector<char> dependencies;
+       allocDependenciesString( v_serviceParam.dependencies(), dependencies );
+
+       const std::string exeModulePath( getOwnModuleFileName() );
+       const std::string serviceLaunchCommand( "\"" + exeModulePath + "\" " + v_serviceParam.getCommand() );
+
+       if( ! ChangeServiceConfig(
+                       service_handle.get(),
+                       SERVICE_NO_CHANGE,
+                       SERVICE_NO_CHANGE,
+                       SERVICE_NO_CHANGE,
+                       serviceLaunchCommand.c_str(),
+                       NULL,
+                       NULL,
+                       &dependencies[ 0 ],
+                       NULL,
+                       NULL,
+                       v_serviceParam.getDisplayName().c_str()
+                       ) )
+       {
+               Win32Exception::throwWin32Exception( GetLastError() );
+       }
+
+       EventLog eventLog( v_serviceParam.getServiceName() );
+       eventLog.registerEventSource( exeModulePath );
+}
+
+void ServiceControlManager::deleteService( const ServiceIdentifier& v_serviceIdentifier ) throw ( std::exception )
+{
+       ServiceHandleHolder service_handle( OpenService(
+               hServiceControlManager_,
+               v_serviceIdentifier.getServiceName().c_str(),
+               SERVICE_ALL_ACCESS
+               ) );
+       Win32Exception::checkAndThrow( service_handle.get() != NULL );
+
+       checkOwnService( service_handle );
+
+       if( ! DeleteService( service_handle.get() ) ) {
+               const DWORD errorCode = GetLastError();
+               if( errorCode != ERROR_SERVICE_MARKED_FOR_DELETE ) {
+                       Win32Exception::throwWin32Exception( errorCode );
+               }
+       }
+       EventLog eventLog( v_serviceIdentifier.getServiceName() );
+       eventLog.unregisterEventSource( getOwnModuleFileName() );
+}
+
+
+void ServiceControlManager::checkOwnService( const ServiceHandleHolder& v_service_handle ) throw ( std::exception )
+{
+       //required:
+       assert( v_service_handle.get() != NULL );
+
+       //do:
+       size_t size = sizeof( QUERY_SERVICE_CONFIG ) + ( MAX_PATH * 2 );
+       std::vector<char> queryBuf( size );
+       for(;;) {
+               DWORD needlen = 0;
+               if( QueryServiceConfig(
+                       v_service_handle.get(),
+                       reinterpret_cast<LPQUERY_SERVICE_CONFIG>( &queryBuf[ 0 ] ),
+                       (DWORD) size,
+                       &needlen
+                       ) == 0 )
+               {
+                       const DWORD errorCode = GetLastError();
+                       if( errorCode == ERROR_INSUFFICIENT_BUFFER ) {
+                               size = needlen + 1;
+                               queryBuf.resize( size );
+                               continue;
+                       }
+                       Win32Exception::throwWin32Exception( errorCode );
+               }
+               break;
+       }
+       const QUERY_SERVICE_CONFIG& currentServiceConf = *reinterpret_cast<LPQUERY_SERVICE_CONFIG>( &queryBuf[ 0 ] );
+       
+       // \8dÅ\8f\89\82Ì\88ø\90\94\82ð\90Ø\82è\8fo\82·
+       LPCSTR st = currentServiceConf.lpBinaryPathName;
+       LPCSTR en = NULL;
+       while( *st > 0 && *st <= ' ' ) {
+               st++;
+       }
+       if( *st == '\"' ) {
+               st++;
+               en = st;
+               while( *en ) {
+                       if( *en == '\"' ) {
+                               break;
+                       }
+                       en = CharNext( en );
+               }
+       }
+       else {
+               en = st;
+               while( *en ) {
+                       if( *en > 0 && *en <= ' ' ) {
+                               break;
+                       }
+                       en = CharNext( en );
+               }
+       }
+       if( en < st ) {
+               en = st;
+       }
+       std::string exeModuleName( st, en );
+       std::string ownModuleName( getOwnModuleFileName() );
+
+       // \88ê\92v\82·\82é\82©?
+       if( stricmp( exeModuleName.c_str(), ownModuleName.c_str() ) != 0 ) {
+               throw std::runtime_error( "\8ew\92è\82³\82ê\82½\83T\81[\83r\83X\82Í\81A\82±\82Ì\8eÀ\8ds\83v\83\8d\83O\83\89\83\80\82É\82æ\82Á\82Ä\93o\98^\82³\82ê\82½\82à\82Ì\82Å\82Í\82 \82è\82Ü\82¹\82ñ\81B" );
+       }
+
+}
+
+std::string ServiceControlManager::getOwnModuleFileName() throw ( std::exception )
+{
+       CHAR szModuleFileName[ MAX_PATH ];
+       szModuleFileName[ GetModuleFileName( NULL, szModuleFileName, MAX_PATH ) ] = 0;
+       Win32Exception::checkAndThrow( szModuleFileName[ 0 ] != 0 );
+       return std::string( szModuleFileName );
+}
diff --git a/jvmservice/ServiceControlManager.hpp b/jvmservice/ServiceControlManager.hpp
new file mode 100644 (file)
index 0000000..82f4010
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef INCLUDE_H_SERVICECONTROLLMANAGER
+#define INCLUDE_H_SERVICECONTROLLMANAGER
+
+#include <exception>
+#include <string>
+#include <vector>
+
+#include "Win32Exception.hpp"
+
+class ServiceIdentifier
+{
+public:
+       ServiceIdentifier( const std::string& v_serviceName ) throw( std::exception );
+       ServiceIdentifier( const ServiceIdentifier& v_other ) throw();
+       ServiceIdentifier& operator=( const ServiceIdentifier& v_other ) throw();
+
+       const std::string& getServiceName() const throw();
+       
+private:
+       std::string serviceName_;
+};
+
+class ServiceRegistParam : public ServiceIdentifier
+{
+public:
+       typedef std::vector<std::string> StringVector;
+
+       ServiceRegistParam( const std::string& v_serviceName, const std::string& v_displayName, const std::string& v_command ) throw ( std::exception );
+       ServiceRegistParam( const ServiceRegistParam& v_other ) throw();
+       ServiceRegistParam& operator=( const ServiceRegistParam& v_other ) throw();
+
+       const std::string& getDisplayName() const throw();
+       const std::string& getCommand() const throw();
+       const StringVector& dependencies() const throw();
+       StringVector& dependencies() throw();
+
+private:
+       std::string displayName_;
+       std::string command_;
+       StringVector dependencies_;
+};
+
+class ServiceControlManager
+{
+public:
+       ServiceControlManager() throw( std::exception );
+       ~ServiceControlManager() throw();
+
+       void createOrReplaceService( const ServiceRegistParam& v_serviceParam ) throw ( std::exception );
+       void updateService( const ServiceRegistParam& v_serviceParam ) throw ( std::exception );
+       void deleteService( const ServiceIdentifier& v_serviceIdentifier ) throw ( std::exception );
+
+private:
+       class ServiceHandleHolder
+       {
+       public:
+               ServiceHandleHolder( SC_HANDLE v_Sercice ) throw();
+               ServiceHandleHolder( const ServiceHandleHolder& v_other ) throw();
+               ~ServiceHandleHolder() throw();
+               ServiceHandleHolder& operator=( const ServiceHandleHolder& v_other ) throw();
+
+               operator SC_HANDLE() const throw();
+               SC_HANDLE get() const throw();
+
+       private:
+               struct ServiceHandleHolderData_
+               {
+                       ~ServiceHandleHolderData_();
+                       SC_HANDLE hService_;
+                       int ref_;
+               };
+               ServiceHandleHolderData_* pData_;
+       };
+
+       static std::string getOwnModuleFileName() throw ( std::exception );
+       static void checkOwnService( const ServiceHandleHolder& v_service_handle ) throw ( std::exception );
+       static void allocDependenciesString( const std::vector<std::string> v_dependencies, std::vector<char>& v_buffer ) throw();
+
+       SC_HANDLE hServiceControlManager_;
+};
+
+
+#endif
diff --git a/jvmservice/ServiceLaunchCommand.cpp b/jvmservice/ServiceLaunchCommand.cpp
new file mode 100644 (file)
index 0000000..fe83aeb
--- /dev/null
@@ -0,0 +1,20 @@
+#include "stdafx.h"
+
+#include "ServiceLaunchCommand.hpp"
+#include "service_main.hpp"
+
+#include <assert.h>
+
+ServiceLaunchCommand::ServiceLaunchCommand( const CommandArgument& v_argument ) throw ( std::exception )
+       : Command( v_argument )
+{
+}
+
+ServiceLaunchCommand::~ServiceLaunchCommand() throw()
+{
+}
+
+void ServiceLaunchCommand::execute() throw ( std::exception )
+{
+       service_dispatcher( argument_ );
+}
diff --git a/jvmservice/ServiceLaunchCommand.hpp b/jvmservice/ServiceLaunchCommand.hpp
new file mode 100644 (file)
index 0000000..e97edb7
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef INCLUDE_H_SERVICELAUNCHCOMMAND
+#define INCLUDE_H_SERVICELAUNCHCOMMAND
+
+#include "Command.hpp"
+
+class ServiceLaunchCommand : public Command
+{
+public:
+       ServiceLaunchCommand( const CommandArgument& v_argument ) throw ( std::exception );
+       virtual ~ServiceLaunchCommand() throw();
+       virtual void execute() throw ( std::exception );
+};
+
+#endif
diff --git a/jvmservice/ServiceRegisterCommand.cpp b/jvmservice/ServiceRegisterCommand.cpp
new file mode 100644 (file)
index 0000000..894df88
--- /dev/null
@@ -0,0 +1,83 @@
+#include "stdafx.h"
+
+#include "ServiceRegisterCommand.hpp"
+
+#include <iterator>
+#include <algorithm>
+
+#include <assert.h>
+
+ServiceRegisterBase::ServiceRegisterBase( const CommandArgument& v_argument ) throw ( std::exception )
+       : Command( v_argument )
+{
+}
+
+ServiceRegisterBase::~ServiceRegisterBase() throw()
+{
+}
+
+////
+
+ServiceRegisterCommand::ServiceRegisterCommand( const CommandArgument& v_argument ) throw ( std::exception )
+       : ServiceRegisterBase( v_argument )
+{
+}
+
+ServiceRegisterCommand::~ServiceRegisterCommand() throw()
+{
+}
+
+void ServiceRegisterCommand::execute() throw ( std::exception )
+{
+       assert( ! argument_.getServiceName().empty() );
+       assert( ! argument_.getConfigPath().empty() );
+
+       std::string displayName;
+       std::string command;
+
+       displayName += "JavaVMService(";
+       displayName += argument_.getServiceName();
+       displayName += ")";
+
+       command += "--runService ";
+       command += argument_.getServiceName();
+       command += " -c \"";
+       command += argument_.getConfigPath();
+       command += "\"";
+
+       if( ! argument_.getLogPath().empty() ) {
+               command += " -l \"";
+               command += argument_.getLogPath();
+               command += "\"";
+       }
+
+       if( ! argument_.getWorkDir().empty() ) {
+               command += " -w \"";
+               command += argument_.getWorkDir();
+               command += "\"";
+       }
+
+       ServiceRegistParam param( argument_.getServiceName(), displayName, command );
+       std::copy( argument_.begin(), argument_.end(), std::back_insert_iterator<ServiceRegistParam::StringVector>( param.dependencies() ) );
+
+       serviceControlManager_.createOrReplaceService( param );
+}
+
+////
+
+ServiceUnregisterCommand::ServiceUnregisterCommand( const CommandArgument& v_argument ) throw ( std::exception )
+       : ServiceRegisterBase( v_argument )
+{
+}
+
+ServiceUnregisterCommand::~ServiceUnregisterCommand() throw()
+{
+}
+
+void ServiceUnregisterCommand::execute() throw ( std::exception )
+{
+       assert( ! argument_.getServiceName().empty() );
+
+       ServiceIdentifier serviceIdentifier( argument_.getServiceName() );
+       serviceControlManager_.deleteService( serviceIdentifier );
+}
diff --git a/jvmservice/ServiceRegisterCommand.hpp b/jvmservice/ServiceRegisterCommand.hpp
new file mode 100644 (file)
index 0000000..f40840d
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef INCLUDE_H_SERVICEREGISTERCOMMAND
+#define INCLUDE_H_SERVICEREGISTERCOMMAND
+
+#include "Command.hpp"
+
+#include "ServiceControlManager.hpp"
+
+#include <exception>
+
+class ServiceRegisterBase : public Command
+{
+protected:
+       ServiceRegisterBase( const CommandArgument& v_argument ) throw ( std::exception );
+
+public:
+       virtual ~ServiceRegisterBase() throw();
+
+protected:
+       ServiceControlManager serviceControlManager_;
+};
+
+class ServiceRegisterCommand : public ServiceRegisterBase
+{
+public:
+       ServiceRegisterCommand( const CommandArgument& v_argument ) throw ( std::exception );
+       virtual ~ServiceRegisterCommand() throw();
+       virtual void execute() throw ( std::exception );
+};
+
+class ServiceUnregisterCommand : public ServiceRegisterBase
+{
+public:
+       ServiceUnregisterCommand( const CommandArgument& v_argument ) throw ( std::exception );
+       virtual ~ServiceUnregisterCommand() throw();
+       virtual void execute() throw ( std::exception );
+};
+
+#endif
diff --git a/jvmservice/StartupInfo.cpp b/jvmservice/StartupInfo.cpp
new file mode 100644 (file)
index 0000000..51404ef
--- /dev/null
@@ -0,0 +1,88 @@
+#include "stdafx.h"
+
+#include "StartupInfo.hpp"
+
+StartupInfo::StartupInfo( const std::string v_mainClassName, const std::string v_mainMethodName, bool v_fork ) throw ( std::invalid_argument )
+       : mainClassName_( v_mainClassName )
+       , mainMethodName_( v_mainMethodName )
+       , fork_( v_fork )
+{
+       if( v_mainClassName.empty() ) {
+               throw std::invalid_argument( "\83\81\83C\83\93\83N\83\89\83X\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+       if( v_mainMethodName.empty() ) {
+               throw std::invalid_argument( "\83\81\83C\83\93\83\81\83\\83b\83h\82ª\8ew\92è\82³\82ê\82Ä\82¢\82Ü\82¹\82ñ\81B" );
+       }
+}
+
+StartupInfo::StartupInfo( const StartupInfo& v_other ) throw()
+       : mainClassName_( v_other.mainClassName_ )
+       , mainMethodName_( v_other.mainMethodName_ )
+       , args_( v_other.args_ )
+       , fork_( v_other.fork_ )
+{
+}
+
+StartupInfo& StartupInfo::operator=( const StartupInfo& v_other ) throw()
+{
+       if( this != &v_other ) {
+               mainClassName_ = v_other.mainClassName_;
+               mainMethodName_ = v_other.mainMethodName_;
+               args_ = v_other.args_;
+               fork_ = v_other.fork_;
+       }
+       return *this;
+}
+
+StartupInfo::~StartupInfo() throw()
+{
+}
+
+bool StartupInfo::isFork() const throw()
+{
+       return fork_;
+}
+
+const std::string& StartupInfo::getMainClassName() const throw() 
+{
+       return mainClassName_;
+}
+
+const std::string& StartupInfo::getMainMethodName() const throw()
+{
+       return mainMethodName_;
+}
+
+StartupInfo::iterator StartupInfo::begin() throw()
+{
+       return args_.begin();
+}
+
+StartupInfo::const_iterator StartupInfo::begin() const throw()
+{
+       return args_.begin();
+}
+
+StartupInfo::iterator StartupInfo::end() throw()
+{
+       return args_.end();
+}
+
+StartupInfo::const_iterator StartupInfo::end() const throw()
+{
+       return args_.end();
+}
+
+StartupInfo::size_type StartupInfo::size() const throw()
+{
+       return args_.size();
+}
+
+bool StartupInfo::push_back( const std::string& v_arg ) throw()
+{
+       if( ! v_arg.empty() ) {
+               args_.push_back( v_arg );
+               return true;
+       }
+       return false;
+}
diff --git a/jvmservice/StartupInfo.hpp b/jvmservice/StartupInfo.hpp
new file mode 100644 (file)
index 0000000..3576f58
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef INCLUDE_H_STARTUPINFO
+#define INCLUDE_H_STARTUPINFO
+
+#include <string>
+#include <vector>
+
+class StartupInfo
+{
+public:
+       typedef std::vector<std::string> StringVector;
+
+       typedef StringVector::iterator iterator;
+       typedef StringVector::const_iterator const_iterator;
+       typedef StringVector::value_type value_type;
+       typedef StringVector::size_type size_type;
+       typedef StringVector::reference reference;
+       typedef StringVector::const_reference const_reference;
+
+       StartupInfo( const std::string v_mainClassName, const std::string v_mainMethodName, bool v_fork ) throw ( std::invalid_argument );
+       StartupInfo( const StartupInfo& v_other ) throw();
+       StartupInfo& operator=( const StartupInfo& v_other ) throw();
+       ~StartupInfo() throw();
+
+       const std::string& getMainClassName() const throw();
+       const std::string& getMainMethodName() const throw();
+
+       bool isFork() const throw();
+
+       StartupInfo::iterator begin() throw();
+       StartupInfo::const_iterator begin() const throw();
+       StartupInfo::iterator end() throw();
+       StartupInfo::const_iterator end() const throw();
+       StartupInfo::size_type size() const throw();
+
+       bool push_back( const std::string& v_arg ) throw();
+
+private:
+       std::string mainClassName_;
+       std::string mainMethodName_;
+       StringVector args_;
+       bool fork_;
+};
+
+
+#endif
diff --git a/jvmservice/Win32Exception.cpp b/jvmservice/Win32Exception.cpp
new file mode 100644 (file)
index 0000000..c93c4dd
--- /dev/null
@@ -0,0 +1,51 @@
+#include "stdafx.h"
+
+#include "Win32Exception.hpp"
+
+Win32Exception::Win32Exception( const char* v_message, DWORD v_errorCode )
+       : std::exception( v_message )
+       , errorCode_( v_errorCode )
+{
+}
+
+DWORD Win32Exception::getErrorCode() const
+{
+       return errorCode_;
+}
+
+void Win32Exception::checkAndThrow( BOOL v_succeeded ) throw ( Win32Exception )
+{
+       if( v_succeeded ) {
+               return;
+       }
+       throwWin32Exception( GetLastError() );
+}
+
+void Win32Exception::throwWin32Exception( DWORD v_errorCode ) throw ( Win32Exception )
+{
+       if( v_errorCode == ERROR_SUCCESS ) {
+               return;
+       }
+
+       LPVOID lpMsgBuf = NULL;
+       if( FormatMessage(
+               FORMAT_MESSAGE_ALLOCATE_BUFFER |
+               FORMAT_MESSAGE_FROM_SYSTEM |
+               FORMAT_MESSAGE_IGNORE_INSERTS,
+               NULL,
+               v_errorCode,
+               MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // \8aù\92è\82Ì\8c¾\8cê
+               (LPTSTR) &lpMsgBuf,
+               0,
+               NULL
+               ) != 0 )
+       {
+               std::string reason( (const char*) lpMsgBuf );
+               LocalFree(lpMsgBuf);
+               throw Win32Exception( reason.c_str(), v_errorCode );
+       }
+       else {
+               throw Win32Exception( "\95s\96¾\82È\97á\8aO\82ª\94­\90\82µ\82Ü\82µ\82½\81B", v_errorCode );
+       }
+}
+
diff --git a/jvmservice/Win32Exception.hpp b/jvmservice/Win32Exception.hpp
new file mode 100644 (file)
index 0000000..5cfe804
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef INCLUDE_H_WIN32EXCEPTION
+#define INCLUDE_H_WIN32EXCEPTION
+
+#include <string>
+#include <exception>
+
+#include <windows.h>
+
+class Win32Exception : public std::exception
+{
+public:
+       Win32Exception( const char* v_message, DWORD v_errorCode );
+       DWORD getErrorCode() const;
+
+       static void checkAndThrow( BOOL v_succeeded = FALSE ) throw ( Win32Exception );
+       static void throwWin32Exception( DWORD v_errorCode ) throw ( Win32Exception );
+
+private:
+       DWORD errorCode_;
+};
+
+#endif
diff --git a/jvmservice/jvmservice.rc b/jvmservice/jvmservice.rc
new file mode 100644 (file)
index 0000000..70f2b24
--- /dev/null
@@ -0,0 +1,61 @@
+// Microsoft Visual C++ \82Å\90\90¬\82³\82ê\82½\83\8a\83\\81[\83\83X\83N\83\8a\83v\83g\82Å\82·\81B
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 2 \83\8a\83\\81[\83X\82©\82ç\90\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// \89p\8cê (\95Ä\8d\91\83\8a\83\\81[\83X
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE 17, 1
+#pragma code_page(932)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE  
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE  
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE  
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+#endif    // \89p\8cê (\95Ä\8d\91\83\8a\83\\81[\83X
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE 3 \83\8a\83\\81[\83X\82©\82ç\90\90¬\82³\82ê\82Ü\82µ\82½\81B
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // APSTUDIO_INVOKED \82Å\82È\82¢\8fê\8d\87
+
diff --git a/jvmservice/jvmservice.vcproj b/jvmservice/jvmservice.vcproj
new file mode 100644 (file)
index 0000000..64f3030
--- /dev/null
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="shift_jis"?>
+<VisualStudioProject
+       ProjectType="Visual C++"
+       Version="7.10"
+       Name="jvmservice"
+       ProjectGUID="{6192CE08-387E-427B-B053-BF2BEA6A85FD}"
+       RootNamespace="jvmservice"
+       Keyword="Win32Proj">
+       <Platforms>
+               <Platform
+                       Name="Win32"/>
+       </Platforms>
+       <Configurations>
+               <Configuration
+                       Name="Debug|Win32"
+                       OutputDirectory="Debug"
+                       IntermediateDirectory="Debug"
+                       ConfigurationType="1"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               Optimization="0"
+                               AdditionalIncludeDirectories="C:\j2sdk1.4.2_08\include;C:\j2sdk1.4.2_08\include\win32"
+                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+                               MinimalRebuild="TRUE"
+                               BasicRuntimeChecks="3"
+                               RuntimeLibrary="1"
+                               DefaultCharIsUnsigned="TRUE"
+                               TreatWChar_tAsBuiltInType="TRUE"
+                               ForceConformanceInForLoopScope="TRUE"
+                               UsePrecompiledHeader="3"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="TRUE"
+                               DebugInformationFormat="4"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               AdditionalDependencies="C:\j2sdk1.4.2_08\lib\jvm.lib"
+                               OutputFile="$(OutDir)/jvmservice.exe"
+                               LinkIncremental="2"
+                               DelayLoadDLLs="jvm.dll"
+                               GenerateDebugInformation="TRUE"
+                               ProgramDatabaseFile="$(OutDir)/jvmservice.pdb"
+                               SubSystem="1"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+               <Configuration
+                       Name="Release|Win32"
+                       OutputDirectory="Release"
+                       IntermediateDirectory="Release"
+                       ConfigurationType="1"
+                       CharacterSet="2">
+                       <Tool
+                               Name="VCCLCompilerTool"
+                               AdditionalIncludeDirectories="C:\j2sdk1.4.2_08\include;C:\j2sdk1.4.2_08\include\win32"
+                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+                               RuntimeLibrary="0"
+                               DefaultCharIsUnsigned="TRUE"
+                               TreatWChar_tAsBuiltInType="TRUE"
+                               ForceConformanceInForLoopScope="TRUE"
+                               UsePrecompiledHeader="3"
+                               WarningLevel="3"
+                               Detect64BitPortabilityProblems="TRUE"
+                               DebugInformationFormat="3"/>
+                       <Tool
+                               Name="VCCustomBuildTool"/>
+                       <Tool
+                               Name="VCLinkerTool"
+                               AdditionalDependencies="C:\j2sdk1.4.2_08\lib\jvm.lib"
+                               OutputFile="$(OutDir)/jvmservice.exe"
+                               LinkIncremental="1"
+                               DelayLoadDLLs="jvm.dll"
+                               GenerateDebugInformation="TRUE"
+                               SubSystem="1"
+                               OptimizeReferences="2"
+                               EnableCOMDATFolding="2"
+                               TargetMachine="1"/>
+                       <Tool
+                               Name="VCMIDLTool"/>
+                       <Tool
+                               Name="VCPostBuildEventTool"/>
+                       <Tool
+                               Name="VCPreBuildEventTool"/>
+                       <Tool
+                               Name="VCPreLinkEventTool"/>
+                       <Tool
+                               Name="VCResourceCompilerTool"/>
+                       <Tool
+                               Name="VCWebServiceProxyGeneratorTool"/>
+                       <Tool
+                               Name="VCXMLDataGeneratorTool"/>
+                       <Tool
+                               Name="VCWebDeploymentTool"/>
+                       <Tool
+                               Name="VCManagedWrapperGeneratorTool"/>
+                       <Tool
+                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+               </Configuration>
+       </Configurations>
+       <References>
+       </References>
+       <Files>
+               <Filter
+                       Name="\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+                       <File
+                               RelativePath=".\Command.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\CommandArgument.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\ConfigParser.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\Event.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\EventLog.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\JavaVMMainThread.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMException.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMLauncher.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMStartupInfo.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMThreadAttacher.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\main.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\service_main.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceControlManager.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceLaunchCommand.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceRegisterCommand.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\StartupInfo.cpp">
+                       </File>
+                       <File
+                               RelativePath=".\stdafx.cpp">
+                               <FileConfiguration
+                                       Name="Debug|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               UsePrecompiledHeader="1"/>
+                               </FileConfiguration>
+                               <FileConfiguration
+                                       Name="Release|Win32">
+                                       <Tool
+                                               Name="VCCLCompilerTool"
+                                               UsePrecompiledHeader="1"/>
+                               </FileConfiguration>
+                       </File>
+                       <File
+                               RelativePath=".\Win32Exception.cpp">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83w\83b\83_\81\83t\83@\83C\83\8b"
+                       Filter="h;hpp;hxx;hm;inl;inc;xsd"
+                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+                       <File
+                               RelativePath=".\Command.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\CommandArgument.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\ConfigParser.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\Event.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\EventLog.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JavaVMCallback.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JavaVMMainThread.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JavaVMStartupInfo.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMException.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMLauncher.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\JVMThreadAttacher.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\message.h">
+                       </File>
+                       <File
+                               RelativePath=".\resource.h">
+                       </File>
+                       <File
+                               RelativePath=".\service_main.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceControlManager.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceLaunchCommand.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\ServiceRegisterCommand.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\StartupInfo.hpp">
+                       </File>
+                       <File
+                               RelativePath=".\stdafx.h">
+                       </File>
+                       <File
+                               RelativePath=".\Win32Exception.hpp">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="\83\8a\83\\81[\83\83t\83@\83C\83\8b"
+                       Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
+                       UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
+                       <File
+                               RelativePath=".\jvmservice.rc">
+                       </File>
+                       <File
+                               RelativePath=".\message.rc">
+                       </File>
+               </Filter>
+               <Filter
+                       Name="conf"
+                       Filter="">
+                       <File
+                               RelativePath="..\sample\jvmserv1.ini">
+                       </File>
+                       <File
+                               RelativePath="..\sample\jvmservice.preload">
+                       </File>
+               </Filter>
+               <File
+                       RelativePath=".\message.mc">
+               </File>
+               <File
+                       RelativePath=".\ReadMe.txt">
+               </File>
+       </Files>
+       <Globals>
+       </Globals>
+</VisualStudioProject>
diff --git a/jvmservice/main.cpp b/jvmservice/main.cpp
new file mode 100644 (file)
index 0000000..dad6601
--- /dev/null
@@ -0,0 +1,20 @@
+#include "stdafx.h"
+
+#include "Command.hpp"
+
+int main( int argc, char* argv[] )
+{
+       const char* const pApplicationName = argv[ 0 ];
+
+       try{
+               const CommandArgument argument( CommandArgumentFactory::create( argc, argv ) );
+               CommandPtr cmd( Command::create( argument ) );
+               cmd->execute();
+       }
+       catch( const std::exception& v_exception ) {
+               MessageBox( NULL, v_exception.what(), pApplicationName, MB_ICONERROR | MB_OK | MB_SERVICE_NOTIFICATION );
+       }
+
+       return 0;
+}
+
diff --git a/jvmservice/message.h b/jvmservice/message.h
new file mode 100644 (file)
index 0000000..fae2f4f
--- /dev/null
@@ -0,0 +1,120 @@
+//
+//  Values are 32 bit values layed out as follows:
+//
+//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+//  +---+-+-+-----------------------+-------------------------------+
+//  |Sev|C|R|     Facility          |               Code            |
+//  +---+-+-+-----------------------+-------------------------------+
+//
+//  where
+//
+//      Sev - is the severity code
+//
+//          00 - Success
+//          01 - Informational
+//          10 - Warning
+//          11 - Error
+//
+//      C - is the Customer code flag
+//
+//      R - is a reserved bit
+//
+//      Facility - is the facility code
+//
+//      Code - is the facility's status code
+//
+//
+// Define the facility codes
+//
+#define FACILITY_SYSTEM                  0x0
+#define FACILITY_STUBS                   0x3
+#define FACILITY_RUNTIME                 0x2
+#define FACILITY_IO_ERROR_CODE           0x4
+
+
+//
+// Define the severity codes
+//
+#define STATUS_SEVERITY_WARNING          0x2
+#define STATUS_SEVERITY_SUCCESS          0x0
+#define STATUS_SEVERITY_INFORMATIONAL    0x1
+#define STATUS_SEVERITY_ERROR            0x3
+
+
+//
+// MessageId: MSG_JAVAVM_STARTED
+//
+// MessageText:
+//
+//  JavaVM created.
+//  (config=%1)
+//
+#define MSG_JAVAVM_STARTED               ((DWORD)0x00020001L)
+
+//
+// MessageId: MSG_JAVAVM_EXITED
+//
+// MessageText:
+//
+//  JavaVM exited.(exit code=%1)
+//  (config=%2)
+//
+#define MSG_JAVAVM_EXITED                ((DWORD)0x40020002L)
+
+//
+// MessageId: MSG_JAVAVM_ABORTED
+//
+// MessageText:
+//
+//  JavaVM was aborted.
+//  (config=%1)
+//
+#define MSG_JAVAVM_ABORTED               ((DWORD)0xC0020003L)
+
+//
+// MessageId: MSG_UNHANDLED_EXCEPTION
+//
+// MessageText:
+//
+//  occur unhandled exception.
+//
+#define MSG_UNHANDLED_EXCEPTION          ((DWORD)0xC0000004L)
+
+//
+// MessageId: MSG_PRELOADLIB_FAILURE
+//
+// MessageText:
+//
+//  library load failure: %1
+//
+#define MSG_PRELOADLIB_FAILURE           ((DWORD)0xC0000005L)
+
+//
+// MessageId: MSG_JAVAVM_EXCEPTION
+//
+// MessageText:
+//
+//  occure exception: %1
+//
+#define MSG_JAVAVM_EXCEPTION             ((DWORD)0xC0020006L)
+
+//
+// MessageId: MSG_JAVAVM_THREAD_ABNORMAL_TERMINATED
+//
+// MessageText:
+//
+//  occure exception: %1
+//  reason: %2
+//
+#define MSG_JAVAVM_THREAD_ABNORMAL_TERMINATED ((DWORD)0xC0020007L)
+
+//
+// MessageId: MSG_JAVAVM_THREAD_NORMALY_TERMINATED
+//
+// MessageText:
+//
+//  thread exited: %1
+//
+#define MSG_JAVAVM_THREAD_NORMALY_TERMINATED ((DWORD)0x40020008L)
+
diff --git a/jvmservice/message.mc b/jvmservice/message.mc
new file mode 100644 (file)
index 0000000..b500605
--- /dev/null
@@ -0,0 +1,109 @@
+MessageIdTypedef=DWORD
+SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
+               Informational=0x1:STATUS_SEVERITY_INFORMATIONAL
+               Warning=0x2:STATUS_SEVERITY_WARNING
+               Error=0x3:STATUS_SEVERITY_ERROR
+              )
+FacilityNames=(System=0x0:FACILITY_SYSTEM
+               Runtime=0x2:FACILITY_RUNTIME
+               Stubs=0x3:FACILITY_STUBS
+               Io=0x4:FACILITY_IO_ERROR_CODE
+              )
+LanguageNames=(English=0x409:MSG00409)
+LanguageNames=(Japanese=0x411:MSG00411)
+
+MessageId=0x1
+Severity=Success
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_STARTED
+Language=English
+JavaVM created.
+(config=%1)
+.
+Language=Japanese
+JavaVM\82ª\8dì\90¬\82³\82ê\82Ü\82µ\82½\81B
+(config=%1)
+.
+
+MessageId=0x2
+Severity=Informational
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_EXITED
+Language=English
+JavaVM exited.(exit code=%1)
+(config=%2)
+.
+Language=Japanese
+JavaVM\82Í\8fI\97¹\82µ\82Ü\82µ\82½\81B(exit code=%1)
+(config=%2)
+.
+
+MessageId=0x3
+Severity=Error
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_ABORTED
+Language=English
+JavaVM was aborted.
+(config=%1)
+.
+Language=Japanese
+JavaVM\82Í\92\86\92f(abort)\82³\82ê\82Ü\82µ\82½\81B
+(config=%1)
+.
+
+MessageId=0x4
+Severity=Error
+Facility=System
+SymbolicName=MSG_UNHANDLED_EXCEPTION
+Language=English
+occur unhandled exception.
+.
+Language=Japanese
+\83n\83\93\83h\83\8b\82³\82ê\82Ä\82¢\82È\82¢\97á\8aO\82É\82æ\82è\83v\83\8d\83Z\83X\82Í\8b­\90§\8fI\97¹\82µ\82Ü\82·\81B
+.
+
+MessageId=0x5
+Severity=Error
+Facility=System
+SymbolicName=MSG_PRELOADLIB_FAILURE
+Language=English
+library load failure: %1
+.
+Language=Japanese
+\83\89\83C\83u\83\89\83\8a\82Ì\83\8d\81[\83h\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B: %1
+.
+
+MessageId=0x6
+Severity=Error
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_EXCEPTION
+Language=English
+occure exception: %1
+.
+Language=Japanese
+\97á\8aO\82ª\94­\90\82µ\82Ü\82µ\82½\81B: %1
+.
+
+MessageId=0x7
+Severity=Error
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_THREAD_ABNORMAL_TERMINATED
+Language=English
+occure exception: %1
+reason: %2
+.
+Language=Japanese
+\83X\83\8c\83b\83h\82ª\97á\8aO\82É\82æ\82è\8fI\97¹\82µ\82Ü\82µ\82½\81B: %1
+\97á\8aO\8e\96\97R: %2
+.
+
+MessageId=0x8
+Severity=Informational
+Facility=Runtime
+SymbolicName=MSG_JAVAVM_THREAD_NORMALY_TERMINATED
+Language=English
+thread exited: %1
+.
+Language=Japanese
+\83X\83\8c\83b\83h\82ª\8fI\97¹\82µ\82Ü\82µ\82½\81B: %1
+.
diff --git a/jvmservice/message.rc b/jvmservice/message.rc
new file mode 100644 (file)
index 0000000..c727783
--- /dev/null
@@ -0,0 +1,4 @@
+LANGUAGE 0x11,0x1
+1 11 MSG00411.bin
+LANGUAGE 0x9,0x1
+1 11 MSG00409.bin
diff --git a/jvmservice/resource.h b/jvmservice/resource.h
new file mode 100644 (file)
index 0000000..52ae03f
--- /dev/null
@@ -0,0 +1,14 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by JVMStarter.rc
+
+// \90V\82µ\82¢\83I\83u\83W\83F\83N\83g\82Ì\8e\9f\82Ì\8aù\92è\92l
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        101
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1001
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/jvmservice/service_main.cpp b/jvmservice/service_main.cpp
new file mode 100644 (file)
index 0000000..0858262
--- /dev/null
@@ -0,0 +1,379 @@
+#include "stdafx.h"
+
+#include "service_main.hpp"
+
+#include <stdio.h>
+#include <direct.h>
+#include <stdarg.h>
+#include <assert.h>
+
+#include "JavaVMCallback.hpp"
+#include "JVMLauncher.hpp"
+#include "EventLog.hpp"
+#include "message.h"
+
+namespace
+{
+       /*!
+        * \83T\81[\83r\83X\83X\83e\81[\83g\83n\83\93\83h\83\8b
+        */
+       SERVICE_STATUS serviceStatus = { 0 };
+
+       /*!
+        * \83T\81[\83r\83X\83X\83e\81[\83g(\8dÅ\90V\82Ì\8fó\91Ô\82ð\95Û\8e\9d\82µ\82Ü\82·)
+        */
+       SERVICE_STATUS_HANDLE hServiceStatus = NULL;
+
+       /*!
+        * \83C\83x\83\93\83g\83\8d\83O
+        */
+       EventLog* pEventLog_ = NULL;
+
+       /*!
+        * JNI\97p\8f\91\82«\8d\9e\82Ý\90æ
+        */
+       FILE* jvmLogFP_ = NULL;
+
+       /*!
+        * JVM\82Ì\83C\83x\83\93\83g\83\8a\83X\83i
+        */
+       class JVMEventListenerImpl* pEventListener_ = NULL;
+
+       /*!
+        * \83T\81[\83r\83X\96¼
+        */
+       CHAR szServiceName_[ MAX_PATH + 1 ];
+
+       /*!
+        * \90Ý\92è\83t\83@\83C\83\8b\82Ö\82Ì\83t\83\8b\83p\83X
+        */
+       CHAR szConfigPath_[ MAX_PATH + 1 ];
+
+       /*!
+        * \83\8d\83O\83t\83@\83C\83\8b\82Ö\82Ì\83t\83\8b\83p\83X\81A\82Ü\82½\82Í\8bó
+        */
+       CHAR szLogPath_[ MAX_PATH + 1 ];
+
+       /*!
+        * JVM\83X\83^\81[\83^\82Ö\82Ì\83|\83C\83\93\83^
+        */
+       JVMLauncher* pJVMLauncher_ = NULL;
+
+       /*!
+        * \8fI\97¹\8e\9e\82É\83N\83\8a\81[\83\93\83i\83b\83v\82Ì\82½\82ß\82É\8cÄ\82Ñ\8fo\82³\82ê\82é\83\8b\81[\83`\83\93
+        */
+       void cleanup();
+
+       class JVMEventListenerImpl : public JVMEventListener
+       {
+       public:
+               JVMEventListenerImpl( const std::string& v_serviceName, FILE* v_pJVMLog, EventLog& v_eventLog ) throw()
+                       : serviceName_( v_serviceName )
+                       , eventLog_( v_eventLog )
+                       , jvmLog_( v_pJVMLog )
+               {
+               }
+
+               virtual ~JVMEventListenerImpl() throw()
+               {
+               }
+
+               virtual void notifyJVMStarted() throw()
+               {
+                       const char* mes[] = { serviceName_.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_STARTED,
+                               1,
+                               mes,
+                               EVENTLOG_INFORMATION_TYPE
+                               );
+               }
+
+               virtual void notifyJVMExited( int v_exitCode ) throw()
+               {
+                       notifyJVMLog( "[jvmservice: JavaVM\82ªexit\82µ\82Ü\82µ\82½\81B:%d]\n", v_exitCode );
+                       CHAR buf[ 64 ];
+                       wsprintf( buf, "%d", v_exitCode );
+                       const char* mes[] = { buf, serviceName_.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_EXITED,
+                               2,
+                               mes,
+                               EVENTLOG_INFORMATION_TYPE
+                               );
+
+                       // \92â\8e~
+                       serviceStatus.dwCurrentState = SERVICE_STOPPED;
+                       serviceStatus.dwControlsAccepted = 0;
+                       SetServiceStatus( hServiceStatus, &serviceStatus );
+               }
+
+               virtual void notifyJVMAborted() throw()
+               {
+                       notifyJVMLog( "[jvmservice: JavaVM\82ªabort\82µ\82Ü\82µ\82½\81B]\n" );
+                       const char* mes[] = { serviceName_.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_ABORTED,
+                               1,
+                               mes,
+                               EVENTLOG_ERROR_TYPE
+                               );
+
+                       // \92â\8e~
+                       serviceStatus.dwCurrentState = SERVICE_STOPPED;
+                       serviceStatus.dwControlsAccepted = 0;
+                       SetServiceStatus( hServiceStatus, &serviceStatus );
+               }
+
+               virtual void notifyException( const std::string& v_exceptionReason ) throw()
+               {
+                       notifyJVMLog( "[jvmservice: \97á\8aO\82ª\94­\90\82µ\82Ü\82µ\82½\81B:%s]\n", v_exceptionReason.c_str() );
+                       const char* mes[] = { v_exceptionReason.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_EXCEPTION,
+                               1,
+                               mes,
+                               EVENTLOG_ERROR_TYPE
+                               );
+               }
+
+               virtual int notifyJVMLog( FILE* v_fp, const char* v_format, va_list v_args ) throw()
+               {
+                       if( jvmLog_ != NULL ) {
+                               int cnt = vfprintf( jvmLog_, v_format, v_args );
+                               fflush( jvmLog_ );
+                               return cnt;
+                       }
+                       return 0;
+               }
+
+               virtual void notifyJVMLog( const char* v_format, ... ) throw()
+               {
+                       va_list marker;
+                       va_start( marker, v_format );
+                       notifyJVMLog( NULL, v_format, marker );
+               }
+
+               virtual void notifyJVMThreadNormalyTerminated( const std::string& v_target ) throw()
+               {
+                       notifyJVMLog( "[jvmservice: \83X\83\8c\83b\83h\82ª\92â\8e~\82µ\82Ü\82µ\82½\81B(config=%s)]\n", v_target.c_str() );
+                       const char* mes[] = { v_target.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_THREAD_NORMALY_TERMINATED,
+                               1,
+                               mes,
+                               EVENTLOG_INFORMATION_TYPE
+                               );
+               }
+
+               virtual void notifyJVMThreadAbnomalTerminated( const std::string& v_target, const std::string& v_reason ) throw()
+               {
+                       notifyJVMLog( "[jvmservice: \83X\83\8c\83b\83h\82ª\97á\8aO\82É\82æ\82è\92â\8e~\82µ\82Ü\82µ\82½\81B(config=%s)(reason=%s)]\n", v_target.c_str(), v_reason.c_str() );
+                       const char* mes[] = { v_target.c_str(), v_reason.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_JAVAVM_THREAD_ABNORMAL_TERMINATED,
+                               2,
+                               mes,
+                               EVENTLOG_ERROR_TYPE
+                               );
+               }
+
+               virtual void notifyLibraryLoadFailure( const std::string& v_dllPath ) throw()
+               {
+                       notifyJVMLog( "[jvmservice: DLL\82Ì\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B:%s]\n", v_dllPath.c_str() );
+                       const char* mes[] = { v_dllPath.c_str() };
+                       eventLog_.reportEvent(
+                               MSG_PRELOADLIB_FAILURE,
+                               1,
+                               mes,
+                               EVENTLOG_ERROR_TYPE
+                               );
+               }
+
+       private:
+               std::string serviceName_;
+               FILE* jvmLog_;
+               EventLog& eventLog_;
+       };
+
+       /*!
+        * \8fI\97¹\8e\9e\82É\83N\83\8a\81[\83\93\83i\83b\83v\82Ì\82½\82ß\82É\8cÄ\82Ñ\8fo\82³\82ê\82é\83\8b\81[\83`\83\93
+        */
+       void cleanup()
+       {
+               if( pEventListener_ != NULL ) {
+                       delete pEventListener_;
+                       pEventListener_ = NULL;
+               }
+
+               if( pEventLog_ != NULL ) {
+                       delete pEventLog_;
+                       pEventLog_ = NULL;
+               }
+
+               if( jvmLogFP_ != NULL ) {
+                       fputs( "** END **\n", jvmLogFP_ );
+                       fclose( jvmLogFP_ );
+                       jvmLogFP_ = NULL;
+               }
+       }
+
+       /*!
+        * \83\82\83W\83\85\81[\83\8b\82Ì\83t\83\8b\83p\83X\82©\82ç\8ag\92£\8eq\82ð\88ø\90\94\82Å\8ew\92è\82µ\82½\95\8e\9a\97ñ\82Å\92u\82«\8a·\82¦\82Ü\82·\81B
+        * \92u\82«\8a·\82¦\82É\8e¸\94s\82µ\82½\8fê\8d\87\82Í\8bó\95\8e\9a\82ª\95Ô\82³\82ê\82Ü\82·\81B
+        * \param v_ext \92u\82«\8a·\82¦\82é\8ag\92£\8eq
+        * \return \92u\8a·\82³\82ê\82½\95\8e\9a\97ñ\81A\82Ü\82½\82Í\8bó\95\8e\9a
+        */
+       std::string GetConfPath( const std::string& v_ext ) throw()
+       {
+               CHAR preloadConfPath[ MAX_PATH + 9 ];
+               preloadConfPath[ GetModuleFileName( NULL, preloadConfPath, MAX_PATH ) ] = 0;
+               LPSTR p = preloadConfPath;
+               while(*p)p++;
+               while( p > preloadConfPath && *p != '\\' ) {
+                       if( *p == '.' ) {
+                               strcpy( p, v_ext.c_str() );
+                               break;
+                       }
+                       p = CharPrev( preloadConfPath, p );
+               }
+               if( p == preloadConfPath || *p == '\\' ) {
+                       return std::string();
+               }
+               return std::string( preloadConfPath );
+       }
+
+       DWORD WINAPI service_handler(
+               DWORD dwControl,     // \97v\8b\81\82µ\82½\82¢\90§\8cä\83R\81[\83h
+               DWORD dwEventType,   // \83C\83x\83\93\83g\82Ì\83^\83C\83v
+               LPVOID lpEventData,  // \83C\83x\83\93\83g\82Ì\83f\81[\83^
+               LPVOID lpContext     // \83\86\81[\83U\81[\92è\8b`\82Ì\83R\83\93\83e\83L\83X\83g\83f\81[\83^
+       ) throw()
+       {
+               DWORD retCode = ERROR_CALL_NOT_IMPLEMENTED;
+
+               if( dwControl == SERVICE_CONTROL_STOP || dwControl == SERVICE_CONTROL_SHUTDOWN ) {
+                       pEventListener_->notifyJVMLog(
+                               ( dwControl == SERVICE_CONTROL_STOP ) ?
+                               "[SERVICECONTROL] SERVICE_CONTROL_STOP\n" :
+                               "[SERVICECONTROL] SERVICE_CONTROL_SHUTDOWN\n"
+                               );
+                       if( pJVMLauncher_ != NULL ) {
+                               serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
+                               serviceStatus.dwControlsAccepted = 0;
+                               SetServiceStatus( hServiceStatus, &serviceStatus );
+
+                               pJVMLauncher_->shutdown();
+                       }
+                       else {
+                               serviceStatus.dwCurrentState = SERVICE_STOPPED;
+                               serviceStatus.dwControlsAccepted = 0;
+                       }
+                       retCode = NO_ERROR;
+               }
+               else if( dwControl == SERVICE_CONTROL_INTERROGATE ) {
+                       retCode = NO_ERROR;
+               }
+
+               SetServiceStatus( hServiceStatus, &serviceStatus );
+               
+               return retCode;
+       }
+
+       void WINAPI service_main( DWORD argc, LPSTR* argv ) throw()
+       {
+               // \83N\83\8a\81[\83\93\83i\83b\83v\82Ì\93o\98^
+               SetProcessShutdownParameters( 0x300, 0 );
+               atexit( cleanup );
+
+               // \83C\83x\83\93\83g\83\8d\83O\82Ì\8f\80\94õ
+               pEventLog_ = new EventLog( szServiceName_ );
+               pEventLog_->open();
+
+               // JVM\83\8d\83O\83t\83@\83C\83\8b\82Ì\83o\83b\83N\83A\83b\83v\82Æ\8dì\90¬
+               std::string jvmLogPath( szLogPath_ );
+               if( ! jvmLogPath.empty() ) {
+                       std::string jvmLogBakPath( jvmLogPath + ".bak" );
+                       DeleteFile( jvmLogBakPath.c_str() );
+                       MoveFile( jvmLogPath.c_str(), jvmLogBakPath.c_str() );
+                       jvmLogFP_ = fopen( jvmLogPath.c_str(), "w" );
+               }
+
+               // \83C\83x\83\93\83g\83\8a\83X\83i\82Ì\8f\80\94õ
+               pEventListener_ = new JVMEventListenerImpl( szConfigPath_, jvmLogFP_, *pEventLog_ );
+
+               hServiceStatus = RegisterServiceCtrlHandlerEx( szServiceName_, service_handler, NULL );
+               if( hServiceStatus != NULL ) {
+
+                       serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+                       serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP;
+                       serviceStatus.dwCurrentState = SERVICE_START_PENDING;
+                       SetServiceStatus( hServiceStatus, &serviceStatus );
+
+                       // JVM\82Ì\8dì\90¬\82Æ\8eÀ\8ds
+                       JVMLauncher jvmLauncher( *pEventListener_ );
+                       pJVMLauncher_ = &jvmLauncher;
+
+                       try{
+                               const std::string preloadConfPath( GetConfPath( ".preload" ) );
+                               jvmLauncher.preloadLibrary( preloadConfPath );
+                       }
+                       catch( const Win32Exception& v_exception ) {
+                               serviceStatus.dwCurrentState = SERVICE_STOPPED;
+                               serviceStatus.dwWin32ExitCode = v_exception.getErrorCode();
+                               SetServiceStatus( hServiceStatus, &serviceStatus );
+                               exit( 3 );
+                       }
+                       
+                       try{
+                               // \8aJ\8en
+                               serviceStatus.dwCurrentState = SERVICE_RUNNING;
+                               SetServiceStatus( hServiceStatus, &serviceStatus );
+                               
+                               jvmLauncher.launchJVM( szConfigPath_ );
+                       }
+                       catch( ... ) {
+                               serviceStatus.dwCurrentState = SERVICE_STOPPED;
+                               serviceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
+                               serviceStatus.dwServiceSpecificExitCode = 0;
+                               SetServiceStatus( hServiceStatus, &serviceStatus );
+                               exit( 3 );
+                       }
+
+                       jvmLauncher.switchToJVM();
+
+                       // \83W\83\87\83u\82ª\92â\8e~\96½\97ß\82Ì\82Ü\82¦\82É\95\81\92Ê\82É\8fI\97¹\82µ\82½\8fê\8d\87
+                       pEventListener_->notifyJVMExited( 0 );
+               }
+
+               exit( 0 );
+       }
+}
+
+void service_dispatcher( const CommandArgument& v_argument ) throw ( std::exception )
+{
+       //required:
+       assert( ! v_argument.getServiceName().empty() );
+       assert( ! v_argument.getConfigPath().empty() );
+
+       //do:
+       strncpy( szServiceName_, v_argument.getServiceName().c_str(), MAX_PATH );
+       strncpy( szConfigPath_, v_argument.getConfigPath().c_str(), MAX_PATH );
+       strncpy( szLogPath_, v_argument.getLogPath().c_str(), MAX_PATH );
+       szServiceName_[ MAX_PATH ] = 0;
+       szConfigPath_[ MAX_PATH ] = 0;
+       szLogPath_[ MAX_PATH ] = 0;
+
+       //\83f\83B\83\8c\83N\83g\83\8a\82Ì\95Ï\8dX
+       if( ! v_argument.getWorkDir().empty() ) {
+               _chdir( v_argument.getWorkDir().c_str() );
+       }
+
+       SERVICE_TABLE_ENTRY serviceEntries[] = {
+               { szServiceName_, service_main },
+               NULL
+       };
+       if( ! StartServiceCtrlDispatcher( serviceEntries ) ) {
+               throw std::runtime_error( "\83T\81[\83r\83X\82Ì\8bN\93®\82É\8e¸\94s\82µ\82Ü\82µ\82½\81B" );
+       }
+}
diff --git a/jvmservice/service_main.hpp b/jvmservice/service_main.hpp
new file mode 100644 (file)
index 0000000..5d3f295
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef INCLUDE_H_SERVICEMAIN
+#define INCLUDE_H_SERVICEMAIN
+
+#include <string>
+#include <exception>
+
+#include "CommandArgument.hpp"
+
+void service_dispatcher( const CommandArgument& v_argument ) throw ( std::exception );
+
+#endif
diff --git a/jvmservice/stdafx.cpp b/jvmservice/stdafx.cpp
new file mode 100644 (file)
index 0000000..c0c6b36
--- /dev/null
@@ -0,0 +1,8 @@
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h\82Ì\82Ý\82ð\8aÜ\82Þ\83\\81[\83\83t\83@\83C\83\8b\82Å\82·\81B
+// JVMStarter.pch \82Í\81A\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\83w\83b\83_\81[\82É\82È\82è\82Ü\82·\81B
+//  stdafx.obj \82É\82Í\83v\83\8a\83R\83\93\83p\83C\83\8b\8dÏ\82Ý\8c^\8fî\95ñ\82ª\8aÜ\82Ü\82ê\82Ü\82·\81B
+
+#include "stdafx.h"
+
+// TODO: \82±\82Ì\83t\83@\83C\83\8b\82Å\82Í\82È\82­\81ASTDAFX.H \82Å\95K\97v\82È
+// \92Ç\89Á\83w\83b\83_\81[\82ð\8eQ\8fÆ\82µ\82Ä\82­\82¾\82³\82¢\81B
diff --git a/jvmservice/stdafx.h b/jvmservice/stdafx.h
new file mode 100644 (file)
index 0000000..cf7f596
--- /dev/null
@@ -0,0 +1,18 @@
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b\81A\82Ü\82½\82Í
+// \8eQ\8fÆ\89ñ\90\94\82ª\91½\82­\81A\82©\82Â\82 \82Ü\82è\95Ï\8dX\82³\82ê\82È\82¢\81A\83v\83\8d\83W\83F\83N\83g\90ê\97p\82Ì\83C\83\93\83N\83\8b\81[\83\83t\83@\83C\83\8b
+// \82ð\8bL\8fq\82µ\82Ü\82·\81B
+//
+
+#pragma once
+
+#define _WIN32_WINNT 0x0500
+
+#include <string>
+#include <exception>
+#include <iostream>
+#include <fstream>
+
+#include <windows.h>
+#include <jni.h>
+
+#pragma warning( disable : 4290 )
diff --git a/sample/SampleJVMService.java b/sample/SampleJVMService.java
new file mode 100644 (file)
index 0000000..84d6cbe
--- /dev/null
@@ -0,0 +1,41 @@
+import java.io.*;
+
+public class SampleJVMService {
+
+    public static void main( final String[] args ) throws Exception {
+        final PrintStream out = new PrintStream(
+            new FileOutputStream( args[ 0 ]  ) );
+
+        final Thread mainThread = Thread.currentThread();
+
+        final Thread shutdownThread = new Thread() {
+            public void run() {
+                out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8aJ\8en" );
+                for( int idx=0; idx<10 && mainThread.isAlive(); idx++) {
+                    mainThread.interrupt();
+                    try{
+                        mainThread.join( 100 );
+                    }
+                    catch( InterruptedException e ) {
+                    }
+                }
+                out.println( "\83V\83\83\83b\83g\83_\83E\83\93\97v\8b\81\8a®\97¹" );
+                out.close();
+            }
+        };
+        Runtime.getRuntime().addShutdownHook( shutdownThread );
+
+        int idx = 0;
+        for( ;; ) {
+            try{
+                out.println( idx++ );
+                Thread.sleep( 1000 );
+            }
+            catch( InterruptedException e ) {
+                break;
+            }
+        }
+        out.println( "\8fI\97¹\82µ\82Ü\82·\81B" );
+    }
+
+}
diff --git a/sample/jvmserv1.conf b/sample/jvmserv1.conf
new file mode 100644 (file)
index 0000000..48f6155
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# JavaVM\82Ö\93n\82·\83p\83\89\83\81\81[\83^\82ð\8ew\92è\82µ\82Ü\82·\81B
+#
+
+# \83N\83\89\83X\83p\83X\82ð\8ew\92è\82µ\82Ü\82·\81B
+-Djava.class.path=C:\temp\sample
+
+# JNI\82Ì\90f\92f\83\81\83b\83Z\81[\83W\82ð\8fo\97Í\82µ\82Ü\82·\81B
+-verbose:jni
+
+# \83\8d\83O\83I\83t\82É\82æ\82èJavaVM\82ª\83V\83\83\83b\83g\83_\83E\83\93\82µ\82È\82¢\82æ\82¤\82É\8ew\8e¦\82µ\82Ü\82·\81B
+-Xrs
+
+# \8eÀ\8ds\82·\82é\83N\83\89\83X\82¨\82æ\82Ñ\83\81\83\\83b\83h\81A\82»\82Ì\88ø\90\94\82ð\8ew\92è\82µ\82Ü\82·\81B
+SampleJVMService test.txt