ActiveXでシリアルポートアクセス平成20年11月23日 ソースコードはトップページからダウンロードできます。 なぜ、ActiveX?
InternetExplorerを使って、Webページの中から78Kマイコンへアクセスできると嬉しいことがたくさんあります。例を挙げてみると、 などがあります。 最近では、多くの企業では情報セキュリティーのため、EXEベースのプログラムをインストールさせてくれません。そのため、78Kマイコンと通信しながら動くアプリケーションを作っても使ってもらえません。 それに対して、Webの画面の中ではJavaScriptについては寛容なことが多いでしょう。JavaScriptは、78Kマイコンを操作するアプリケーションを動かすには絶好の環境です。 しかし、JavaScriptは、基本的にはブラウザの中だけで動くものなので、ローカル資源(ディスク、USB、シリアルポートへのアクセスは、基本的にはできません。 Webアプリ(JavaScript)の中からUSBへアクセスするには、ActiveXを使います。 ActiveXとは、DLLの上に一枚クラスをかぶせたようなものですが、その実態はただのDLLと同じ権限で動くライブラリなので、ローカルPC上で何でもできます。いつでもどこでも(JavaScriptでもVBでもC++でもC#でも)どこからでも(ローカルでもネットでも)呼び出すことができます。 そのため、セキュリティー上問題があるとも言われています。 ActiveXの認証と安全マークActiveXを使うには、通常はデジタル証明書とか署名とかそういう面倒なものが必要です。 この証明書を得るには、年間5万円~10万円の登録量と、会社の登記謄本などが必要となります。そのため、個人で趣味で気軽に使うには少々荷が重いといえます。 なお、自分で自分を証明する「オレオレ証明書」ではWindowsXPはごまかせませんでした。インストールすらさせてもらえません。 しかし、登録料と登記謄本がないとActiveXが使えないかというとそういうわけではなく、ローカルにインストールしてもらえばよいということがわかりました。 つまり、Webサイトをみただけで勝手にインストールされて実行されてしまうようなActiveXは証明書が必要なのですが、ユーザが自らの意思で「インストールEXE」を実行してローカルにインストールした場合は、証明書はいらないのです。ただし、ActiveXからローカル資源にアクセスするには、安全マークをつける必要があります。 ユーザが自らの意思でActiveXをインストールしたら、そのActiveXはWebブラウザの中から使えるようになります。(他人が作ったJavaScriptからも使えてしまうので、すごく危険ですね) ローカルのPCにActiveXをインストールするには、regsvr32.exeという、Windowsのコマンドを使います。ActiveXのプログラムは.ocxという拡張子で提供されるので、 regsvr32 XXX.ocx と実行します。すると、ActiveXのGUID(一意の識別番号)とOCXファイルの所在パスがレジストリに登録され、JavaScript中にGUIDを埋め込むことでActiveXが使用できるようになります。 ActiveXの使い方トラ技78Kマイコン用に用意したActiveXは、web78k.ocxという名前で配布します。 Webページの中からActiveXを使うのはとても簡単で、次のような文を埋め込みます。
1F5A2B67-729E-43C9-AB5A-4754E5E75758というのは、トラ技78K用ActiveXのGUIDです。BorlandC++BuilderでActiveXフォームを作ったときに適当に生成されました。 id="act1"というのは、このActiveXを使うときのオブジェクト名になります。 codebase="web78k.ocx"の行は省略してしまったほうがよいでしょう。 widthとheightは、このActiveXフォームが表示される大きさです。 このActiveXが呼び出されると、レジストリ(HKEY_LOCAL_MACHINE\HARDWARE\ DEVICEMAP\SERIALCOMM)を検索してローカルPCに存在するシリアルポートを数え上げます。 そして、見つかった順番に、0,1,2・・の数字を割り当てます。(この数字はCOM1やCOM10の数字とは関係ありません。あくまでも見つかった順番です) 以下のメソッドを使って仮想COMポートにアクセスしてください。 プロパティ NumOfPortsローカルPC上に見つかったシリアルポートの数を返します。 例 if(act1.NumOfPorts == 0) alert("シリアルポートがみつかりません"); メソッド GetPortDescr(int N)N番目のシリアルポートの説明書きを文字列で返します。 例 document.write(act1.GetPortDescr(i)); メソッド OpenPort(int N)N番目のシリアルポートをオープンします。成功したらTRUEが、失敗したらFALSEが返ります。 例 act1.ClosePort(); メソッド ClosePort()現在開いているシリアルポートを閉じます。 例 act1.OpenPort(0) メソッド ReadData()現在開いているシリアルポートからデータを読み出します。もしデータがなければ、次にデータが到着するまで待ちます。 扱うデータはテキスト文字列です。バイナリデータを読み出した場合の動作は保証できません。 例 rxarea.value += act1.ReadData(); メソッド ReadQuery()現在開いているシリアルポートに読み出せるデータがあるかどうか調べます。データがあればそのサイズ(バイト数)を、データがなければ0を返します。 例 if(act1.ReadQuery() > 0) ・・・ メソッド WriteData()現在開いているシリアルポートに文字列を書き込みます。 扱うデータはテキスト文字列です。バイナリデータを書き込んだ場合の動作は保証できません。 例 var txarea = document.getElementById("tx")
; メソッド IsOpened()現在、シリアルポートが開いているかどうか調べます。 例 if(act1.IsOpened() == false) return; メソッド DestroyActiveX()ActiveXで使用したリソースを解放します。 例 <BODY onunload = "DestroyActiveX();">
ぜひとも、このActiveXを使って操作を自動化してみてください。 |
|
|
Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず