HSPサンプルスクリプト - 標準入力をパイプにリダイレクトして起動したコンソールアプリケーションに直接データを流し込む時の注意
標準入力をパイプにリダイレクトして起動したコンソールアプリケーションに直接データを流し込む時は、最後にヌル文字を書き込む必要があるので注意。
| 固定リンク | コメント (0) | トラックバック (0)
標準入力をパイプにリダイレクトして起動したコンソールアプリケーションに直接データを流し込む時は、最後にヌル文字を書き込む必要があるので注意。
| 固定リンク | コメント (0) | トラックバック (0)
ウィンドウズのコモンコントロール「月間カレンダーコントロール」関連の定数リスト。
ソースはサイドバーリンクの『プログラミング工房』 - 「HSPの部屋」にあります。
| 固定リンク | コメント (0) | トラックバック (0)
逆引きHSP3 プログラミング事典 基本編
さくら・悠黒 喧史・うすあじ・おにたま (著) / 工学社 / 2006-07-21 / 208 ページ / ¥ 2,4152.55版の逆引き本はかなり使いでがあったのでこちらも期待できそうです。
| 固定リンク | コメント (0) | トラックバック (0)
「HSPプログラムコンテスト2006」のホームページが仮オープンしました。コンテストの作品応募受付期間は8月1日~10月31日となっています。今年はどんな作品で勝負しますか?
過去のコンテスト結果のページでは、技術的に優れたものからユニークな発想のものまでさまざまな作品が楽しめます。
| 固定リンク | コメント (0) | トラックバック (0)
このサンプルは、名なしパイプと独自のウィンドウメッセージを利用し、2つのアプリケーション間でテキストデータのやりとりを行う機能を記述したスクリプトです。動作確認はHSP3.1 beta3 / WinXP Pro SP2で行っています。
サンプルの"editor.hsp"と"tool.hsp"は、それぞれランチャー機能付きのテキストエディタと、エディタから起動されてエディタとプロセス間通信をしながら小さな仕事を行うユーティリティを模して書かれています(サンプルなので構造はごくシンプルです)。ちょうどテキストエディタのTeraPadとTeraPadツールのような関係です。(このサンプルはTeraPadの仕組みを調べて書いたわけではありません)
2つのソフトが行う処理の流れは以下のようになります。
editor.exe起動(editor.hspを読み込みmesboxに表示。tool.exe起動用のbuttonを表示)(ユーザが操作)
↓
mesbox内のテキストの一部または全体を選択(ユーザが操作)
↓
editor.exeのウィンドウ上のボタンをクリックしてtool.exeを起動(ユーザが操作)
↓
tool.exeがeditor.exeのウィンドウを検知したあと、editor.exeに対して
mesbox内の選択テキストを送信するように要求する
↓
editor.exeがtool.exeにデータを送る
↓
tool.exeが受け取ったテキストを加工する
↓
tool.exeがeditor.exeに対してデータを受け取る処理に入るように要求する
↓
tool.exeが加工済みのテキストをeditor.exeに送り返す
↓
editor.exeが受け取ったテキストをmesbox内の選択テキストと置き換える
↓
終了
"tool.exe"は"editor.exe"から起動され自分の仕事を完了すると自動的に終了します……
続きはサイドバーリンクの「プログラミング工房」で。
| 固定リンク | コメント (0) | トラックバック (0)
HSP3からコンソール・アプリケーションを起動し、そのアプリが出力したデータを直接変数で受け取るサンプル スクリプト。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このソフトはランチャー機能付きのエディタと共に使うことで、Ruby、Perl、Python、Tcl/Tkなどのスクリプト言語でのプログラミング時に引数付きのデバッグ実行が簡単に行えます。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
リンク先のスクリプトは、HSP3のhspinet.dllの命令を使ってAmazon E-Commerce Service(以下ECS)にアクセスし、そこから取得したXML形式の商品データをCOMコンポーネントのMSXMLで解析するプログラムです。
ECSとはオンラインショップのAmazonが提供しているAmazon Web Service(AWS)というサービスの一つで、登録ユーザはAmazonの商品データベースに自由にアクセスしたり、ショッピングカート機能を自分のウェブサイトに組み込んだりといった機能を無料で利用することができます。ユーザの多くはアマゾン・アソシエイト・プログラムと組み合わせる形で利用していると思われます。Amazon Web Service(AWS)のページはこちら
リンク先のスクリプトでは、RESTと呼ばれるHTTP経由のアクセス方法でECSのデータベースから商品データをダウンロードし、一度ファイルに保存してからMSXMLによってXML形式のデータを解析、切り出した商品情報を使ってシンプルな内容のウェブページ(HTMLファイル)を生成しています。生成されるHTMLファイルの例はこちら
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
実行しているPC上で利用できる可能性のあるCOM(Win32OLE、ActiveX)コンポーネントのProgIDリスト、メソッド/プロパティリスト、メソッド/プロパティ仕様をブラウズするためのソフト。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このソフトは標準入力がリダイレクトされていればそこからデータを取得して、指定された文字列を各行末に追加または各行末から削除し標準出力に出力します。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
Windowsで特定のパスにある実行ファイルがGUIアプリかコンソール・アプリかを見分けるには、実行ファイル自体に埋めこまれたサブシステムを表す値を参照する必要があります。
通常のWindowsアプリの実行ファイルは、MS-DOS上で実行するためのプログラムとWindows上で実行するためのプログラムが合体した形式になっていて、サブシステムを表す値はWindows用プログラムのエリアに埋めこまれています。(最近のアプリではMS-DOS用のプログラムは中身のないダミーであることが多い)
サブシステムの値の位置を特定するには、まずMS-DOS用のプログラムエリアに埋めこまれているWindows用プログラムエリアの開始位置(=PEシグネチャへのオフセット)を参照し、その開始位置にサブシステムを表すデータへのオフセット(固定値)を加えます。この位置にある2バイトのデータが目的の情報です。
値が表す意味はリンク先のスクリプトのマクロにある通りです。例えばHSPで作成した実行ファイルをリンク先のスクリプトでチェックすると2か3になります。
ちなみにWin32APIの"GetBinaryType"という関数はWin32/Win16/DOSの種別を判定できるだけで、HSPで作成した実行ファイルをチェックすると、"hsp3cl.hrt"を使うか否かに関わらず「Win32」と判定されます。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このソフトは標準入力がリダイレクトされていればそこからデータを取得して、指定された文字列を各行頭に追加または各行頭から削除し標準出力に出力します。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このソフトは標準入力がリダイレクトされていれば、そこからデータを取得してクリップボードに出力し、リダイレクトされていなければ、クリップボードのテキストを取得して標準出力に出力します。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
nakkaさんという方がアナログ版を公開されていますが、自分的にはデジタルの方が見やすいと思ったので作ってみました。
詳しくはサイドバーリンクの「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
HSPのウィンドウをアクティブにするための標準命令としてはgselがありますが、ウィンドウを前面に移動することはできてもアクティブ化に失敗することがあります。
このモジュールをインクルードしてactivate_mywin命令を使用することで確実にHSPのウィンドウをアクティブにすることができます。もしうまく行かない場合にはactivate_mywin命令を実行する直前か直後に"gsel ?,1"や"gsel ?,2"を実行するようにして下さい。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
Windowsのごみ箱は、ファイル・フォルダ操作時のセーフティネットとして便利ではあるのですが、時々空にする操作が面倒です。設定で容量を小さくすることはできますが、それでもいっぱいになるまで放っておくとかなりの数になって、なんとなくハードディスクを無駄使いしているような気になってしまいます。かといって、ごみ箱を無効にしてしまうといざという時に後悔することになるのも確かです。
このスクリプトはHSP3で簡単にごみ箱を空にする処理を行うためのモジュールです。メインのスクリプトの冒頭でモジュールをインクルードし、emptyrbin命令を引数なしで呼び出すだけで使えます。このモジュールを使って作った実行ファイルをWindowsの「スタートアップ」フォルダに入れておけば、パソコンを起動する度に自動でごみ箱を空にすることができ、パソコンの使い勝手がちょこっと良くなります。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
モジュールファイルを#includeして、それより後ろの位置でbeep命令を呼び出すだけで使えます。毎回APIを登録しなおすよりは楽だと思います。(^^;)
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
任意のウィンドウに描画した16*16ピクセルの画像をタスクトレイアイコンとして登録することができます。同時に登録できるアイコンの数は1つです。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
拡張プラグインhspext.dllを使わずにクリップボードを操作できます。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
Windowsでは同時に複数のプログラムを使うことができますが、これは実際にはWindowsの管理の下、非常に短いサイクルで、個々のプログラムにかわりばんこにCPUを使わせるようにすることで実現されています。
そしてHSPで作れるような一般のプログラムは、普通はみな同じ時間だけCPUを使う許可を与えられますが、プログラムの種類によっては、必要な処理を行うのに他のプログラムより少ない時間しか必要ない場合もあります。
そういう時に「自分がCPUを使う時間は他のプログラムよりも短くていいですよ」とWindowsに知らせることで、他のたくさんの仕事を行うプログラムにCPUを使う時間を譲ってあげることができます。これをHSPで実行するには下のリンク先のようなモジュールを使って自分の実行優先度を低くすればOKです。
使い方は、モジュールをインクルードして"set_priority"命令を実行するだけです。このモジュールは主にプロセスの実行優先度を低くするためのものとして作っています。
例えば、時計ソフトを作る場合、1秒に1回または1分に1回時間のチェックと表示の更新ができれば目的が達せられるので、スクリプトの最初の方で"set_priority IDLE_PRIORITY_CLASS,THREAD_PRIORITY_IDLE"などと実行して優先度を最低に設定することでCPUに極力負担をかけないソフトにすることができます。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
HSP 2.61のinputオブジェクトはフォーカスがある時にEnterキーやTabキーを押しても警告音が鳴らないように作られていましたが、HSP 3.0(a)ではまだ警告音が鳴ってしまう現象は修正されていません。
リンク先のソースははmesboxを使って警告音が鳴らないinputもどきを作るスクリプトです。ポイントはonkey命令を使ってEnterキーの押し下げを検知して、mesboxに改行が追加される前に一度中身のテキストをコピーしておき、await命令の所で改行が追加されたあとでそのテキストをmesboxに戻すことです。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
Windows用キーボードのほぼすべてのキーコードをHSP3用のマクロにしたものです。Tatsuo Sugiharaさんの仮想キーコード表のページを元に作成しました。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
スクリプト上で出力用ファイルとデータ受け渡し用のパイプを作成してコンソール・アプリを起動する処理のサンプルです。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
とりあえずCRLF/CR/LFの3種類とも対応してますが、含まれる改行コードの形式が1種類に統一されているShift-JIS文字列でのみ動作確認済みです。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
RGB形式の色情報をWin32APIなどで使われる型の値に変換します。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このソフトはHSP3付属のWin32 API定義ファイルから簡単に目的の定義を見つけてクリップボードにコピーするためのソフトです。HSP3付属のAPI定義ファイルをそのままインクルードするとオブジェクトファイルのサイズが無駄に膨らんでしまうため、必要な定義だけを簡単にコピペしたいと思い作りました。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
コマンドラインランチャーやコマンドラインランチャー機能付きのエディタなどからHSPスクリプトを実行/コンパイルしたり、スクリプトからの実行ファイル作成を行うためのソフトです。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
リンク先はコマンドプロンプト(cmd.exe)で2つのコンソール・アプリをパイプ記号("|")でつないだコマンドラインを実行したときの動作を再現するスクリプトです。名無しパイプを利用しています。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
標準入力から来たテキストデータ、またはコマンドライン引数に指定されたパスのテキストファイルの内容をそのまま標準出力に出力するコンソール・アプリケーションです。シンプルなコンソール・アプリのサンプルになっています。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
このモジュールは、コンソール・プログラムでは必須の機能であるがHSP3CLの標準機能ではカバーできない作業を引き受けます。主な命令・関数は以下の通りです。
●is_stdin_redirected 関数
標準入力がキーボード以外にリダイレクトされているかをチェックできます。
●input2 命令
私の環境ではHSP3CLでinput命令を実行した時に受け取るデータのサイズが大きいとシステムエラーが発生してスクリプトが強制終了してしまうことがあります。input ?,?,0 の代わりにinput2命令を使うことでデータのサイズを気にせずにすみます。
●mes2 命令
出力データの末尾に改行コードが付加されてしまうmes命令では不都合な場合に使います。
詳しくは「プログラミング工房」へ
| 固定リンク | コメント (0) | トラックバック (0)
HSP 3.0のマイナーアップデートバージョンHSP 3.0aのテスト版が更新されました。
Hot Soup Processor オフィシャルホームページ
とりあえず、inputにフォーカスがあるときにEnterキーやTabキーを押すと警告音が鳴ってしまう現象が修正されているのは確認しました。 ← 2005/10/7訂正。左記の内容は誤りでした。すみません。
| 固定リンク | コメント (0) | トラックバック (0)
HSP 3.0のマイナーアップデートバージョンのHSP 3.0aのテスト版が公式サイトで公開されています。
| 固定リンク | コメント (0) | トラックバック (0)
Kpanさん作のHSP製実行ファイル圧縮ソフト「Let's HSPUPX!」のHSP 3.0対応版が公開されています。
| 固定リンク | コメント (0) | トラックバック (0)
HSP3のサンプルアプリケーションとしてHSP3用コンパイラcHspComp ver.0.3.1(ソースのみ)を公開しました。
| 固定リンク | コメント (0) | トラックバック (0)
この記事へのトラックバック一覧は「HSP3 お勉強メモ」のテーマごとの先頭記事一覧になってます。
(外部からのトラックバックが混ざってしまう可能性はあります)
| 固定リンク | コメント (0) | トラックバック (1)
#modinit、#modfunc命令を利用して作ったモジュールの使い方。
「HSP3 お勉強メモ 「モジュール」」で書いたオブジェクト指向で言う「インスタンス」の作成にはnewmod命令を使う。第1引数に「インスタンス」(=#module命令で指定した変数)を格納する変数(モジュール変数と呼ぶ)を指定し、第2引数には利用するモジュール名を指定する。
/* newmod命令記述例 */
newmod modvar,modname
もともとnewmod命令の実行時にはモジュール変数に含まれる変数(=#module命令で指定した変数)はすべて整数の0で初期化されるが、モジュールに#modinit命令で定義された命令がある場合それも自動的に実行されるので、モジュールごとに自由に初期化を定義できる。この初期化命令に引数を渡したいときは、newmod命令の第3引数以降にそのまま指定することができる。
/* 初期化命令の引数も指定したnewmod命令記述例 */
newmod modvar,modname,p1,p2
複数の「インスタンス」を作成する場合は、別のモジュール変数を用意してもいいし、すでに使われているモジュール変数を指定してもいい。すでに使われているモジュール変数を指定するとそのモジュール変数は自動的に配列になる。
「インスタンス」を破棄するにはdelmod命令を使う。第1引数にモジュール変数を指定する。
/* delmod命令記述例 */
delmod modvar
/* 複数の「インスタンス」を格納している場合は要素のインデックスも指定する(0の場合は省略可) */
delmod modvar(1)
ただしdelmodしてもモジュール変数(の要素)自体が消滅するわけではなく、再度同じ変数に対してnewmodした時に使いまわされる。(配列の場合、要素は指定できない)
「インスタンス」作成時にモジュール変数を上書きしたい時や配列の要素を指定したい時には、newmod命令の代わりにsetmod命令を使う。初期化もnewmodの時と同様に行われる。
/* setmod命令記述例 */
setmod modvar(1),modname
モジュール変数(配列)の特定の要素が使用中かどうかを調べるにはmoduse関数を使う。
/* moduse関数使用例 */
if moduse(modvar(0))=0 : mes "modvar(0)は使用されていない"
moduseは関数なので式に含めることができる。
モジュール変数の使用中のすべての要素に対して処理を行うためのforeachというループ命令も追加されている。第1引数にモジュール変数を指定する。
/* foreach命令使用例(getxは#modfunc命令で定義された関数という前提) */
foreach modvar
getx modvar(cnt)
mes refstr
loop
ちなみに配列の現在の要素数はlength関数で調べることができる。
/* length関数使用例 */
mes "配列要素の最大="+length(modvar)
lengthも関数なので式に含めることができる。
| 固定リンク | コメント (0) | トラックバック (0)
HSP3になってモジュールは大幅に機能追加されたが、これはHSPでオブジェクト指向っぽいプログラミングをするための改良と言っていいと思う。実際作者のおにたまさんはマニュアルの中で「コンストラクタ」という単語も使っている。この改良によってモジュールをクラス的な物としても使えるようになった。(継承やらなんやらできないこともありますが)
具体的な機能変更・追加点としては、まず#module命令の引数にモジュール名に加え任意の数の変数を指定できるようになった。
/* #module命令記述例 */
#module modname x,y,z
ここにはオブジェクト指向で言うところの「インスタンス」ごとに個別の物として扱いたいデータ名を指定する。モジュール内ではこの名前で扱う。さらにこの変数は通常のモジュール内の変数とは異なり、HSP3で新しく追加された#modinit命令または#modfunc命令で定義したユーザ定義命令を経由してしかアクセスできない。
モジュール外のスクリプトで「インスタンス」を作成する際、同時にその「インスタンス」を初期化することもでき、モジュール内にそれ専用の命令を記述するための命令が#modinit。#modinitで定義された命令は「インスタンス」作成時に自動的に一度だけ呼び出される。スクリプトから明示的に呼びだすことはできない。
あとモジュールの使用にからむ変更点として、ユーザ定義命令(#deffunc、#modfunc、#modinit命令で定義される命令)の引数の指定方法とreturn命令の仕様、そしてローカル変数の追加がある。
ユーザ定義命令の引数は以下のようにデータタイプだけでなくユーザ定義命令内での名前も同時に指定するようになった。HSP2.xでのmref命令を使ってユーザ定義命令内で指定する方法はHSP3では非推奨となった。引数に指定できるデータタイプの数も増えている。
/* ユーザ定義命令の引数指定例 */
#deffunc afunc int p1,val p2
この方がスクリプトもすっきりしていいと思う。
return命令は、引数に変数を一つ指定するとその内容がシステム変数のstatあるいはrefstrに自動で代入されるようになった。どちらのシステム変数に代入されるかは引数に指定した変数のタイプによって決められる。これもスクリプトの簡略化に役立つ。
/* return命令の引数指定例 */
return x
ローカル変数は、ユーザ定義命令の定義で引数と併記する形で指定した変数について、ユーザ定義命令を実行するごとに生成・初期化・破棄が行われる機能。引数では通常データタイプを指定するところに"local"と記述するとローカル変数として扱われる。
/* ローカル変数の指定例 */
#deffunc afunc int p1,val p2,local tmp
| 固定リンク | コメント (0) | トラックバック (1)
プログラミング | ホームページ更新情報 | 日記・コラム・つぶやき | 書籍・雑誌 | 自作ソフト | ActiveBasic | Aspire one | C/C++ | HSP | HSP3 | HSP3 サンプルアプリケーション | HSP3 サンプルスクリプト | HSP3 サンプルモジュール | IronPython サンプル | IronPython Tips | Linux | NS Basic | Perl | Python | Ruby | Ruby サンプルスクリプト | Ruby Tips | TRPG・ゲームブック | Tcl/Tk | WideStudio | WideStudio サンプルアプリケーション | WideStudio Tips | Windows | Windows PowerShell