--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>jvmservice</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
--- /dev/null
+
+/* 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 */
--- /dev/null
+<!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<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" );
+ }
+</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 />[&]\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">& \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"> & (\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& (\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Ì& (\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& (\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& (\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>
+
+
+
+
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+<!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>
--- /dev/null
+\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}
--- /dev/null
+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 );
+}
--- /dev/null
+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
--- /dev/null
+#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;
+}
+
--- /dev/null
+#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
--- /dev/null
+#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 );
+}
+
+
+
--- /dev/null
+#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
--- /dev/null
+#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 );
+ }
+}
--- /dev/null
+#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
--- /dev/null
+#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_ );
+}
+
--- /dev/null
+#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
--- /dev/null
+#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 );
+}
+
--- /dev/null
+#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
--- /dev/null
+#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;
+}
+
--- /dev/null
+#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
--- /dev/null
+#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() );
+ }
+}
+
--- /dev/null
+#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
--- /dev/null
+#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();
+}
+
--- /dev/null
+#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
--- /dev/null
+#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;
+}
+
--- /dev/null
+#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_;
+}
--- /dev/null
+#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
--- /dev/null
+#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 )
+{
+}
--- /dev/null
+#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
--- /dev/null
+#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 );
+ }
+ }
+}
--- /dev/null
+#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ñ\81B
+ * \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
--- /dev/null
+#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
--- /dev/null
+#
+# 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
--- /dev/null
+#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 );
+}
--- /dev/null
+#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
--- /dev/null
+#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_ );
+}
--- /dev/null
+#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
--- /dev/null
+#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 );
+}
--- /dev/null
+#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
--- /dev/null
+#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;
+}
--- /dev/null
+#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
--- /dev/null
+#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 );
+ }
+}
+
--- /dev/null
+#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
--- /dev/null
+// Microsoft Visual C++ \82Å\90¶\90¬\82³\82ê\82½\83\8a\83\\81[\83X \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
+
--- /dev/null
+<?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[\83X \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[\83X \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>
--- /dev/null
+#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;
+}
+
--- /dev/null
+//
+// 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)
+
--- /dev/null
+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
+.
--- /dev/null
+LANGUAGE 0x11,0x1
+1 11 MSG00411.bin
+LANGUAGE 0x9,0x1
+1 11 MSG00409.bin
--- /dev/null
+//{{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
--- /dev/null
+#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" );
+ }
+}
--- /dev/null
+#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
--- /dev/null
+// stdafx.cpp : \95W\8f\80\83C\83\93\83N\83\8b\81[\83h\82Ì\82Ý\82ð\8aÜ\82Þ\83\\81[\83X \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
--- /dev/null
+// stdafx.h : \95W\8f\80\82Ì\83V\83X\83e\83\80 \83C\83\93\83N\83\8b\81[\83h \83t\83@\83C\83\8b\82Ì\83C\83\93\83N\83\8b\81[\83h \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[\83h \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 )
--- /dev/null
+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" );
+ }
+
+}
--- /dev/null
+#
+# 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