IronHSP 仕様書

HSP3 .NET Framework 統合版 — 最終更新: 2026-04-18 (章構成再編 11 章 / 変数型・コンパイラ・ランタイムを正しく分離 / ネイティブコールバック + 環境変数説明拡充 / 全 151 iron_* + 31 C++ DLL + 51 Win32 DLL 6020 関数)

ベース: OpenHSP 3.8beta1 (SVN trunk) / ターゲット: .NET Framework 4.8 / ツールセット: v143 (VS2022)

⚠ 開発中の仕様書です

IronHSP は現在活発に開発中のため、本仕様書に記載されている言語仕様・ディレクティブ・関数 API・プラグインインターフェースは予告なく変更・削除される場合があります。コミット単位で挙動が変わることもあります。安定版リリースまでは、本ドキュメントは実装のスナップショットとして参照してください。

目次

1. 概要

IronHSP は、HSP3 (Hot Soup Processor 3) をベースに .NET Framework 連携 + 64bit 整数/ポインタ対応 + 構造体・共用体 + UTF-16 ワイド文字列 + COM コールバック + Win32/DirectX/.NET 相互運用 を加えた大幅拡張版です。hsp3net ランタイム系 (hsp3_net_64.exe / hsp3cl_net_64.exe / hspcmp_net_64.exe) にすべての新機能が集約され、バニラ HSP とは #include "hsp3_net_64.as" で明示的に切替える構成です (64bit 版が主、32bit 版はサブセット)。

言語・ランタイムの主な拡張

プラグイン・モジュール面の主な拡張

NHSP (Net HSP) — HSP 風文法の .NET コンパイラ

IronHSP リポジトリには、HSP 風の文法で 純粋な .NET Framework 4.8 アセンブリ (DLL / EXE) を生成する独自言語・独自コンパイラ NHSP を同梱しています。IronHSP (HSP ランタイム上で .NET を呼ぶ) とは逆方向の、HSP 風文法で .NET ネイティブな成果物を作るアプローチです。

2. ビルド構成

2.1 ランタイム

プロジェクト出力ファイルCLRプラットフォーム
hsp3\win32gui\hsp3.slnhsp3.exeなしx86
hsp3\hsp3_64.slnhsp3_64.exeなしx64
hsp3\win32\hsp3cl.slnhsp3cl.exeなしx86
hsp3\hsp3cl_64.vcxprojhsp3cl_64.exeなしx64
hsp3net\win32gui\hsp3.slnhsp3.exe (.NET版)ありx86
hsp3net\hsp3_64.slnhsp3_64.exe (.NET版)ありx64
hsp3net\win32\hsp3cl.slnhsp3cl.exe (.NET版)ありx86
hsp3net\hsp3cl_64.vcxprojhsp3cl_64.exe (.NET版)ありx64

2.2 コンパイラ・デバッガ

プロジェクト出力ファイル (x86)出力ファイル (x64)
hspcmp\win32dll\hspcmp.vcxprojhspcmp.dllhspcmp64.dll
hspcmp\win32\hspcmp.vcxprojhspcmp.exehspcmp64.exe
tools\win32\hsp3debug\hsp3debug.vcxprojhsp3debug.dllhsp3debug_64.dll

2.3 プラグイン

プラグイン出力 (x86)出力 (x64)備考
hspexthspext.dllhspext64.dll
hspdahspda.dllhspda64.dll
hspinethspinet.dllhspinet64.dll
hspvoicevoxhspvoicevox.dllhspvoicevox64.dllvoicevox_core 0.14.6
hgimghgimg.dllhgimg64.dllvcxproj 新規作成 (VS2022)
obaqobaq.dllobaq64.dllvcxproj 新規作成 (VS2022)
ZLibWrapZLibWrap.dllZLibWrap64.dll
hgimgxhgimgx.dllDirectX 8 依存 (32bitのみ)
hspcvhspcv.dll旧OpenCV (後日対応予定)

3. 変数型システム

IronHSP はバニラ HSP3 の変数型 (int / double / str / label / struct / comobj) に加え、5 つの新規変数型を追加しています。本章では全変数型と各拡張型の詳細を解説します。

Flag型名サイズ説明
HSPVAR_FLAG_NONE0--未定義
HSPVAR_FLAG_LABEL1labelポインタラベル(ジャンプ先)
HSPVAR_FLAG_STR2str可変長文字列
HSPVAR_FLAG_DOUBLE3double8 byte倍精度浮動小数点
HSPVAR_FLAG_INT4int4 byte32bit 符号付き整数
HSPVAR_FLAG_STRUCT5struct可変モジュール変数構造体
HSPVAR_FLAG_COMSTRUCT6comobjポインタCOM オブジェクト
(予約)7--VARIANT 用に予約
HSPVAR_FLAG_INT648int648 byte新規 64bit 符号付き整数
HSPVAR_FLAG_NETOBJ9netobjポインタ.NET .NET オブジェクト参照
HSPVAR_FLAG_WSTR10wstr可変長新規 UTF-16 LE ワイド文字列
HSPVAR_FLAG_NSTRUCT11nstruct可変新規 ネイティブ構造体 (#defstruct 用、stdim で確保)
HSPVAR_FLAG_MAP12map可変新規 連想配列 (dimmap で確保、文字列キーで要素アクセス)

3.1 int64 型サポート

3.1 新しい変数型

HSPVAR_FLAG_INT64 = 8 として組み込み型に追加されています。HSP スクリプトでは代入によって自動的に型が決まります。

; 通常のintリテラル(32bit)
a = 100

; int64 リテラル(Lサフィックス)
b = 100L

; 32bit範囲を超える値は自動的にint64
c = 3000000000

; 16進数もint64になる(8桁超)
d = $100000000

; int64() 関数で明示的に変換
e = int64("9223372036854775807")
e = int64("0xFFFFFFFFFFFFFFFF")
e = int64("$FEDCBA0987654321")

3.2 新しい命令・関数

名前種別書式説明
dim64命令dim64 var, n1 [,n2,n3,n4]int64 型の配列を宣言する
int64()関数int64(p1)値を int64 に変換する。文字列の場合は10進・16進(0x/$)を自動判別
qpeek()関数qpeek(var, offset)バッファから int64 値(8byte)を読み取る
qpoke命令qpoke var, offset, valueバッファに int64 値(8byte)を書き込む。文字列を渡すと自動変換

3.3 int64 対応済みの既存機能

機能対応内容
statint64 型で返す。_s = stat で _s は自動的に int64 型になる
wparam / lparam / iparamint64 型で返す
varptr()64bit環境ではポインタを int64 で返す
dupptr第2引数(ポインタアドレス)を int64 で受け取る(64bitポインタ対応)。第4引数の型指定で vartype("int64") も使用可能
#deffunc / #defcfuncパラメータ型に int64 を指定可能。戻り値も int64 対応
#func / #cfuncパラメータ型に int64 を指定可能
dimtypedimtype var, vartype("int64"), n で int64 配列を宣言可能
DLL 戻り値#cfunc の戻り値が32bit範囲を超える場合、自動的に int64 で返す
mref val, 0x40stat を int64 型として参照する

3.4 型変換

変換元変換先動作
intint64符号拡張
int64int下位32bitに切り捨て
int64double浮動小数点に変換(精度253まで)
doubleint64整数部を取得
int64str10進文字列に変換
strint6410進 / 16進($, 0x)文字列をパース

3.5 使用例

; dim64 で配列宣言
dim64 i64, 16
repeat length(i64)
    i64(cnt) = int64("2147483647") + cnt
loop

; dimtype でも同じことが可能
dimtype i64_2, vartype("int64"), 4

; qpeek / qpoke
sdim buf, 64
qpoke buf, 0, int64("9223372036854775807")
mes "qpeek: " + qpeek(buf, 0)

; 文字列を渡すと自動変換
qpoke buf, 0, "0xFFFFFFFFFFFFFFFF"

; #deffunc / #defcfunc
#module
#defcfunc myadd64 int64 p1, int64 p2
    return p1 + p2
#global
r = myadd64(int64("1000000000000"), int64("2000000000000"))
mes r  ; => 3000000000000

3.2 UTF-16 ワイド文字列型 (wstr)

新しい変数型 wstr (HSPVAR_FLAG_WSTR = 10) で UTF-16 LE 文字列を直接扱えます。 Windows API の wchar_t 引数に変換なしで渡す用途を想定しています。

使用例

wsdim ws, 256               ; wstr 変数を宣言
ws = L"Unicode文字列"        ; L"..." リテラルで UTF-16 直接代入
ws = "SJIS文字列"            ; str → wstr 自動変換

n = strlen(ws)               ; wcslen() で文字数を返す
ws2 = strmid(ws, 0, 4)      ; wstr → wstr 部分文字列
p = instr(ws, 0, L"検索")   ; wcsstr() で検索
s = "" + ws                  ; wstr → str 自動変換

対応済み関数・命令

種別名前wstr 動作
関数strlenwcslen() で文字数を返す
関数instrwcsstr() で検索
関数strmidwchar_t 部分文字列 (戻り値も wstr)
関数strtrimwchar_t トリム (戻り値も wstr)
関数getpathパス操作 (戻り値も wstr)
命令strrepwchar_t 文字列置換
命令splitwchar_t 分割 (出力変数も wstr)
命令getstrwchar_t 区切り読み取り
notenotesel/noteget/noteadd/notedelwchar_t 行操作
notenoteinfo/notefindwchar_t 行カウント/検索
notenoteload/notesaveUTF-16 LE バイナリ読み書き

自動変換

str と wstr の間は MultiByteToWideChar / WideCharToMultiByte で自動変換されます。 int/double との変換も wcstol / swprintf 等で対応済みです。

詳細は wstr 設計書 を参照してください。

3.3 intptr (プラットフォーム依存整数型)

intptr はプラットフォーム依存サイズの整数型で、x86 ビルドでは 32bit、x64 ビルドでは 64bit のスロットを使用します。 HANDLELPxxx 系のポインタ引数を含む DLL 関数を 1 つの HSP source で **両プラットフォーム共通** に書けます。 hsp3net 専用 (vanilla hsp3 では未サポート)。

11.1 用途

従来は x86 / x64 で int / int64 を使い分ける必要があり、 ポインタ系の引数が出てくるたびに #ifdef __hsp64__ 等での切り替えが必要でした。 intptr を使えば 1 行で両対応できます。

11.2 使用可能な #directive

directive用途
#funcvoid 戻り値の DLL 関数
#cfuncint 戻り値の DLL 関数
#cfuncd / #cfuncfdouble / float 戻り値
#cfuncst構造体戻り値
#comfuncCOM メソッド呼出
#cbmethodCOM コールバックメソッド (後述)

11.3 使用例

#uselib "user32.dll"
#cfunc GetWindowLongPtr "GetWindowLongPtrW" intptr, int
#func  SetWindowLongPtr "SetWindowLongPtrW" intptr, int, intptr

#uselib "kernel32.dll"
#cfunc LoadLibraryW "LoadLibraryW" wstr
#func  FreeLibrary  "FreeLibrary"  intptr
#cfunc GetProcAddress "GetProcAddress" intptr, str

    hmod = LoadLibraryW("user32.dll")    ; intptr 戻り値 → 自動的に platform-sized
    fnPtr = GetProcAddress(hmod, "MessageBoxW")
    FreeLibrary hmod                      ; intptr 引数 → 自動的に正しいサイズで渡る
内部実装: 新しい MPTYPE_INTPTR 定数を hspcmp と hsp3net で共有。 hspcmp は型 ID を .ax に書き込むだけで、x64 / x86 共通の .ax を吐ける。 runtime 側は #ifdef HSP64code_geti64() または code_getdi() を使い分けて読む。 スロットサイズも platform に従う (x64=8 byte / x86=4 byte)。

3.4 連想配列 (MAP 型)

IronHSP では 文字列キーで値にアクセスできる連想配列 (MAP) を変数型として組み込みサポートしています。 内部は std::unordered_map<std::string, std::string> で実装されており、キー・値ともに文字列として保持されます。 代入時に int / double / int64 は自動的に文字列へ変換されます。

変数の作成

dimmap mymap     ; 連想配列を作成

値の読み書き

; 書き込み — map("key") = value
mymap("name") = "HSP"
mymap("year") = "2026"
mymap("score") = 100        ; int → "100" に自動変換

; 読み取り — map("key") で文字列が返る
mes mymap("name")            ; → "HSP"

; 変数キー
key = "name"
mes mymap(key)               ; → "HSP"

ヘルパー関数・命令

種別構文説明
関数mapcount(var)エントリ数を返す (int)
関数hasmap(var, "key")キーが存在すれば 1、なければ 0 (int)
関数mapkey(var, index)index 番目のキーを文字列で返す (列挙用)
命令delmap var, "key"指定キーのエントリを削除
命令mapclear var全エントリを削除

全キーの列挙

n = mapcount(mymap)
repeat n
    k = mapkey(mymap, cnt)
    mes k + " = " + mymap(k)
loop

注意事項

4. .NET 連携機能

4.1 .NET 命令一覧

命令説明
loadnetアセンブリをロードする。mode: 0=GAC短縮名, 1=GAC完全名, 2=ファイルパス, 3=C#ソース, 4=VBソース
newnet.NET クラスのインスタンスを生成する。static モード、ジェネリック型パラメータの自動検出に対応
delnet.NET オブジェクトを解放する
netresメソッド戻り値の格納先変数を設定する
tonetHSP の値(int/double/str/int64)を .NET オブジェクト (netobj) に変換する
enumnetenum メンバーの値を取得する。第2引数に netobj 変数またはアセンブリ名文字列を指定可能
getformsHSP ウィンドウ ID から WinForms の Form インスタンスを取得する
pushnetネイティブポインタのスコープをプッシュする(メモリ管理用)
popnetスコープをポップし、自動的にポインタを解放する。引数で保持するポインタを指定可能
enablewpfWPF 関連アセンブリ(PresentationCore等)をロードする
neterror.NET 例外のエラーモードを設定する。0=stat のみ(デフォルト), 1=HSP エラーとして throw
nettoval.NET オブジェクトを HSP の値型に変換する(関数形式)。Enum→int 変換、obj("$field") 式に対応
netexerr最後に発生した .NET 例外の情報を文字列で返す(関数形式)
formsaddctrlForm に .NET コントロールを追加する (0=Button, 1=CheckBox, 2=TextBox, 3=ComboBox, 4=ListBox)。GUI版のみ
netdelegateHSP ラベルを .NET デリゲートに変換する。EventHandler, Action 等に対応
netlinqLINQ 操作を C# ラムダ式文字列で実行する (Where, Select, OrderBy 等)
注意: COM 操作命令(newcom, querycom, delcom, comres, comevent, comevarg, comevdisp, sarrayconv 等)と 文字コード変換命令(cnvstow, cnvwtos, cnvstoa, cnvatos)は HSP3 標準機能として引き続き利用可能です。

4.2 変数型 HSPVAR_FLAG_NETOBJ

HSPVAR_FLAG_NETOBJ = 9 として登録されるユーザー定義型です。.NET オブジェクトへの参照を HSP 変数として保持します。

内部的には GCHandle によってネイティブポインタとして保持し、GC による回収を防ぎます。delnet または popnet のスコープ管理によって解放されます。

4.3 Hsp3Net クラス(内部 API)

C++/CLI の管理クラス tv::hsp::net::Hsp3Net が .NET 連携の中核です。主要な機能:

4.4 アセンブリの自動解決

newnet でアセンブリ名を指定する際、以下の順序で自動解決されます:

  1. 登録済み辞書(loadnet で明示ロードしたもの)
  2. AppDomain.CurrentDomain.GetAssemblies() からアセンブリ名で検索
  3. Assembly.LoadWithPartialName で動的ロード
  4. 全ロード済みアセンブリからクラス名(フルネーム)で検索

アセンブリ名に空文字列 "" を指定すると、ステップ4のクラス名検索が使われます。基本的な型(System.Object 等)は loadnet なしで使用可能です。

; loadnet 不要 — アセンブリ名に "" を指定
newnet pObj, "", "System.Text.StringBuilder", 0, "Hello"

; mcall でメソッド呼び出し
netres net_ret
mcall pObj, "ToString"

; nettoval で HSP の値に変換(関数形式)
; 第2引数: 2=str, 4=int, 3=double
s = nettoval(net_ret, 2)
mes s  ; => "Hello"

4.5 ジェネリクス

クラス名に `N が含まれる場合、newnet は最初のN個の引数をジェネリック型パラメータとして自動認識します。 型パラメータは netobj 変数または型名文字列で指定できます。

; List<String> を作成
newnet pList, "", "System.Collections.Generic.List`1", 0, "System.String"
mcall pList, "Add", "Alpha"
mcall pList, "Add", "Beta"
netres ret
mcall pList, "get_Count"
v = nettoval(ret, 4)    ; => 2

; Dictionary<String, Int32> を作成
newnet pDict, "", "System.Collections.Generic.Dictionary`2", 0, "System.String", "System.Int32"
tonet pVal, 100
mcall pDict, "Add", "key1", pVal

4.6 enumnet の拡張

enumnet の第2引数は、従来の netobj 変数に加えてアセンブリ名文字列でも指定可能です。 空文字列を指定するとロード済み全アセンブリから自動検索します。

; アセンブリ名文字列で指定
enumnet pFill, "System.Windows.Forms", "System.Windows.Forms.DockStyle", "Fill"

; 空文字列で全アセンブリ自動検索
enumnet pTop, "", "System.Windows.Forms.DockStyle", "Top"

; 従来通り netobj 変数でも指定可能
enumnet pDR, pDockPanel, "WeifenLuo.WinFormsUI.Docking.DockState", "DockRight"

; Enum → int / str 変換
v = nettoval(pFill, 4)   ; => 5 (DockStyle.Fill の整数値)
s = nettoval(pFill, 2)   ; => "Fill"

4.7 フィールドアクセス ($prefix)

netobj 変数の連想配列記法で $ プレフィックスを付けるとフィールドに、付けないとプロパティにアクセスします。 nettoval と組み合わせてフィールド値を直接取得可能です。

; フィールド読み取り
s = nettoval(pObj("$FieldName"), 2)

; フィールド書き込み
pObj("$FieldName") = "new value"

; プロパティアクセス($なし)
s = nettoval(pObj("Text"), 2)

4.8 formsaddctrl

HSP ウィンドウに .NET コントロールを追加する命令です。GUI版ランタイムのみ対応(CL版では非サポート)。

; formsaddctrl outvar, type, "text", x, y, w, h [, wid]
; type: 0=Button, 1=CheckBox, 2=TextBox, 3=ComboBox, 4=ListBox
formsaddctrl pBtn, 0, "OK", 10, 10, 100, 30
formsaddctrl pChk, 1, "Enable", 10, 50, 120, 24
formsaddctrl pTxt, 2, "input here", 10, 80, 200, 24

4.9 netdelegate (HSPラベル → .NETデリゲート)

HSP のラベル(サブルーチン)を .NET のデリゲートに変換します。 イベントハンドラ登録やコールバック渡しに使用できます。

; EventHandler デリゲートを生成
netdelegate pHandler, "EventHandler", *on_click

; Button.Click に登録
newnet pBtn, "", "System.Windows.Forms.Button", 0
mcall pBtn, "add_Click", pHandler
stop

*on_click
    mes "Button clicked!"
    return
デリゲート型シグネチャHSP ラベル仕様
EventHandler(object, EventArgs)return で戻る
Action()return で戻る
2引数 void 型(object, XXXEventArgs)EventHandler 互換として自動マッチ
1引数 bool 型(T) → boolreturn 0/1 で結果返却(Predicate等)

4.10 netlinq (LINQ 操作)

コレクションに対して LINQ 操作を C# ラムダ式文字列で実行します。 内部的に C# コードを動的コンパイルして実行します。

; List<String> を作成
newnet pNames, "", "System.Collections.Generic.List`1", 0, "System.String"
mcall pNames, "Add", "Alice"
mcall pNames, "Add", "Bob"
mcall pNames, "Add", "Charlie"

; Where: 条件フィルタ
netlinq pFiltered, pNames, "Where", "x => x.Length > 3"

; Select: 射影
netlinq pUpper, pNames, "Select", "x => x.ToUpper()"

; OrderBy: ソート
netlinq pSorted, pNames, "OrderBy", "x => x.Length"

; First / Count (引数なし)
netlinq pFirst, pNames, "First", ""
netlinq pCount, pNames, "Count", ""

; チェーン: Where → ToList
netlinq pW, pNames, "Where", "x => x.StartsWith(\"A\")"
netlinq pList, pW, "ToList", ""

4.11 GlobalAccess クラス(メモリ管理)

.NET オブジェクトのネイティブポインタを管理する静的クラスです。

4.12 例外処理とエラー報告

.NET の例外が発生した場合のエラー報告には2つのモードがあります。neterror 命令で切り替えます。

モード動作用途
neterror 0(デフォルト)stat に -1 を設定するのみ。スクリプト実行は継続される個別にエラーを確認して処理する場合
neterror 1HSP エラー HSPERR_DOTNET_EXCEPTION (#45) を throw する。onerror で捕捉可能例外を一括でハンドリングする場合

netexerr() 関数

最後に発生した .NET 例外の情報を文字列で返す関数です。引数でモードを指定できます:

引数返す内容
netexerr() または netexerr(0)例外メッセージ(Message プロパティ)"型 'System.Foo' が見つかりません"
netexerr(1)例外の型名(FullName)"System.TypeLoadException"
netexerr(2)詳細情報(ToString = メッセージ+スタックトレース)デバッグ用の完全な情報

使用例 1: stat チェック + netexerr

newnet pObj, "System", "System.NoSuchClass", 0
if stat = -1 {
    mes "エラー: " + netexerr()
    mes "例外型: " + netexerr(1)
}

使用例 2: onerror で一括捕捉

neterror 1
onerror goto *err_handler
newnet pObj, "System", "System.NoSuchClass", 0
stop

*err_handler
    dialog "例外: " + netexerr()
    end
注意: netexerr() は例外スタックからポップするため、呼び出すたびに次の例外が取得されます。 同じ例外の複数の情報(メッセージと型名など)が必要な場合は、変数に保存してから使用してください。

プロパティ代入時の自動型変換

.NET プロパティ/フィールドへの代入時、以下の自動型変換が行われます:

; int → Enum の自動変換例
pEH("Dock") = 5         ; DockStyle.Fill (int → DockStyle 列挙型)
pBtn("FlatStyle") = 0   ; FlatStyle.Flat (int → FlatStyle 列挙型)
pChk("CheckState") = 1  ; CheckState.Checked

5. WinForms 統合

5.1 screen 命令と Form

IronHSP では screen 命令で生成されるウィンドウは System.Windows.Forms.FormHspForms2 クラス)です。 HSP の描画命令(mes, boxf, color 等)は HWND 経由の GDI 描画として Form 上にそのまま表示されます。

HSP 命令実際の動作
screen id, w, hHspForms2 (Form) を生成。HWND = Form.Handle
title "text"Form.Text を設定
width w, hMoveWindow → Form サイズ変更
hwndForm.Handle (IntPtr) を返す
mes / boxfHWND 経由の GDI 描画 → Form クライアント領域に表示

5.2 GUI オブジェクトの .NET コントロール化

HSP の GUI オブジェクト命令は、.NET の WinForms コントロールとして生成され、Form.Controls コレクションに自動的に登録されます。

HSP 命令.NET コントロールイベント
buttonSystem.Windows.Forms.ButtonClick → WM_COMMAND (BN_CLICKED)
chkboxSystem.Windows.Forms.CheckBoxCheckedChanged → WM_COMMAND
inputSystem.Windows.Forms.TextBoxTextChanged → WM_COMMAND (EN_UPDATE)
mesboxSystem.Windows.Forms.TextBox (Multiline)TextChanged → WM_COMMAND (EN_UPDATE)
comboxSystem.Windows.Forms.ComboBoxSelectedIndexChanged
listboxSystem.Windows.Forms.ListBoxSelectedIndexChanged

.NET コントロールの Win32 コントロール ID は SetWindowLongPtr(GWLP_ID) で設定され、 HSP の既存の WM_COMMAND ベースのイベントルーティングがそのまま動作します。

5.3 getforms による Form アクセス

getforms 命令で HSP ウィンドウ ID から Form インスタンスを .NET オブジェクトとして取得できます。 取得した Form に対して mcall でプロパティの読み書きやメソッド呼び出しが可能です。

; Form を取得
getforms pForm, 0

; Form.Text を読み取り
netres net_ret
mcall pForm, "get_Text"
s = nettoval(net_ret, 2)
mes "Title: " + s

; Form.Text を変更
mcall pForm, "set_Text", "New Title"

; Controls.Count を取得
netres net_controls
mcall pForm, "get_Controls"
netres net_count
mcall net_controls, "get_Count"
cnt = nettoval(net_count, 4)
mes "Controls: " + cnt

; .NET Button を追加
newnet pButton, "", "System.Windows.Forms.Button", 0
mcall pButton, "set_Text", ".NET Button"
mcall pButton, "set_Left", 300
mcall pButton, "set_Top", 10
mcall pButton, "set_Width", 150
mcall pButton, "set_Height", 35
mcall net_controls, "Add", pButton

5.4 HSP と .NET コントロールの共存

HSP の button 等で作成したコントロールと、newnet + mcall で作成した .NET コントロールは 同一の Form 上で共存します。両方とも Form.Controls に登録されます。

winobj 命令: 任意の Win32 クラス名でコントロールを生成する winobj 命令は、従来通り CreateWindowEx を直接呼びます。 生成されたコントロールは Form の子ウィンドウとして動作しますが、Form.Controls には登録されません。
objprm 命令: SetWindowText 等の Win32 API 経由で動作するため、.NET コントロールでもそのまま使用可能です。

5.5 システム変数 hwnd / hinstance / hdc

以下のシステム変数で、現在アクティブなスクリーン (gsel で選択中) の情報を取得できます。

変数型 (32bit)型 (64bit)内容
hwndintint64ウィンドウハンドル (HWND)
hinstanceintint64インスタンスハンドル (HINSTANCE)
hdcintint64描画バッファの DC (HDC)
hdc について: hdc はオフスクリーン描画バッファ (DIB Section) のデバイスコンテキストです。 HSP の描画命令 (mes, boxf, line 等) と同じ DC なので、 Win32 GDI API (BitBlt, TextOut 等) で直接描画すればスクリーンに反映されます。

.NET での HDC 取得: getforms + CreateGraphics() + GetHdc() でも取得可能ですが、 この場合はウィンドウ DC (画面に直接描画) であり、HSP の描画バッファ DC とは異なります。 HSP の描画と統合するにはシステム変数 hdc を使用してください。

5.6 外部 .NET ライブラリとの連携

NuGet パッケージ等の外部 .NET ライブラリは loadnet (opt=2: ファイルパス) でロードして使用できます。 以下のライブラリで動作確認済みです。

ライブラリバージョン確認項目結果
DockPanelSuite3.1.0DLL ロード / インスタンス生成 / Enum / プロパティ / Form 追加全項目 PASS
Newtonsoft.Json13.0.3JObject.Parse / indexer / SerializeObject / JArray / ToString全項目 PASS
NAudio2.2.1WaveFormat / Enum / C# コンパイルからの参照 / IEnumerable 列挙PASS (WaveOut はメッセージループ必要)
; Newtonsoft.Json の使用例
loadnet "Newtonsoft.Json.dll", 2
newnet pJObj, "Newtonsoft.Json", "Newtonsoft.Json.Linq.JObject", 1
netres rParsed
mcall pJObj, "Parse", "{\"name\":\"IronHSP\",\"version\":3}"
netres rName
mcall rParsed, "get_Item", "name"
mes nettoval(rName, 2)   ; => "IronHSP"

; NAudio の使用例
loadnet "NAudio.Core.dll", 2
newnet pFmt, "", "NAudio.Wave.WaveFormat", 0, 44100, 2
netres rSR
mcall pFmt, "get_SampleRate"
mes nettoval(rSR, 4)     ; => 44100
netstandard 2.0 対応: netstandard 2.0 ターゲットの DLL を参照する場合、C#/VB コンパイル時に netstandard.dll が自動的に参照に追加されます(.NET Framework 4.7.2 以降に同梱)。
参照 DLL の自動解決: loadnet (opt=3/4) で C#/VB をコンパイルする際、参照 DLL のファイル名は ロード済みアセンブリの Location パスに自動解決されます。

6. コンパイラ拡張 (hspcmp)

IronHSP のコンパイラ (hspcmp) に追加された言語拡張機能です。構造体定義、DLL 関数の戻り値拡張、COM コールバック、Allman ブレーススタイルなどが含まれます。

6.1 Allman ブレーススタイル

従来の HSP では if / else のブロック開始 {同じ行に書く必要がありました:

; 従来の書き方 (K&R スタイル) — vanilla HSP / IronHSP 両方で動作
if n > 0 {
    mes "positive"
} else {
    mes "not positive"
}

IronHSP の hspcmp では、C / C# 等で一般的な Allman ブレーススタイル (改行 {) もサポートします:

; Allman スタイル — IronHSP 専用
if n > 0
{
    mes "positive"
}
else
{
    mes "not positive"
}

対応パターン

パターン
if 条件 + 次行 {if n > 0 … 改行 … {
else + 次行 {else … 改行 … {
else : if 条件 + 次行 {else : if n > 10 … 改行 … {
ネスト (内側も Allman)外側・内側ともに改行 { で OK
混合 (同一行 + 改行)if n < 0 {} + else 改行 { も OK
注意: if{ の間に空行やコメント行が入ると、従来通り単行 if として閉じられます。{if / else直後の行 に書いてください。

サンプル: package/win32/sample/basic/allman_brace.hsp

6.2 構造体・共用体

#defstruct / #defunion プリプロセッサディレクティブで C 言語互換の構造体・共用体を定義できます。 Windows API や DxLib のような C 構造体を直接扱う場合に便利です。 構造体変数は専用の HSPVAR_FLAG_NSTRUCT 変数型として確保され、 代入は同型同サイズのバイト列コピー (memcpy) として処理されます。

使用例

#defstruct POINT
#field int x
#field int y
#endstruct

stdim pt, POINT
pt->x = 100
pt->y = 200
mes "x=" + pt->x + " y=" + pt->y
mes "size=" + varsize(POINT)   ; → 8

定義ディレクティブ

ディレクティブ説明
#defstruct [global] NAME [, pack=N]構造体定義の開始。global を付けると #module 内からも参照可能 (共有 .as ファイルで定義する場合は global 推奨)。pack=N でアライメントを指定 (デフォルト 8、C ABI に従い末尾はメンバ最大アライメントで切り上げ)
#defunion [global] NAMEトップレベル共用体定義の開始 (全メンバが同一オフセット)。global の動作は #defstruct と同じ
#defunion (名前なし)#defstruct 内のサブ共用体ブロック開始
#field 型 メンバ名 [配列]メンバ定義 (#defstruct/#defunion 内で必須)
#endstruct / #endunion定義の終了
変更点 (2026/04/12): 旧式のインデント記法 (例:   int x) は廃止されました。 構造体メンバは必ず #field ディレクティブで宣言してください。 共用体サブブロックは #defunion#endunion で記述します。

サポートするメンバ型

整数型

型名サイズ備考
byte1 byte8bit 符号なし整数 (BYTE)
short2 bytes16bit 整数 (SHORT / WORD)
int4 bytes32bit 整数 (INT / DWORD / LONG)
int648 bytes64bit 整数 (LONGLONG)
intptr4/8 bytesプラットフォーム依存サイズ整数 (32bit=4, 64bit=8)。HANDLE, HWND, ポインタ等に使用。#func / #cfuncintptr 型と同名・同義

浮動小数点型

型名サイズ備考
float4 bytes単精度浮動小数点 (FLOAT)
double8 bytes倍精度浮動小数点 (DOUBLE)

論理型

型名サイズ備考
bool4 bytesWin32 BOOL (TRUE=1, FALSE=0)
bool11 byteC/C++ bool
bool22 bytesVARIANT_BOOL (COM用。TRUE=-1, FALSE=0)

配列・文字列型

型名サイズ備考
char[N]N bytes固定長 ANSI 文字列バッファ (strncpy で代入)
wchar[N]N*2 bytes固定長 Unicode 文字列バッファ (wcsncpy で代入)
型名[N]型サイズ*N固定長型付き配列 (例: int[10] = 40 bytes)

複合型

型名サイズ備考
STRUCT_NAME可変入れ子構造体 (定義済みの構造体名を指定)

変数の宣言 (stdim)

構造体型の変数を確保するには stdim 命令を使います。 内部では HSPVAR_FLAG_NSTRUCT 型の PVal が確保されます。

#defstruct VECTOR, pack=1
#field float x
#field float y
#field float z
#endstruct

stdim v, VECTOR              ; 1要素 (12 byte) を確保
stdim arr, VECTOR, 10        ; 構造体配列 (12 byte × 10 要素 = 120 byte)

v->x = 1.5
v->y = 2.5
v->z = 3.5

arr(2)->x = 100.0            ; 配列要素のメンバアクセス
互換性: 標準 HSP の dim v, N は引き続き整数配列を確保するだけで、構造体型としては扱われません。 dim v, VECTOR と書いても VECTOR はプリプロセッサ定数として展開されるため、結果は dim v, 12 (12 個の int 配列 = 48 byte) と同じになります。構造体として扱いたい場合は stdim を使ってください。

構造体名は定数として扱える

#defstruct で定義した構造体名は、#endstruct の時点で プリプロセッサ定数 (LAB_TYPE_PPVAL) として登録されます。値は構造体の合計バイトサイズです。 このため、構造体名をそのまま整数リテラルのように式の中で使えます。

#defstruct VECTOR, pack=1
#field float x
#field float y
#field float z
#endstruct

mes VECTOR                  ; → 12
mes "size = " + VECTOR      ; → "size = 12"
sdim buf, VECTOR * 100      ; VECTOR バイト × 100 個分のバッファ
memcpy dst, src, VECTOR     ; 1 構造体分コピー

varsize() — 構造体サイズ取得

varsize(STRUCT_NAME) も同じく構造体サイズを返します (プリプロセッサ段階で整数リテラルに置換されます)。 VECTOR 単体の記法と完全に等価ですが、他言語経験者には sizeof() 風の記法が 分かりやすい場合に使えます。

mes "VECTOR size = " + varsize(VECTOR)   ; → 12
sdim buf, varsize(VECTOR) * 100          ; バッファ確保にも使える

varsize(変数名) 形式は従来通り変数の確保バイトサイズを返します (#func 関数名を渡すと varptr と同じ要領で関数のサイズが返ります)。

共用体

共用体は全メンバが同一メモリ領域を共有します。最大メンバのサイズが全体サイズになります。

#defunion VARIANT_DATA
#field int iVal
#field float fVal
#field double dVal
#endunion
; size = 8 (double の 8 bytes が最大)

構造体内にインラインの共用体サブブロックを定義する場合も #defunion / #endunion を使います (構造体名は省略します):

#defstruct MY_VARIANT
#field short vt
#defunion
#field int intVal
#field float fltVal
#field double dblVal
#endunion
#endstruct
; size = 16 (vt[2] + padding[6] + union[8])

#defunion は文脈で動作が変わります:

配列メンバ

#defstruct MATRIX
#field float m[16]
#endstruct

stdim mat, MATRIX
mat->m(0) = 1.0
mat->m(5) = 1.0

パックアライメント

#defstruct PACKED_STRUCT, pack=1
#field byte flag
#field int value
#endstruct
; size = 5 (パディングなし。pack=1 で詰め詰め配置)

#defstruct DEFAULT_STRUCT
#field byte flag
#field int value
#endstruct
; size = 8 (デフォルト pack=8。flag の後に 3 bytes パディング)

入れ子構造体

#defstruct POINT
#field int x
#field int y
#endstruct

#defstruct RECT
#field POINT topLeft
#field POINT bottomRight
#endstruct

stdim rc, RECT
rc->topLeft->x = 10
rc->topLeft->y = 20
rc->bottomRight->x = 100
rc->bottomRight->y = 200

構造体配列

stdim points, POINT, 10   ; POINT 構造体 10 個分の配列
points(0)->x = 100
points(0)->y = 200
points(1)->x = 300
points(1)->y = 400

DLL 関数への値渡し

#func / #cfunc / #cfuncst のパラメータ型に構造体名を書くと、 構造体を 値渡し (pass by value) で C/C++ 側 DLL に渡せます。 DxLib の VECTOR や Win32 API の POINT, RECT などを直接呼び出せます。

#defstruct VECTOR, pack=1
#field float x
#field float y
#field float z
#endstruct

#uselib "DxLibW.dll"
#func global SetCamPosTarget "dx_SetCameraPositionAndTarget_UpVecY" VECTOR, VECTOR
;                                                                   ↑ 値渡しパラメータ

stdim cpos, VECTOR
cpos->x = 10.0
cpos->y = 50.0
cpos->z = -100.0
stdim ctgt, VECTOR
ctgt->x = 5.0
ctgt->y = 25.0
ctgt->z = 0.0

SetCamPosTarget cpos, ctgt   ; ← 構造体 2 つを値渡し
x86/x64 の ABI 差異: 値渡しは MSVC ABI に従って自動的に展開されます。

値渡しと参照渡しの使い分け

同じ C 構造体でも、関数によって「値渡し」と「ポインタ渡し」のどちらで宣言されているかが異なります。 #func 宣言では パラメータ型キーワードで明示的に指定 します:

C 側のシグネチャHSP の #func 宣言呼び出し例
void f(VECTOR v)
(構造体の値渡し)
#func global f "f" VECTORf myvec — 12 バイトを直接展開
void f(VECTOR *v)
(ポインタ渡し / out 引数)
#func global f "f" varf myvec — 変数のアドレスを渡す
void f(int n)#func global f "f" intf 42

判断基準:

DxLib のように構造体値渡しが多用される API では VECTOR, MATRIX などを直接書きます。 逆に Win32 API の GetWindowRect(HWND, LPRECT) のように out 引数として構造体ポインタを取る関数は int, var のままです。

注意: C 側が値渡しなのに HSP 側で var と宣言してしまうと、 ポインタの 4/8 バイトしかスタックに積まれず、構造体の残りバイトが読まれずに ABI が破綻して動作不定になります。 DxLib の auto-generated hspdxlib.as はこの罠を避けるため、ヘッダの自動生成時に 構造体値渡しの関数を全て VECTOR, VECTOR 等として展開してあります。

内部実装

  1. コンパイラの PP_ReplaceStructParamNames()#func 行のパラメータリスト中の構造体名を svalN (N = サイズ) に置換。マクロ展開で VECTOR → 12 に化けるのを防ぎます。
  2. GetParameterTypeCG()svalNMPTYPE_STRUCTVAL (-23) として認識し、 STRUCTPRM->subid に N を格納。
  3. ランタイムの code_expand_next()MPTYPE_STRUCTVAL ハンドラ (hsp3extlib.cpp) が 上記の x86/x64 ABI に従ってバイト列を展開。

内部処理 (構造体パイプライン)

HSP コンパイラ (hspcmp) とランタイム (hsp3) の連携で構造体を処理しています。 プリプロセッサ段階・コード生成段階・実行段階のそれぞれで以下の処理が走ります:

プリプロセッサ段階 (token.cpp)

  1. #defstruct / #defunion — 構造体定義テーブル cg_structdefs にエントリを追加。 ブロックレベルカウンタ pp_defstruct_level を増加。
  2. #field 型 名前PP_StructMember() でメンバを解析し、 pack を考慮したオフセットを計算して cg_structdefs.back().members に追加。
  3. #defunion (名前なし) / #endunionpp_union_base_offset を保存し、 ブロック内のメンバが同一オフセットを共有するように制御。
  4. #endstruct — アライメント切り上げで total_size を確定し、 構造体名を LAB_TYPE_PPVAL として登録 (値 = 構造体サイズ)。 これにより VECTOR という識別子はマクロ展開で 12 に展開されます。
  5. PP_DetectStructDim()stdim v, STRUCT 行を検出して pp_var_structid マップに変数 → 構造体ID を記録。
  6. PP_DetectCfuncstAssign()v = SomeCfuncstFunc() 行を検出して、 v を構造体型の変数として pp_var_structid に登録 (メタデータのみ、テキストは書き換えない)。
  7. PP_RewriteVarsizeStruct()varsize(STRUCTNAME) を整数リテラルに置換 (文字列リテラル内・コメント以降はスキップ)。
  8. PP_ExpandStructAccess()v->x パターンを _struct_peek(v, offset, type, struct_size) または _struct_poke v, offset, type, struct_size, member_size, value 形式に展開 (オフセットはコンパイル時に解決)。
  9. PP_ReplaceStructParamNames()#func / #cfunc / #cfuncst 行のパラメータリスト中の 構造体名を svalN (N = 構造体サイズ) に置換。マクロ展開で構造体名が数値に化けるのを防ぎます。

コード生成段階 (codegen.cpp)

実行段階 (hsp3code.cpp / hspvar_nstruct.cpp)

6.3 DLL 関数拡張 (#cfuncd / #cfuncf / #cfuncst)

標準 HSP の #func / #cfunc に加え、IronHSP では戻り値の型に応じた拡張ディレクティブを提供します。

10.1 一覧

ディレクティブ戻り値型DLL の戻り値追加バージョン
#funcなし (stat に int 格納)EAX / RAX → stat標準 HSP
#cfuncint / int64EAX / RAX標準 HSP
#cfuncddouble (実数)x87 FPU / XMM0IronHSP
#cfuncffloat → double に変換x87 FPU / XMM0IronHSP
#cfuncstNSTRUCT (構造体)隠しポインタ経由IronHSP

10.2 #cfuncd — double 戻り値

C/C++ の DLL 関数が double を返す場合に使用します。

; 構文
#cfuncd global 関数名 "エントリポイント" パラメータ型...

; 例
#uselib "mymath.dll"
#cfuncd global CalcSin "CalcSin" double
#cfuncd global CalcCos "CalcCos" double

; 使用
result = CalcSin(3.14159)  ; result は double 型

戻り値は x87 FPU スタック (x86) または XMM0 レジスタ (x64) から取得し、HSP の double (実数) 型として返されます。

注意: #cfunc で double を返す関数を呼ぶと、FPU/XMM の値ではなく EAX/RAX の整数値が返るため、正しい値を取得できません。double を返す DLL 関数には必ず #cfuncd を使用してください。

10.3 #cfuncf — float 戻り値

C/C++ の DLL 関数が float を返す場合に使用します。float は HSP 内部で double に変換されます。

; 構文
#cfuncf global 関数名 "エントリポイント" パラメータ型...

; 例
#uselib "mymath.dll"
#cfuncf global GetDistance "GetDistance" float, float, float, float

; 使用
d = GetDistance(0.0, 0.0, 3.0, 4.0)  ; d = 5.0 (double型)
注意: float パラメータは float キーワードで宣言します。double とは異なる 4 バイト幅で渡されます。

10.4 #cfuncst — 構造体を値で返す DLL 関数

C/C++ の DLL 関数が構造体を値で返す場合に安全に呼び出すための新しいディレクティブです。

背景・問題

標準の #cfunc は戻り値として EAX/RAX(整数 1 つ)しか取得できません。 C/C++ の関数が構造体を値で返す場合、MSVC ABI は隠し第 1 引数(呼び出し元が確保したバッファへのポインタ)を自動挿入し、関数はそこに書き込みます。

// C側: VECTOR を値で返す関数
VECTOR dx_VGet(float x, float y, float z);

// MSVC ABI 実際の呼び出し:
//   x86: push z, push y, push x, push &hidden_buf, call dx_VGet
//   x64: rcx=&hidden_buf, xmm1=x, xmm2=y, xmm3=z, call dx_VGet

#cfunc はこの隠しポインタを挿入しないため、スタック破壊やクラッシュの原因になります。

構文

新構文 (推奨、構造体名指定):

#cfuncst global 構造体名 関数名 "エントリポイント" [パラメータ型...]

旧構文 (サイズ指定、引き続きサポート):

#cfuncst global 関数名 "エントリポイント" 構造体サイズ, パラメータ型...
要素説明
#cfuncst構造体戻り値専用の関数宣言ディレクティブ
構造体名#defstruct で定義済みの構造体名。サイズは定義から自動計算される
構造体サイズ(旧構文) 戻り値の構造体サイズ (バイト数、整数リテラル)。最大 4096
パラメータ型通常の #cfunc と同じ型キーワード (int, float, double, wstr, var 等)

新構文の特徴

使用例 (新構文)

#defstruct VECTOR, pack=1
#field float x
#field float y
#field float z
#endstruct

#uselib "DxLibW.dll"
#cfuncst global VECTOR GetCameraTarget "dx_GetCameraTarget"
#cfuncst global VECTOR GetCameraPosition "dx_GetCameraPosition"

; パターン1: stdim で明示的に確保してから代入
stdim tgt, VECTOR
tgt = GetCameraTarget()
mes "tgt: " + tgt->x + ", " + tgt->y + ", " + tgt->z

; パターン2: dim 省略 (NSTRUCT サイズヒントによる自動確保)
pos = GetCameraPosition()
mes "pos: " + pos->x + ", " + pos->y + ", " + pos->z

使用例 (旧構文)

; DxLib の VECTOR 構造体 (12バイト: float x, y, z)
#uselib "DxLibW.dll"
#cfuncst global VGet "dx_VGet" 12, float, float, float
#cfuncst global VAdd "dx_VAdd" 12, var, var

; 使用
p = VGet(1.0, 2.0, 3.0)
; 旧構文では戻り値は HSPVAR_FLAG_NSTRUCT になるが、
; メンバ名 → 構造体ID 紐付けはないので -> アクセスはできない
; (構造体名指定の新構文を推奨)

内部実装

コンパイラ (hspcmp)

ランタイム (hsp3)

  1. code_expand_and_call()STRUCTDAT_OT_RETSTRUCT フラグを検出
  2. スタック方式のバッファプール (sret_buffers[16][4096]) からスロットを確保し、ゼロ初期化
  3. code_expand_next()MPTYPE_SRET を処理 — バッファポインタを隠し第 1 引数としてパラメータ配列に挿入 (ユーザー入力は読まない)
  4. call_extfunc() で DLL 関数を呼び出し — x86/x64 とも既存アセンブリがそのまま動作
  5. 戻り値としてバッファのアドレスを hspctx->stat に格納
  6. reffunc_dllcmd() が RETSTRUCT を再検出し、hsp_nstruct_pending_size に構造体サイズを書き込む。 *type_res = HSPVAR_FLAG_NSTRUCT として sret_buffer のポインタを返す
  7. 標準の代入経路 (code_getStackPushHspVarCoreClearWCSet) が HspVarNstruct_GetSize / HspVarNstruct_Alloc 経由でヒントを参照し、 代入先変数を NSTRUCT として正しいサイズで確保 → memcpy
  8. '=' ハンドラの末尾でヒント (hsp_nstruct_pending_size) をクリア

NSTRUCT サイズヒント機構

HSPVAR の GetSize(PDAT*) は要素サイズしか返せない API ですが、構造体は型ごとにサイズが異なるため、 グローバル変数 int hsp_nstruct_pending_size をヒントとして使います。 これは strmid()strsize 経由で文字列長を伝達するのと同様の仕組みです。

段階動作
1. reffunc_dllcmdhsp_nstruct_pending_size = struct_size をセット
2. HspVarNstruct_GetSizeヒント値を返す (StackPush のサイズになる)
3. HspVarNstruct_Allocpval->len[0] が 1 (デフォルト) ならヒント値を採用
4. '=' ハンドラ末尾ヒントをクリア (他の NSTRUCT 操作への影響を防ぐ)

入れ子呼び出しの安全性

#cfuncst 関数は式の中で入れ子にできます:

result = VAdd(VGet(1,0,0), VGet(0,1,0))
; VGet(1,0,0) → slot 0
; VGet(0,1,0) → slot 1
; VAdd        → slot 2 (自身の戻り値用) + slot 0,1 を引数として参照
; すべてのスロットが DLL 呼び出し時点で有効

内部ではスタック方式のバッファプール(16 スロット × 4096 バイト = 64KB)を使用:

要素説明
sret_buffers[16][4096]静的バッファプール
sret_depth現在の入れ子深度。0 = 最外レベル
sret_ring_index次に割り当てるスロット番号
注意: #cfuncst の戻り値ポインタは一時バッファへの参照です。次の最外レベル #cfuncst 呼び出しで再利用されます。結果を保持するには dupptrmemcpy で即座にコピーしてください。

パラメータ型一覧

#cfuncst#cfunc と同じパラメータ型キーワードが使えます:

型キーワード用途DLL 側の型
int整数int, DWORD, BOOL 等
float単精度浮動小数点float
double倍精度浮動小数点double
strANSI 文字列const char*
wstrUnicode 文字列const wchar_t*
var変数アドレス(構造体ポインタ等)void*, VECTOR* 等
int6464bit 整数int64_t, LONGLONG
intptrプラットフォーム依存サイズ整数INT_PTR, HANDLE, SIZE_T 等 (x86=32bit / x64=64bit)

10.5 全ディレクティブ比較

ディレクティブ戻り値型DLL の戻り値
#funcなし (stat に格納)int → stat
#cfuncint / int64EAX / RAX
#cfuncddoubleFPU / XMM0
#cfuncffloatFPU / XMM0
#cfuncst IronHSPNSTRUCT (構造体)隠しポインタ経由で構造体バッファに書き込み → NSTRUCT として代入先に memcpy

10.6 可変長引数 (...) IronHSP

C の printf 系のような 可変長引数 (variadic) DLL 関数を HSP から直接呼べます。 パラメータリスト末尾に ... を記述すると、呼び出しごとに異なる数・型の引数を渡せます。

#uselib "msvcrt.dll"
#cfunc crt_sprintf "sprintf" var, str, ...

sdim s, 256
n = crt_sprintf(s, "%d + %.2f", 42, 3.14)
mes s   ; → "42 + 3.14"

; 引数の数・型は呼び出しごとに変えられる
n = crt_sprintf(s, "%s=%d", "count", 100)
mes s   ; → "count=100"

対応ディレクティブ

#func / #cfunc / #cfuncd / #cfuncf / #cfuncst のすべてで ... が使用可能です。

構文

; 命令版 (stat に戻り値)
#func global myfunc "entry_name" 固定パラメータ, ...

; 関数版 (戻り値 = int)
#cfunc global myfunc "entry_name" 固定パラメータ, ...

; double 戻り値
#cfuncd global myfunc "entry_name" 固定パラメータ, ...

型推論ルール

可変長部分の各引数は、HSP の式評価結果から自動的に型が決まります:

HSP の式推論される型DLL に渡す形
123、int 変数int4/8 byte (x86/x64)
123L、int64 変数int64 (intptr)8 byte — ポインタやハンドルの受け渡しにも使用可
3.14、double 変数double8 byte (ビットパターンを整数レジスタ経由で渡す)
"abc"、str 変数strchar* ポインタ (UTF-8 → ローカルバッファにコピー)
L"abc"、wstr 変数wstrwchar_t* ポインタ (UTF-16 → ローカルバッファにコピー)
float について: C の variadic 関数では、float 引数は ABI 規約により自動的に double に昇格されます (default argument promotion)。そのため HSP 側で特別な対応は不要で、double として渡せば正しく動作します。DLL 側のフォーマット文字列では %f を使用してください。

制限事項

6.4 COM コールバック (#defcbcom)

IDropTargetIBindStatusCallback のように HSP 側で実装して外部 COM API に渡す COM コールバックインターフェースを宣言・実装するための言語拡張。 hsp3net 専用。

IUnknownQueryInterface / AddRef / Release は runtime が自動実装するので、 ユーザーは vtable index 3 以降の実メソッドだけを HSP ラベルにマッピングすればよい。 動的 vtable トランポリンは x86 / x64 両対応。

12.1 構文

#defcbcom <CLASS_NAME> <IFACE_NAME>
    #cbmethod <vtable_idx> <ret_type> <arg_types...>, *<label>
    ...
#endcbcom
directive説明
#defcbcom NAME IFACEクラス宣言開始。IFACE は事前に #usecom で IID 登録済みである必要がある
#cbmethod VTABLE_IDX RET_TYPE ARGS..., *LABELメソッドを vtable index にマッピング。VTABLE_IDX は 3 以上 (0..2 は IUnknown 自動実装)
#endcbcomクラス宣言終了。この時点で hspcmp が登録 bytecode を発行

12.2 引数型

用途備考
int32bit DWORD / BOOL / enum
int64明示的 64bitLARGE_INTEGER 等
intptrplatform-sized pointerHANDLE / 構造体ポインタ等
comobjIUnknown 派生インターフェースauto wrap (callback 終了で auto release)
wstrLPCWSTRSJIS 自動変換
strLPCSTR
double / float浮動小数点XMM 経由

12.3 callback 実行コンテキスト関数

関数戻り値説明
comprm(N)宣言型に応じる現在 callback の N 番目 (0-origin) の user 引数を取得。#cbmethod で宣言した型に従ってマーシャリング
comcbidx()int呼ばれたメソッドの vtable index
comcbtag()intnewcomcb 時に指定した int tag
comcbtags()strnewcomcb 時に指定した str tag
comcbis(comobj_var)int引数の comobj 変数が現 callback の this と一致なら 1
comcbthis()intptrraw IUnknown* (advanced 用途)
comret val(命令)HRESULT 戻り値を明示セット (省略時 0 = S_OK)
newcomcb var, "CLASS" [, tag](命令)callback クラスのインスタンス生成
注意: comcbtag() 等の関数は 必ず () 付きで呼ぶこと。 括弧なしで呼ぶと cmdfunc_dllctrl の statement 経路に流れて syntax error になる。

12.4 使用例 (IBindStatusCallback)

#define IID_IBindStatusCallback "{79eac9c1-baf9-11ce-8c82-00aa004ba90b}"
#usecom IBindStatusCallback IID_IBindStatusCallback "{}"

#defcbcom MyBSC IBindStatusCallback
    #cbmethod 3  int int, comobj,                  *bsc_start
    #cbmethod 4  int intptr,                       *bsc_priority
    #cbmethod 5  int int,                          *bsc_lowres
    #cbmethod 6  int int, int, int, wstr,          *bsc_progress
    #cbmethod 7  int int, wstr,                    *bsc_stop
    #cbmethod 8  int intptr, intptr,               *bsc_bindinfo
    #cbmethod 9  int int, int, intptr, intptr,     *bsc_data
    #cbmethod 10 int intptr, comobj,               *bsc_object
#endcbcom

#uselib "urlmon.dll"
#cfunc URLDownloadToFile "URLDownloadToFileW" intptr, wstr, wstr, intptr, comobj

    newcomcb cb, "MyBSC", "session_1"
    hr = URLDownloadToFile(0, "https://www.example.com/", "ex.html", 0, cb)
    delcom cb
    end

*bsc_progress
    mes "[" + comcbtags() + "] " + comprm(0) + "/" + comprm(1)
    comret 0 : return

*bsc_start    : comret 0 : return
*bsc_priority : comret 0 : return
*bsc_lowres   : comret 0 : return
*bsc_stop     : comret 0 : return
*bsc_bindinfo : comret 0 : return
*bsc_data     : comret 0 : return
*bsc_object   : comret 0 : return
内部実装: 1 クラス = 1 vtable (全インスタンス共有)。 各メソッドごとに動的に C トランポリンを VirtualAlloc(PAGE_EXECUTE_READWRITE) で生成し、 COM 呼び出し時に rcx/rdx/r8/r9 + stack 引数を HspCbComMethodThunk::args[] にコピーして hsp_cbcom_bridge 経由で HSP ラベルに dispatch。
制限: STA (apartment threaded) 限定。pathological reentrancy は対象外。 newcomcb の class name 引数は現状 string literal のみ対応。

7. ランタイム拡張

IronHSP のランタイムに追加されたコア機能です。ネイティブコールバックによる関数ポインタ生成と、環境変数・コマンドライン引数の組み込みサポートを提供します。

7.1 ネイティブコールバック (setcallback / callbackarg)

Win32 API には EnumWindows, EnumFontFamiliesEx, SetTimer, qsort など、C 関数ポインタをコールバックとして受け取る API が多数存在します。バニラ HSP ではこれらを直接呼ぶ手段がありませんでしたが、IronHSP の setcallback 命令を使うと HSP のラベルを C 関数ポインタに変換 でき、任意のコールバック API を利用できます。

.NET は不要で、hsp3net の全ランタイム (GUI / CL / 32bit / 64bit) で動作します。

API リファレンス

命令/関数書式説明
setcallbacksetcallback var, *label, argcount *label を呼び出す C 関数ポインタを動的に生成し、var に格納する。
argcount: コールバックが受け取る引数の数 (0〜16、デフォルト 2)。
32bit ビルドでは varint 型、64bit ビルドでは int64 型になる。
#func のパラメータ型には int (32bit) または intptr (64bit 対応) を使用する。
callbackarg(n)callbackarg(n) コールバック実行中 (ラベル処理内) で、C 側から渡された第 n 引数を返す (0-origin)。
32bit: int (4 byte)、64bit: int64 (8 byte) で取得。
ポインタ引数を dupptr で変数に紐付ける場合はサイズに注意。

戻り値の仕組み

コールバックラベル内で return N を実行すると、stat に N が設定されます。thunk はラベル実行後に hsp_thunk_getstat() を呼んで stat の値を C の戻り値として返します。たとえば EnumWindows では return 1 で列挙続行、return 0 で停止です。

例 1: EnumWindows でウィンドウ列挙

; EnumWindows: BOOL CALLBACK EnumWindowsProc(HWND, LPARAM)
#uselib "user32.dll"
#func EnumWindows "EnumWindows" int, int

setcallback pFunc, *on_enum, 2   ; 引数2個のコールバック
enum_count = 0
EnumWindows pFunc, 0
mes "ウィンドウ数: " + enum_count
stop

*on_enum
    hwnd_val = callbackarg(0)    ; 第1引数 (HWND)
    lparam_val = callbackarg(1)  ; 第2引数 (LPARAM)
    enum_count++
    return 1                     ; 1 → 列挙続行、0 → 停止

例 2: EnumFontFamiliesEx でフォント列挙

; EnumFontFamiliesExW: int CALLBACK EnumFontFamExProc(LOGFONTW*, TEXTMETRICW*, DWORD, LPARAM)
#uselib "gdi32.dll"
#func EnumFontFamiliesExW "EnumFontFamiliesExW" int, var, int, int, int

; LOGFONTW 構造体は 92 バイト、lfFaceName は offset 28 (wchar_t[32])
setcallback pFunc, *on_font, 4

sdim lf, 92
EnumFontFamiliesExW hdc, lf, pFunc, 0, 0
stop

*on_font
    ; 第1引数 = LOGFONTW* ポインタ
    ptr_lf = callbackarg(0)
    dupptr buf_lf, ptr_lf, 92
    ; lfFaceName (offset 28, wchar_t[32] = 64 bytes)
    sdim wname, 64
    memcpy wname, buf_lf, 64, 0, 28
    ; UTF-16 → UTF-8 変換
    sdim uname, 128
    WideCharToMultiByte 65001, 0, wname, -1, uname, 128, 0, 0
    mes uname
    return 1

例 3: タイマーコールバック

; SetTimer: VOID CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD)
#uselib "user32.dll"
#func SetTimer "SetTimer" int, int, int, int
#func KillTimer "KillTimer" int, int

setcallback pTimer, *on_timer, 4
SetTimer hwnd, 1, 1000, pTimer   ; 1秒間隔

*on_timer
    mes "Timer fired!"
    return

内部実装: 動的 thunk 生成

setcallbackVirtualAlloc(NULL, size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE) で実行可能メモリを確保し、プラットフォーム固有のマシン語を動的に書き込みます。

項目x86 (32bit)x64 (64bit)
呼び出し規約__stdcall (Win32 標準)fastcall (Win64 標準)
引数受け渡しスタックから mov eax, [ebp+8+i*4] で各引数を thunk->args[i] に退避RCX/RDX/R8/R9 → args[0..3]、5番目以降はスタック [rsp+0x28+i*8]args[4+]
ブリッジ呼び出しpush thunk; call hsp_thunk_bridgemov rcx, thunk; mov rax, hsp_thunk_bridge; call rax
戻り値取得call hsp_thunk_getstat → EAXcall hsp_thunk_getstat → RAX
後始末ret N*4 (stdcall: callee cleanup)ret (fastcall: caller cleanup)
thunk サイズ約 50〜100 バイト (引数数に依存)約 100〜300 バイト
最大引数数16 (HSP_CALLBACK_ARG_MAX)
thunk 管理動的配列 (初期 16、倍々で拡張、上限なし)

処理フローは以下の通りです:

C API がコールバック呼び出し
  ↓
thunk マシン語が引数を args[] に退避
  ↓
hsp_thunk_bridge(thunk) を呼び出し
  ↓
  hsp_callback_current = thunk  (現在のコンテキストを設定)
  code_callback(thunk->label)   (HSP ラベルにジャンプ)
  ↓
  HSP ラベル内で:
    callbackarg(n) → thunk->args[n] を返す
    return N       → hspctx->stat = N
  ↓
hsp_thunk_getstat() → stat の値を EAX/RAX に返す
  ↓
C API に戻り値が返る
引数の型: callbackarg(n) は常にプラットフォームのポインタ幅の整数 (x86: 4byte int, x64: 8byte int64) を返します。構造体ポインタ等の場合は dupptr で変数に紐付けてからフィールドを読み取ってください。
戻り値の型: 常に整数 (stat) です。浮動小数点の戻り値が必要なコールバックには対応していません。
スレッド安全性: コールバックは HSP のメインスレッドで同期的に実行されます。 別スレッドから呼ばれるコールバック (一部のマルチメディア API の notify callback 等) には対応していません。該当するケースでは PostMessage 等でメインスレッドにマーシャリングしてください。
メモリ: thunk メモリは VirtualAlloc で確保され、プロセス終了時に自動解放されます。明示的な解放 API はありません。

7.2 環境変数・コマンドライン引数

バニラ HSP には環境変数操作やコマンドライン引数の構造化パースが存在しません。IronHSP では以下の命令・関数を組み込みで提供しています。全て UTF-8 で処理され、日本語を含むパスや値も正しく扱えます。

環境変数操作

命令/関数書式説明
setenvsetenv "KEY", "VALUE"環境変数を設定。内部で MultiByteToWideChar(CP_UTF8)SetEnvironmentVariableW を呼ぶ。
delenvdelenv "KEY"環境変数を削除 (SetEnvironmentVariableW(key, NULL))。
getenv()v = getenv("KEY" [, "default"])環境変数の値を取得。未定義の場合はデフォルト値 (省略時 "") を返す。内部で GetEnvironmentVariableWWideCharToMultiByte(CP_UTF8)
hasenv()hasenv("KEY")環境変数が定義されていれば 1、なければ 0。
; PATH 環境変数を取得
path_val = getenv("PATH")
mes path_val

; 自作の環境変数を設定
setenv "MY_APP_MODE", "production"
mes getenv("MY_APP_MODE")           ; → "production"

; 未定義の場合のデフォルト値
port = getenv("PORT", "3000")       ; PORT 未定義なら "3000"

; 存在確認
if hasenv("USERPROFILE") {
    mes "home = " + getenv("USERPROFILE")
}

; 削除
delenv "MY_APP_MODE"

コマンドライン引数

内部で CommandLineToArgvW(GetCommandLineW()) を初回呼び出し時に 1 回だけ実行し、結果を UTF-8 変換してキャッシュします。以降の呼び出しではキャッシュから即座に返します。

命令/関数書式説明
getcmdargc()n = getcmdargc()引数の総数を返す。0 番は実行ファイルパス。
getcmdarg()s = getcmdarg(n)n 番目の引数を返す (0-origin)。範囲外は空文字。
getcmdargs()v = getcmdargs("--name", "default")名前付き引数の値を取得。--name value / --name=value 両形式対応。見つからなければデフォルト値を返す。
getcmdargi()n = getcmdargi("--port", 8080)getcmdargs の整数版。値を int に変換して返す。
hascmdarg()hascmdarg("--verbose")指定の引数が存在すれば 1。フラグ引数の検出に使用。
; 全引数を表示
n = getcmdargc()
mes "引数 " + n + " 個:"
repeat n
    mes "  [" + cnt + "] " + getcmdarg(cnt)
loop

; 名前付き引数 (Python の argparse 風)
; 実行例: program.exe --port 8080 --name "テスト" --verbose
port = getcmdargi("--port", 3000)       ; → 8080
name = getcmdargs("--name", "default")  ; → "テスト"
verbose = hascmdarg("--verbose")        ; → 1

mes "port=" + port + " name=" + name + " verbose=" + verbose
実装場所: hsp3net/hsp3int.cpp の TYPE_EXTCMD 0x032〜0x035 (setenv/delenv) と TYPE_INTFUNC 0x200〜0x204 (getenv/hasenv/getcmdargc/getcmdarg/getcmdargs)。
エンコード: 内部は全て UTF-16 API を使用し、HSP 側との受け渡しで UTF-8 ↔ UTF-16 変換を行います。Shift-JIS ではなく UTF-8 です。
バニラ互換性: これらの命令・関数は hsp3net 専用です。バニラ HSP3 では使えません。

8. Win32 API 大幅拡充 (CsWin32 bridge)

OpenHSP 標準同梱の package/win32/common/user32.as / kernel32.as / gdi32.as 等は古く (sptr ベース、構造体未対応、x64 で破綻ぎりぎり、ANSI/Unicode 判別曖昧)、 kernel32.dll の 1449 exports に対して 67 関数 (4%) しかカバーできていなかった。これを Microsoft の win32metadata + Microsoft.Windows.CsWin32 source generator を経由した自動生成パイプラインで 体系的に再構築した。

15.1 概要

項目旧 (手書き)新 (CsWin32 bridge)
カバー DLL 数10〜15 (部分)51 DLL
関数数数百6020 関数
COM インターフェース0118 interface / 1238 method
構造体 (NSTRUCT)未対応734+ 構造体を自動 #defstruct
定数 enum手書きで一部608+ enum 群 (SW_*/SM_*/WS_*/MB_*/...) を自動 #define 完全展開
A/W 自動選択手書きで明示自動 (CreateFileW, MessageBoxW, RegOpenKeyExW 等)
型マッピングすべて sptrHWNDintptr / PCWSTRwstr / LPRECTvar / enum→int
日本語 MSDN ヘルプなし28000 entries 翻訳済 (Phase E/F の +1682 関数分は次回翻訳予定。常体 MSDN-JP 準拠)

15.2 ディレクトリ構成

tools/cswin32_bridge/                ← Plain DllImport 用 (allowMarshaling=false)
├── Win32Gen.csproj                 ← .NET 8 + Microsoft.Windows.CsWin32 source generator
├── NativeMethods.txt               ← 生成したい API 一覧 (~5300 行、コメントアウト含む)
├── NativeMethods.json              ← CsWin32 オプション
├── NativeMethods_full.txt          ← dump_exports.py の出力 (ROM)
├── dump_exports.py                 ← dumpbin /exports → 候補抽出
├── filter_unsupported.py           ← PInvoke001/003/005 警告から非対応 API をコメントアウト
├── gen_from_cswin32.py             ← C# パース → .as / .hs 出力
├── split_for_translation.py        ← docs_en.json → per-DLL チャンク
├── merge_translations.py           ← per-DLL .ja.json → docs_ja.json マージ
├── docs_en.json                    ← 英語 doc 中間キャッシュ (25341 entries)
├── docs_ja.json                    ← 日本語訳キャッシュ (25422 entries)
└── translate_chunks/               ← 翻訳 subagent 用ワークスペース

tools/cswin32_bridge_com/            ← COM インターフェース用 (allowMarshaling=true)
├── Win32Com.csproj
├── NativeMethods.txt               ← IShellLinkW / IFileDialog / IDropTarget / ID2D1Factory /
│                                       IDWriteFactory / IWICImagingFactory / IDXGIFactory 等
├── gen_com_from_cswin32.py         ← [ComImport] interface → #usecom + #comfunc
├── docs_en.json (2951 entries)
└── docs_ja.json (2951 entries)

package/win32/common/
├── win32_types_gen2.as             ← 共有: 734 NSTRUCT + 608 enum 定数 (各 DLL .as が #include)
├── kernel32_gen2.as (881 funcs)
├── user32_gen2.as   (606 funcs)
├── advapi32_gen2.as (419 funcs)
├── oleaut32_gen2.as (404 funcs)
├── gdi32_gen2.as    (384 funcs)
├── ... (合計 30 DLL)
└── com_misc_gen2.as                ← 118 COM interface (#usecom + #comfunc)

package/hsphelp/
├── win32_kernel32_gen2.hs          ← 日本語 MSDN ヘルプ (HSP3 .hs 形式)
├── win32_user32_gen2.hs
├── ... (合計 30 DLL + com_misc)

15.3 パイプライン

  1. dump_exports.py: C:\Windows\System32\*.dll を dumpbin /exports で走査 → 5631 候補抽出 → NativeMethods_full.txt
  2. NativeMethods.txt として配置 → dotnet build -c Release で CsWin32 が obj/generated/.../*.g.cs に C# P/Invoke 署名 + XML doc コメントを emit
  3. filter_unsupported.py: PInvoke001 / 003 / 005 警告から非対応 API を // removed: <reason> でコメントアウト (削除せず audit 用に残す)
  4. iterate (2)→(3) until clean (実測 3 round)
  5. gen_from_cswin32.py: C# を regex parse → 型マッピング → <dll>_gen2.as + win32_<dll>_gen2.hs を SJIS / CRLF で emit、docs_en.json も dump
  6. 翻訳パス: split_for_translation.py で per-DLL チャンク化 → 並列 subagent で翻訳 → merge_translations.pydocs_ja.json に集約
  7. (5) を再実行すると docs_ja.json をルックアップして日本語版 .hs を出力

15.4 採用根拠 (vs libclang 直接 parse)

初期は libclang Python binding で Windows SDK ヘッダを直接 parse する案 (tools/gen_winapi_as.py) を検討したが、以下の理由で CsWin32 経由に切り替えた:

15.5 カバー DLL 一覧 (関数数)

カテゴリDLL関数数
ベース (大規模)kernel32881
user32606
advapi32419
oleaut32404
ベース (中規模)gdi32384
crypt32218
shell32195
wininet192
マルチメディア / OLE / デバッグwinmm146
ole32143
dbghelp128
comctl3294
UI / IME / DWMuxtheme77
imm3263
dwmapi31
セキュリティbcrypt53
userenv34
wintrust7
ネットワークwinhttp46
netapi3245
ws2_32(未対応)
システムpsapi / version / shlwapi / msimg32 / comdlg32 他~50
bonus (依存解決)ncrypt / normaliz / propsys27
合計51 DLL6020 関数

Phase E (commit 31765549, 2026-04-14) で +12 DLL / +395 関数 追加: ws2_32 (90), iphlpapi (194), urlmon (71), d2d1, dwrite, windowscodecs, dxgi, d3d11, xaudio2_8, dinput8, secur32, bonus xaudio2_8。

Phase F (commit 92722d93, 2026-04-14) で +9 DLL / +1287 関数 追加: gdiplus (627, GDI+ 高レベル 2D), opengl32 (353, OpenGL 1.1 + wgl*), glu32 (52, GLU ユーティリティ), httpapi (42, HTTP Server API), xmllite (6, fast XML), wlanapi (59), wer (20), powrprof (84, Power), wtsapi32 (44, Terminal Services)。

15.6 COM インターフェース (118 / 1238 method)

tools/cswin32_bridge_com/allowMarshaling=true オプションで CsWin32 を駆動する。[ComImport] 属性付きの flat な C# interface が生成され、これを gen_com_from_cswin32.py がパースして HSP の #usecom + #comfunc 形式に変換する。CsWin32 は親インターフェースのメソッドを new 修飾子付きで flatten 出力するので、vtable スロット計算は本文内のメソッド順 = base + index (IUnknown ベースなら base=3、IDispatch ベースなら base=7) で済む。

カバーされている主要 COM:

15.7 既知の制約

9. プラグイン & モジュール リファレンス

IronHSP が提供する 151 個の iron_* モジュール31 個の C++ プラグイン DLLhspd2d / DxLib / OpenCV 統合 の詳細は別ドキュメントに記載しています:

iron_modules_intro.html — モジュール & プラグイン リファレンス

10. 注意事項・既知の制限

HSPCTX 構造体レイアウトの変更

stat, iparam, wparam, lparamint (4byte) から int64_t (8byte) に変更されたため、HSPCTX 構造体のメンバーオフセットが変わっています。

int の演算と int64 の演算

バイトコードの互換性

wstr (UTF-16) の制限

64bit ビルドの注意

#deffunc / #defcfunc の使用

nettoval の使い方

newnet のアセンブリ名

netobj の型変換

DLL 関数の double/float 戻り値

従来の #cfunc では DLL 関数の戻り値を整数としてのみ扱えましたが、 #cfuncd(double)/ #cfuncf(float)を使うことで浮動小数点の戻り値を正しく取得できます。

プリプロセッサ命令戻り値の型用途
#cfuncint / int64整数を返す DLL 関数(従来互換)
#cfuncddoubledouble を返す DLL 関数
#cfuncffloat → doublefloat を返す DLL 関数(HSP 上は double として受け取る)
; double を返す DLL 関数の呼び出し例
#uselib "msvcrt.dll"
#cfuncd _sin "sin" double
#cfuncd _cos "cos" double
#cfuncd _sqrt "sqrt" double

mes _sin(3.14159265)    ; => 0.000000 (≈sin(π))
mes _cos(0.0)           ; => 1.000000
mes _sqrt(2.0)          ; => 1.414214

ポインタ直接呼び出し用の関数も追加されています:

関数戻り値の型備考
callfunc(prmbuf, addr, nargs)int
callfuncd(prmbuf, addr, nargs)double
callfuncf(prmbuf, addr, nargs)float → double
callfuncst(prmbuf, addr, nargs, size)NSTRUCT (構造体)IronHSP 構造体戻り値の DLL 関数を直接呼び出す

callfuncst#cfuncst 同様に MSVC ABI の隠し第 1 引数 (戻り値バッファのポインタ) を使う関数を呼び出します。 ただし宣言ベースの #cfuncst と異なり、低レベル API として呼び出し側が prmbuf[0] に あらかじめ戻り値バッファのアドレスを設定する必要があります。

; #cfuncst global VECTOR GetCameraTarget "dx_GetCameraTarget" 相当を
; varptr + callfuncst で組み立てる例

stdim retbuf, VECTOR              ; 戻り値バッファ
dim   prm, 1
prm(0) = varptr(retbuf)           ; prmbuf[0] = 隠しポインタ
addr   = varptr(GetCameraTarget)  ; 関数アドレス (#func 経由で取得)

stdim v, VECTOR
v = callfuncst(prm, addr, 1, varsize(VECTOR))
mes "v = " + v->x + ", " + v->y + ", " + v->z

戻り値は HSPVAR_FLAG_NSTRUCT として返るため、#cfuncst と同じ要領で v = callfuncst(...) という代入経路でメンバ参照可能な構造体変数に取り込めます。 動的に取得した関数アドレス (varptr, GetProcAddress 等) からの呼び出しに使えます。

注意: 従来の #cfunc で double/float を返す DLL 関数を呼び出すと、 戻り値は整数レジスタ(RAX/EAX)の値となり正しくありません。必ず #cfuncd / #cfuncf を使用してください。

11. 変更履歴

日時コミット内容
4/18 20:50ドキュメント .hs / .hsp / .as 全ファイルのコメントを日本語に統一: .hs ヘルプ 43 個 + .hsp ソース 62 個 + .as ヘッダー 10 個を日本語化。サンプル 26 個追加 (AI/数学/最終バッチ)
4/18 20:45新機能 AI/ML + マルチメディア + 数学 20 モジュール: iron_embedding (テキスト埋め込み) / iron_sentiment (感情分析) / iron_summarize (テキスト要約) / iron_kmeans (クラスタリング) / iron_nn (ニューラルネット) / iron_ga (遺伝的アルゴリズム) / iron_ffmpeg (FFmpeg ラッパー) / iron_synth (オーディオ合成) / iron_spectrum (スペクトラム解析) / iron_fft (高速フーリエ変換) / iron_complex (複素数) / iron_ode (常微分方程式) / iron_optimize (最適化) / iron_curvefit (カーブフィット) / iron_random_dist (確率分布) / iron_combinatorics (組み合わせ) / iron_geometry (幾何学) / iron_quaternion (クォータニオン) / iron_filter (信号フィルタ) / iron_montecarlo (モンテカルロ法)。全て Pure HSP 実装、18/18 テスト ALL PASSED
4/17 20:10新機能 C#/Python 標準機能移植 23 モジュール: iron_test (テストFW) / iron_array2 (配列操作) / iron_str2 (文字列拡張) / iron_color (色変換) / iron_humanize / iron_glob (再帰検索) / iron_diff (テキスト差分) / iron_collection (Stack/Queue) / iron_faker (偽データ) / iron_yaml / iron_dotenv (.env) / iron_table2 (CLI表) / iron_progress_cl / iron_docx (Word) / iron_pptx (PowerPoint) / iron_barcode (1D) / iron_scraper (スクレイピング) / iron_cache (TTL付きキャッシュ) / iron_event (Pub/Sub) / iron_retry (バックオフ) / iron_statemachine / iron_msgpack / iron_bloom (確率的集合)
4/17 20:07改善 全 iron_* モジュールの Win32 API を W 版 (Unicode) に変更: iron_fs / iron_path / iron_folder / iron_registry / iron_ftp / iron_service / iron_tray の全 API 宣言を A→W に移行。入力は wstr (HSP 自動 UTF-8→UTF-16 変換)、出力バッファは WideCharToMultiByte で UTF-16→UTF-8 変換。絵文字・環境依存文字を含むファイルパスに対応
4/17 20:02新機能 Windows Ribbon Framework 完全対応: hspribbon.dll で UIRibbon COM をフルサポート。STRINGTABLE バンドルマージ + BITMAP 画像自動埋め込み + イベントモード (PostMessage) + ribbon_load_bml (uicc.exe のみ必要、rc.exe/link.exe 不要)。専用ドキュメント + サンプル一式
4/16 20:53新機能 Math.NET Numerics 5.0: iron_math_net.hsp で統計/分布/線形代数/補間を hsp3net から利用可能
4/16 20:50新機能 iron_fs.hsp: ファイル/フォルダ操作 (copy/move/size/readtext/writetext/is_locked/mkdir_p/rmdir_r/listfiles)
4/16 20:49新機能 iron_docking + iron_ribbon2: VS風ドッキングウィンドウ + Office風リボンUI (WinForms簡易版)
4/16 20:48新機能 dobon.net 参考 4 モジュール: iron_dragdrop (ファイルD&D) / iron_clipboard2 (画像/HTML) / iron_print (印刷/プレビュー) / iron_gdiplus (リサイズ/回転/透かし)
4/16 20:47新機能 目玉機能 5 モジュール: iron_forms (Anchor/Dock/DataGridView/TabControl/PropertyGrid/TableLayout) / iron_game (HitTest/Easing/FPS/Tilemap) / iron_validate / iron_async (C#スクリプト) / iron_darkmode
4/16 20:41リファクタ 不要な @hsp 修飾を全 iron_* から除去 (テスト時 -C フラグ誤用が原因)
4/16 20:40新機能 C# 標準機能移植 21 モジュール: iron_datetime (日付/時刻) / iron_stopwatch (高精度計測) / iron_uuid (UUID v4) / iron_path (パス操作) / iron_uri (URL パーサ) / iron_folder (特殊フォルダ) / iron_strbuf (文字列ビルダー) / iron_urlencode (URL エンコード) / iron_jwt (JWT デコード) / iron_markdown (MD→HTML) / iron_log (ファイルログ) / iron_process (プロセス起動+stdout) / iron_tray (タスクトレイ) / iron_hotkey (グローバルホットキー) / iron_splash (スプラッシュ) / iron_matrix (行列演算) / iron_graph (BFS/ダイクストラ) / iron_qr / iron_xml / iron_service / iron_task
4/16 20:38新機能 Windows classic samples 移植 7 モジュール: iron_capture (DXGI 画面キャプチャ) / iron_audioloop (WASAPI 音声ループバック) / iron_magnify / iron_dpi / iron_ime / iron_touch / iron_netinfo
4/16 20:35新機能 .NET 版モジュール 7 種: iron_regex_net / iron_crypto_net / iron_registry_net / iron_fwatch_net / iron_smtp_net (TLS対応) / iron_html_net / iron_ftp_net (FTPS対応)
4/16 20:32新機能 iron_dialog フォルダ選択ダイアログ 3 種: モダン (IFileOpenDialog) / クラシック (SHBrowseForFolder) / 新スタイル (BIF_NEWDIALOGSTYLE)
4/16 20:30新機能 残り全モジュール追加: iron_chart_d2d.hsp (hspd2d ネイティブチャート)、iron_ssh.hsp + hspssh.dll (libssh2 SSH/SFTP)、iron_oauth.hsp (OAuth 2.0 localhost コールバック)、iron_mecab.hsp (MeCab 形態素解析ラッパー)、iron_report.hsp (HTML テンプレート帳票出力)
4/16 20:27新機能 ネットワーク・テキスト・可視化モジュール 4 種追加: iron_ftp.hsp (WinINet FTP クライアント)、iron_smtp.hsp + hspsmtp.dll (Winsock SMTP メール送信)、iron_html.hsp + hsphtml.dll (HTML タグパーサ)、iron_chart.hsp (Chart.js + WebView2 グラフ描画)
4/16 20:24新機能 OS 操作モジュール 3 種追加: iron_registry.hsp (Win32 レジストリ読み書き)、iron_fwatch.hsp (ファイル/ディレクトリ変更監視)、iron_exif.hsp (GDI+ ベース EXIF 情報読み取り)
4/16 20:23新機能 暗号化プラグイン hspcrypto.dll + iron_crypto.hsp: Blowfish (ECB/PKCS7) / RC4 / ChaCha20 (RFC 7539) / XOR / AES-256-CBC (BCrypt) / HMAC-SHA256 / PBKDF2-SHA256。32/64bit 両対応
4/16 20:22新機能 正規表現プラグイン 2 種追加: hspregex.dll (C++11 std::regex, ECMAScript 互換) と hsppcre2.dll (PCRE2 10.44, Perl 互換, UTF-8 Unicode フル対応)。match/search/replace/find_all/groups の全操作、32/64bit 両対応。高レベルラッパー iron_regex.hsp / iron_pcre2.hsp で簡易利用可能
4/16 20:21新機能 統計関数モジュール iron_stat.hsp: 外部 DLL 不要の純 HSP 実装。stat_sum / stat_mean / stat_median / stat_variance / stat_stddev / stat_min / stat_max / stat_range / stat_percentile / stat_describe の 10 関数。int/double 配列対応
4/16 20:20新機能 連想配列 (MAP 型) サポート: dimmap で連想配列変数を作成し、map("key") = value で文字列キーによる読み書きが可能。内部は std::unordered_map<std::string, std::string>mapcount / hasmap / mapkey 関数と delmap / mapclear 命令を追加。代入時に int/double/int64 は自動文字列変換。HSPVAR_FLAG_MAP (=12) として変数型システムに統合
4/16 20:133649f02b新機能 #func / #cfunc 等の可変長引数 (...) サポート: パラメータリスト末尾に ... を記述すると、C の printf 系 variadic DLL 関数を HSP から直接呼べる。引数の型は式評価結果から自動推論 (int/int64/double/str)。#func / #cfunc / #cfuncd / #cfuncf / #cfuncst の全 DLL 呼び出しディレクティブで使用可能。x64 variadic ABI 対応済み
4/16 20:11新機能 環境変数・コマンドライン引数の内蔵関数/命令 (10 個): getenv / hasenv / setenv / delenv で環境変数操作、getcmdargc / getcmdarg / getcmdargs / getcmdargi / hascmdarg で Python の sys.argv + argparse 相当のコマンドライン引数パースを内蔵。--name=value / --name value 両形式に対応。実装は GetEnvironmentVariableW / SetEnvironmentVariableW + CommandLineToArgvW (起動時1回パース)
4/16 20:0055eacc14新機能 hspcmp: Allman ブレーススタイル (改行 {) をサポート: if / else / else:if の後に { を次行に置く記法を許容。GenerateCodeBlock() の TK_EOL 処理で次行先頭が { かを先読みし、単行 if の即時クローズをスキップして SCOPE モードへ移行。既存の同一行 { パターンには一切影響なし。15 パターンのコンパイル+実行テスト済み
4/16 07:22c3a26226バグ修正 hspd2d d2d_drawtext の絵文字末尾文字化け修正: strlen(text) は UTF-8 バイト数を返すため、サロゲートペア絵文字を含む文字列で ID2D1RenderTarget::DrawText の stringLength が過大になり、未初期化メモリが末尾に描画されていた。MultiByteToWideChar(CP_UTF8, -1) で UTF-16 コードユニット数を算出して渡すよう修正
4/16 07:2153b63972バグ修正 hspd2d vtable index 4 件修正 + WicBitmapRT 経路復帰: Phase L1-3 SVG で推定した ID2D1DeviceContext vtable index (55/72/112/113) を d2d1_1.h / d2d1_3.h のパースで得た正しい値 (57/74/115/116) に修正。d2d_image_create を ID2D1Bitmap1 経由から CreateWicBitmapRenderTarget 経由に戻して既存描画命令との互換性を回復
4/16 00:06deb148bdリファクタ Phase F6 (最終): hspcv4 残り 78 関数 + contrib proxy + helper cleanup を typed #func 化。grep "$202" = 0 件で OLDDLL 完全撤廃。contrib DLL (hspcv4_contrib.dll) の _impl 関数も typed 化、関数ポインタは per-callsite typedef 化。g_hei / set_hei / getint / getstr helper を全削除。累計 277 関数
4/16 00:01〜054c6b7f80 / 93586cad / 9671e6ea / 029edccb / 94afca7aリファクタ hspcv4 Phase F1〜F5: 基本 49 関数 (画像IO/描画/フィルタ/モルフォ) → imgproc拡張 27 → core Mat演算+DNN+video 34 → contours+features2d+photo+cascade 41 → video+tracker+ml+face+stereo+xphoto+aruco+calib3d 48 を段階的に typed #func 化。混合戦略 (typed 引数 / pval / bmscr) で HSP スクリプト側 API 完全不変
4/15 21:07c3a4eb78新機能 hspllama do_complete_impl 完成: ggml_backend_load_all + llama_backend_init → tokenize → greedy sampler → decode loop → detokenize → llama_vocab_is_eog で終端判定。SmolLM-135M で実機動作確認 ("The capital of Japan is" → "the country's currency, the Japanese Yen...")
4/15 22:05〜多数リファクタ OLDDLL $202 排除プロジェクト: hsp3net 用プラグインから OLDDLL $202 形式を完全撤廃。hspllama POC → hspjson / hspmidi / hspwasm / hspduckdb / hspwinrtocr / hspwgcapture / hspble / hsppdf / hspwebview2 / hsponnx / hsptflite の 11 プラグイン × 138 関数を typed #func + HSPEXINFO callback 機構廃止で一斉移行。hspllama は SmolLM-135M で旧形式と同一出力の回帰確認済
4/15 22:00c6e15488インフラ Phase B: hsp3net 系ランタイムバイナリを package/win32/ に配置。hsp3_net.exe / hsp3_net_64.exe / hsp3cl_net.exe / hsp3cl_net_64.exe / hspcmp_net.exe / hspcmp_net_64.exe 本体、対応する .hrt、および common/hsp3_net.as / hsp3_net_64.as / hsp3cl_net.as / hsp3cl_net_64.as を新規作成。バニラと共存、HSP 側は #include "hsp3_net_64.as" で切替
4/15多数Phase L L0〜L8 大型ロードマップ全走破: L0-1 Phase E+F 翻訳残 6789 entries / L0-2 iron_* 6 helpfiles / L0-3 hspcv4.hs / L0-4 win32 gen2 サンプル / L0-5 iron_toast WinRT / L1-1 iron_csv / L1-2 GIF アニメ (hspd2d) / L1-4 hspwinrtocr / L1-5 hspmidi / L2 hspwasm v1 (Wasm3) / L3 hspwebview2 / L4 WebView2 派生 (ruffle/webpdf/ribbon/designer) / L5 hsppdf (PDFium) / L6 iron_xlsx/office/duckdb / L7 hsponnx/hspllama + iron_ai LOCAL_LLAMA backend / L8 hspwgcapture/hspble / hsptflite + MediaPipe hand detection を連続実装
4/14 20:45-新機能 / 削除 hsp7z.dll + iron_7z.hsp: 7-Zip 公式 CLI (7za.exe / 7za_x64.exe) を CreateProcess + anonymous pipe で呼び出す薄いサブプロセスラッパ (2 export: sevenz_run / sevenz_set_exe)。7z / zip / tar.gz / xz / rar(読) / wim / iso など 40+ フォーマット対応。LGPL 7za.exe を同梱して DLL 差し替えでセキュリティ追従可。高レベル API は iron_7z.hsp が提供 (iron_7z_add / extract / extract_one / list / test、list は -slt 技術モードを Pure HSP でパース)。削除: hspzip.dll + iron_zip.hsp (miniz ベース) は OpenHSP 標準の ZLibWrap/zipfile.as と機能が被っていた上、単一形式 (.zip) しか扱えなかったので廃止
4/14 20:447bc95bf2改修 win32_types_gen2.as pre-existing バグ修正: HSP 識別子 case-insensitive で衝突していた #defstruct COLORMAP vs ColorMap / RECT vs Rect を GDI+ 側を GdipColorMap / GdipRect にリネーム。複数 enum で共通する #define (SERVICE_NO_CHANGE 等) を初出のみ emit する dedup。#define 定数にも global キーワード付与で #module 内から参照可能に
4/14 20:433c4fd3d8改修 win32 gen2 + user32_ext: 全 58 個の *_gen2.as の #cfunc/#func 宣言に global キーワードを追加 (HSP スクリプト側で #module 内から Win32 API を直接呼べるように)。PoC reference だった user32_ext.as は本番未使用 + 定数名衝突のため削除。gen_from_cswin32.py 側にも同等修正
4/14 20:42a3ea7d05改修 iron_* を #module/#global パターンに統一: top-level #deffunc fall-through 回避に使っていた goto *_xxx_skip_init ワークアラウンドを、HSP 正統派の #module modname / #global で囲む形に置き換え。11 ファイル (ai/camera_mf/db/mcp_client/mcp_server/serial/shell/speech/url/video/webserver)。初期化は varname@modname 構文で module 内変数に代入
4/14 20:41e69627d8新機能 iron_url.hsp Pure HSP で C# WebUtility 相当 (url_encode / url_encode_form / url_decode / html_encode / html_decode / url_parse_query)。外部 DLL 不要
4/14 20:408da9880c改修 hspwebsrv.dll HTTP.sys + WebSocket 書き直し: C# HttpListener と同じ HTTP.sys (httpapi.dll v2) バックエンドに全面書き直し。URL reservation 不要の localhost listen に加え、websrv_accept_ws / ws_send / ws_recv で WebSocket echo server も書ける。RFC 6455 フレーム encoder/decoder + Sec-WebSocket-Accept SHA-1 を自前実装。HTTPS + HTTP/2 は URL reservation さえ用意すれば自動有効化
4/14 20:38b71ef7b9新機能 / ドキュメント D2/D3/D4 + C4: (D2) sample_video_player2.hsp — iron_video のフル GUI プレイヤー (シークバー + 速度切替 + 音量 + 時刻表示)。(D3) sample_cam_ai.hsp — Webcam スナップショット → Base64 化 → Groq llama-3.2-vision で画像説明、iron_camera_mf + iron_ai + iron_hash の連動デモ。(D4) docs/iron_modules_intro.html — iron_* モジュール入門記事 (17 モジュール一覧 + 10 個コード例 + API キー取得リンク)。(C4) _test_all.bat — iron_*.hsp サンプル一括コンパイルテスト (24/25 pass)
4/14 20:3732fb2c5b新機能 B1〜B5 新規 iron_* 5 個: (B1) hspwebsrv.dll + iron_webserver.hsp — winsock ベース minimal HTTP server (URL reservation/admin 不要、web_open/accept/respond/close API)。(B2) hspzip.dll + iron_zip.hsp — miniz 3.0.2 埋め込み ZIP 読み書き (zip_open_read/write + entry_name/size + extract_file/mem + add_file/mem)。(B3) hspdb.dll + iron_db.hsp — SQLite 3.46.1 amalgamation 組み込み (db_open/exec/query/step + col getter、max 32 DB 並列)。(B4) iron_shell.hsp — Pure HSP で shell32 + IShellLinkA COM (shell_open/execute/runas/recycle/mklink)。(B5) iron_serial.hsp — Pure HSP で kernel32 シリアル (serial_open/write/read/avail、DCB 手組み)
4/14 20:360fce7424新機能 A1〜A4 既存機能補完: (A1) iron_mcp_client に resources/prompts 対応追加 (iron_mcp_resource_list/read + iron_mcp_prompt_list/get)。(A2) iron_http の streaming 低レベル API (http_stream_open/read/close) + iron_ai の SSE streaming (iron_ai_chat_stream_start/poll/end、data:{...}\n\n イベントパーサで delta.content 抽出)。(A3) iron_video に Position/Duration/Seek 追加 (IMFPMediaPlayer SetPosition/GetPosition/GetDuration #comfunc + MFP_POSITIONTYPE_100NS GUID + PROPVARIANT 手組み、ms 単位 API)。(A4) iron_speech に連続認識追加 (hspvosk に accept_pcm_s16/partial_result/final_result/reset を追加、iron_speech_listen_start_mic/poll/stop で mic→vosk pipeline)
4/14 20:35131c5902ドキュメント README.md + docs/IronHSP_specification.html を本セッション全成果に追従更新 (第 1 回)
4/14 20:34ec3a570f新機能 K-D-C: hspwinrtspeech.dll Windows.Media.SpeechRecognition (WinRT) を C++/WinRT (header-only) でラップ (3 export)。SpeechRecognizer + CompileConstraintsAsync + RecognizeAsync でライブマイクから 1 phrase 取得。WinRT は仕様上 microphone-only のため新 API iron_speech_listen_once を追加。これで K-D 全 5 backend (CLOUD/WHISPER/VOSK/SAPI/WINRT) が揃った。x64 専用
4/14 20:3358fc0b05新機能 K-D-B: hspsapi.dll Windows SAPI 5 統合。sapi.dll の ISpRecognizer + ISpRecoContext + ISpRecoGrammar (dictation) を COM で構築 (3 export)。SPBindToFile で WAV 入力 → イベントループで全 phrase 取得。iron_speech の SPEECH_BACKEND_SAPI 実装。OS 標準、追加 DL 不要。Win32 + x64
4/14 20:328a12302b新機能 K-D-D: hspvosk.dll オフライン Vosk (Kaldi) 統合。alphacephei prebuilt libvosk.dll を C++ ラップ (4 export)。vosk_recognizer_accept_waveform_s + final_result から JSON の "text" 抽出。iron_speech の SPEECH_BACKEND_VOSK 実装。軽量 (model 47 MB 〜)、24+ 言語。x64 専用
4/14 20:31df1cf228新機能 K-D-A: hspwhisper.dll オフライン whisper.cpp 統合。git submodule で whisper.cpp clone → cmake build (whisper.lib + ggml*.lib) → C++ ラッパ (4 export)。簡易 WAV loader (16bit PCM, ダウンミックス + リサンプル) + whisper_full CPU 推論 (4 thread)。iron_speech の SPEECH_BACKEND_WHISPER 実装。x64 専用
4/14 20:30c9723196新機能 hspmfcam Phase 2-G: マイク単独 audio-only キャプチャ追加 (9 関数)。mfcam_audio_open で sr/ch/bits 指定 (MF Audio Resampler 自動挿入), 生 PCM リング buffer (mfcam_audio_pcm_avail/read_pcm), WAV 直書き (mfcam_audio_save_wav_*), AAC/MP3/WMA/FLAC エンコード録音 (mfcam_audio_record_*)。サンプル sample_mic_record.hsp でマイク録音 → cloud whisper 文字起こしまで一気通貫
4/14 20:29a2eac105新機能 iron_speech.hsp 音声認識統一 API + cloud whisper 実装。iron_http に multipart/form-data ファイルアップロード (http_post_file) 追加。iron_ai_transcribe で OpenAI 互換 /audio/transcriptions エンドポイントを叩く。バックエンド切替型設計 (CLOUD/WHISPER/SAPI/WINRT/VOSK)、現状 CLOUD のみ動作の他はスタブ
4/14 20:28c667f77aドキュメント package/win32/common/iron_*.hsp 配下の全 15 モジュールに対応する日本語 .hs ヘルプ追加 (合計 128 命令): iron_http/json/toast/video/camera/camera_mf/ai/mcp_client/mcp_server/clip/dialog/hash/ini/perf/sysinfo
4/14 20:2784dc6e4dドキュメント 新規 DLL の日本語ヘルプ追加: hspjson.hs (10 命令), hspmcp.hs (7 命令), hspmfcam.hs (18 命令、Phase 2 で先行追加済)
4/14 20:2682e8f094新機能 MCP 双方向: hspmcp.dll (CreateProcess + 匿名 pipe + reader thread, 7 export) + iron_mcp_client.hsp (stdio + HTTP transport, JSON-RPC 2.0) + iron_mcp_server.hsp (HSP3CL を MCP stdio server 化、Claude Desktop に登録すれば HSP 関数を tools として呼んでもらえる)。サンプルは公式 filesystem MCP server を npx で spawn する例 + say_hello/add/current_time の 3 ツール server 例
4/14 20:25aee3b832新機能 iron_ai.hsp: OpenAI 互換 Chat API クライアント (純 HSP3, iron_http + iron_json のみ)。OpenAI/Anthropic/Ollama/LM Studio/llama.cpp/GitHub Models/Groq/xAI 等の /chat/completions エンドポイントを 1 行で叩ける。multi-turn 履歴自動管理、system prompt、temperature/max_tokens 対応。iron_http に http_set_header 追加
4/14 20:24d89da696新機能 Phase G Phase 2: hspmfcam.dll を 38 → 68 関数に拡張。フォーマット列挙 (mfcam_format_count/get, NV12/YUY2/MJPG 等の FOURCC), 任意フォーマット指定 open (mfcam_open_ex), カメラプロパティ (IAMVideoProcAmp + IAMCameraControl 17 種), 映像 MP4 録画 (mfcam_record_start H264/HEVC/WMV9/VP9/MJPG SinkWriter), 音声+映像同時録画 (mfcam_record_start_av + audio worker thread, AAC/WMA/FLAC/MP3), 自動デインターレース (MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING)。日本語ヘルプ hspmfcam.hs 18 命令
4/14 20:23174db403新機能 Phase I (hspcv4): QR コード生成 + 1D バーコード検出/読み取り。cv4_qr_encode (cv::QRCodeEncoder, ec/scale/version 指定), cv4_barcode_detect / cv4_barcode_decode (cv::barcode::BarcodeDetector, Code128/EAN-13/EAN-8/UPC-A 対応)。サンプル sample_qr_encode.hsp でラウンドトリップテスト動作確認
4/14 20:22195c59da新機能 iron_camera_mf.hsp ハンドルベース API + dual-cam サンプル。iron_cam_open がハンドル返却、最大 256 並列。sample_camera_mf_dual.hsp で 2 カメラ同時プレビュー
4/14 20:219a655566新機能 Phase G Phase 1: hspmfcam.dll Pure Media Foundation Webcam キャプチャ C++ ヘルパ (38 関数)。worker thread + child window + MF SourceReader 方式で HSP main thread 停止中もプレビュー継続。最大 256 デバイス並列、自動デインターレース、PNG/JPEG/BMP/GIF/TIFF スナップショット、アスペクト比 (stretch/letterbox)、リサイズ対応、デバイス列挙 (friendly name + SymbolicLink/EndpointID)
4/14 20:20ad8f0332新機能 iron_camera.hsp: hspcv4 の cv4_video_open/cv4_video_read を 1 行 API でラップした Webcam モジュール。OpenCV 内部で MSMF を使うため結果として MF backend。FPS 表示 + S スナップショット保存サンプル付き
4/14 20:19cf13d865新機能 iron_video.hsp: Media Foundation MFPlay (IMFPMediaPlayer) を #usecom 空 CLSID + #comfunc 直叩きで包んだ動画/音声再生ラッパ。MP4/MKV/MOV/MP3/AAC 等。Play/Pause/Stop/Step/SetRate/SetVolume/Shutdown/GetState の 10 命令。GUI プレイヤーサンプル付き
4/14 20:186051ac4d新機能 iron_toast.hsp: Shell_NotifyIconA + NOTIFYICONDATAA 構造体手組みでタスクトレイバルーン通知。Win10/11 ではトースト風表示。toast / toast_warning / toast_error / toast_clear の 4 命令
4/14 20:1769ca49e8バグ修正/新機能 iron_http 大幅修正: HSP3 の return は refstr+stat を同時に返せないため出力 var 引数式に変更 (http_get url, body)。WinHttpCloseHandle 等の statement 形式呼び出しを #cfunc#func に修正。サンプル sample_weather.hsp で Open-Meteo API → iron_json パースまで動作確認
4/14 20:169b1569e0新機能 Phase G 下地: Media Foundation DLL bindings (mf 34, mfplat 123, mfreadwrite 5, evr 20, wmvcore 11, avrt 11)。dump_exports.py に追加して 318 候補 → 204 サポート関数の .as/.hs 生成
4/14 20:1515d9ec86新機能 Phase H: 自前 JSON 読み書きプラグイン hspjson.dll + iron_json.hsp モジュール。サードパーティ依存ゼロ (300 KB)、JSONPath-like パスで値取得・配列ループ・型判定・整形/minify。10 命令
4/144a1cd689新機能 IronHSP Simple モジュール集 第 2 弾: iron_dialog.hsp (Vista モダン IFileOpenDialog COM ラッパ - dialog_open / dialog_save / dialog_pickfolder), iron_perf.hsp (QueryPerformanceCounter μ秒タイマー - perf_now / perf_start / perf_lap), iron_sysinfo.hsp (sys_username / sys_cpucount / sys_appdata 等 10 個), iron_clip.hsp (クリップボード文字列) の 4 モジュール + 4 サンプル。Phase J 累計 7 モジュール / 7 サンプル。memory reference_hsp_module_quirks.md#defcfunc global サポート外、#comfunc 単独 intptr エラー、ddim モジュール内バグ等の制約 11 個追記
4/14dc7f9ddc新機能 IronHSP Simple モジュール集 第 1 弾 (Phase J): 生の Win32 API は初心者にハードル高いので、よく使うパターンを 1〜2 行で書ける薄いラッパとして提供。iron_ini.hsp (INI 設定ファイル), iron_http.hsp (WinHTTP GET/POST 1 行), iron_hash.hsp (BCrypt SHA-256/MD5/Base64) の 3 モジュール + 各サンプル (HTTP は Open-Meteo 天気予報 API 例)。全 hspcmp 通過確認済
4/1492722d93新機能 Phase F: Win32 API 拡張 +9 DLL / +1287 関数。gdiplus (627, GDI+ 高レベル 2D 描画 / 画像コーデック / フォント), opengl32 (353, OpenGL 1.1 + wgl*), glu32 (52, GLU ユーティリティ), httpapi (42, HTTP Server API), xmllite (6, 高速 XML パーサ), wlanapi (59), wer (20), powrprof (84), wtsapi32 (44) を追加。dump_exports.pyLEGACY_LOWER_PREFIXESgl/wgl/glu を追加 (OpenGL 関数は小文字始まり慣例)。累計 35 → 51 DLL / 4733 → 6020 関数
4/1431765549新機能 Phase E: Win32 API 拡張 +12 DLL / +395 関数。ws2_32 (90, Winsock 2), iphlpapi (194, IP Helper), urlmon (71, URLDownloadToFile), d2d1 (13), dwrite (1), windowscodecs (9), dxgi (5), d3d11 (5), xaudio2_8 (4), dinput8 (1), secur32 (8) を dump_exports.py 経由で追加。filter_unsupported.pyPInvoke005 警告処理を line-number lookup ベースに修正 (90 件追加コメントアウト)。累計 23 → 35 DLL / 4338 → 4733 関数
4/14ea6ebc39バグ修正 hspdxlib sample 03-10: DrawFormatString (DxLib の可変長引数版) は HSP の #func が variadic 非対応で compile error になっていた。DrawString X, Y, strf("fmt", ...), color 形式に変換 (合計 11 箇所)。plugins/win32/hspdxlib/sample/_convert.py に再現可能な regex 変換スクリプトを残す
4/14e2406644バグ修正 OpenMutex / OpenSemaphore / SetEnvironmentStrings / IsCharLower の 4 API は win32metadata の複数 namespace に同名が存在し CsWin32 が CS8785 で source generator ごと crash する問題を解決。NativeMethods.txt に fully-qualified name (Windows.Win32.System.Threading.OpenMutex 等) を指定して個別に復活
4/1421b72511 / dedcdb8f新機能 Win32 API + COM の MSDN 説明を全日本語化。tools/cswin32_bridge/docs_ja.json に 25422 entries、tools/cswin32_bridge_com/docs_ja.json に 2951 entries (合計 28373 entries)。並列バックグラウンド subagent 60+ で per-DLL チャンク翻訳。生成スクリプトは英語 doc を中間 JSON に dump し翻訳キャッシュを emit 時に上書きする方式なので、新規 API 追加時の翻訳追記もスムーズ
4/14383ab46c新機能 Phase D — DLL exports 体系的走査: kernel32.dll の 1449 exports に対して 67 関数 (4%) しかカバーできていなかった旧来の手書き NativeMethods.txt を全廃し、tools/cswin32_bridge/dump_exports.py で 23 system DLL を dumpbin 走査して 5631 候補を抽出 → win32metadata がサポートする 4334 関数 (77%) を全網羅。278 → 4334 関数 (15.5x)。kernel32 が 67 → 881 (13.1x)、user32 が 36 → 606 (16.8x)、advapi32 が 10 → 419 (41.9x)。bonus DLL (comdlg32 / ncrypt / normaliz / propsys / shlwapi / wintrust / api-ms-win-dx) も win32metadata の依存解決経由で 7 個追加
4/144cce6e7dバグ修正 gen_from_cswin32.py: 各 DLL .as に全 struct + 全 enum をダンプしていたため 22 ファイル全部が ~210KB の重複データになっていた問題を修正。共有 win32_types_gen2.as を 1 個出力し、各 DLL .as は #include "win32_types_gen2.as" で参照する形に変更 (4.6 MB → 273 KB、94% 削減)
4/143680c4b7 / 4cce6e7d新機能 CsWin32 bridge: Microsoft の win32metadata + Microsoft.Windows.CsWin32 source generator を経由した Win32 API 自動生成パイプラインを構築。tools/cswin32_bridge/ に .NET 8 csproj + Python 後処理 (gen_from_cswin32.py)。生成 C# ([DllImport] + XML doc コメント) を regex parse して、HWNDintptr / PCWSTRwstr / 構造体ポインタ→var / enum→int 等にマップして .as 出力。A/W バリアント自動選択 (CreateFileW / MessageBoxW 等)、定数 enum 群 (SW_* / SM_* / WS_* / MB_*) 完全展開。cswin32_bridge_com/ 側は allowMarshaling=true で COM インターフェース ([ComImport]) を生成し #usecom + #comfunc 形式に変換
4/140c4750d5新機能 hspcv4 アルファチャンネル対応 Phase 1-3: cv4load がデフォルトで IMREAD_UNCHANGED を使い PNG/TIFF の BGRA を保持。namespace 内に with_alpha_preserved<OpBGR>() ヘルパーを追加し、blur / gauss / median / bilateral / canny / threshold / erode / dilate / morphology / sobel / scharr / laplacian / filter2d / filter2d_mat の主要 15 フィルタが 4ch 入力で alpha を自動分離・再合成。19 箇所の cvtColor(BGR2GRAY) 呼び出しを as_bgr() 経由に変換 (4ch 入力でも channel mismatch しない)。cv4_put_pixel に optional a 引数追加 (CV_8UC4 対応)、新規 cv4_get_pixela で BGRA 4ch 読み取り対応
4/1316b50129 / 813e0ce1新機能 hspcv4 Phase 27: highgui Trackbar / mouse events / FreeType による日本語フォント描画 (FreeType + HarfBuzz via vcpkg) を本実装
4/13b91186e9新機能 COM コールバック Phase B3: IBindStatusCallback サンプルで URLDownloadToFile 経由の e2e 動作確認 (HSP 側で実装した COM コールバックが外部 COM API から正しく invoke される)
4/1390e9bdb1新機能 COM コールバック Phase B2: bytecode emission + runtime opcodes (newcomcb / comprm / comcbtag / comcbtags / comcbis / comcbthis / comcbidx / comret)
4/136b1d2541新機能 COM コールバック Phase B1: hspcmp に #defcbcom / #cbmethod / #endcbcom パーサ追加
4/137cbef99b新機能 COM コールバック Phase B0: vtable allocator + IUnknown 自動実装 + 動的 thunk + bridge dispatcher (runtime 基盤)
4/1370a76926新機能 intptrを hsp3net + hspcmp に追加。プラットフォーム依存サイズ整数 (x86=32bit / x64=64bit)。#func / #cfunc / #cfuncd / #cfuncf / #cfuncst / #comfunc / #cbmethod 全 DLL 系で使用可
4/13b27f3b09新機能 hspd2d Phase 3: 複数フォント対応 + D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT による 色付き絵文字レンダリング
4/13be451a92新機能 hspd2d Phase 2: d2d_font / d2d_drawtext / d2d_image_save 動作確認 + local 宣言追加で安定化
4/13c3e07e41新機能 hspd2d: DirectWrite + Direct2D + WIC を pure HSP の COM 機能だけで wrap した 2D 描画モジュール (Phase 1 PoC)
4/133436d4e4 / 7ecdea9f整理 NSTRUCT / #cfuncst / setcallback を hsp3net 専用に集約。hsp3 (vanilla) からは削除し、文法を拡張する系は hsp3net のみ持つ役割分担に
4/13908aca8bバグ修正 hsp3/hsp3net: x64 COM #comfunc dispatch のバグ (vtable indexing が 4 byte 単位で誤動作) と newcom -1 で 64bit ポインタが切り詰められる問題を修正
4/12DxLib hspdxlib.as: 166 個の関数で var → 構造体名 (VECTOR/MATRIX 等) に修正、7 個の #defstruct ブロックを追加 (構造体値渡しの ABI バグ修正)
4/12改善 NSTRUCT 型に GetBlockSize コールバックを実装 (varptr(struct_var) 等のサポート)
4/12新機能 callfuncst(prmbuf, addr, nargs, size): 構造体戻り値DLL関数の動的呼び出し (callfuncd/callfuncf と対称)
4/12改善 #defunion/#endunion#defstruct 内のサブ共用体ブロックにも統一。旧 #union 記法は廃止 (使用するとエラー)
4/12バグ修正 構造体末尾アライメントを min(pack, max_member_align) で計算するように修正 (C ABI 互換)。#defstruct VECTOR が pack 指定なしでも 12 byte になる
4/12整理 _struct_load opcode、sret_get_last_size ハック、PP dim→structdim 自動書き換え、GenerateCodeLET の自動 dim 補正を削除 (NSTRUCT 化により不要)
4/12新機能 #cfuncst 戻り値を NSTRUCT として返却。v = GetCameraTarget() の dim 省略を strmid() と同じ pending_size ヒント方式で実装
4/12新機能 varsize(STRUCT_NAME): 構造体サイズを取得する組み込み関数 (PP 段階でリテラルに置換)
4/12新機能 stdim 命令: NSTRUCT 型での構造体変数確保 (旧 structdim をリネーム)
4/12新機能 HSPVAR_FLAG_NSTRUCT 型 (= 11) を追加。構造体変数を専用変数型として確保し、代入は標準の '=' 経路で memcpy
4/12整理 構造体の旧式インデント記法を廃止 (#field 必須化)。#union/#endunion もディレクティブ化
4/12新機能 #cfuncst 構造体型連携: 自動 dim + メンバアクセス対応
4/12新機能 #field: #defstruct 内のメンバ定義ディレクティブ
4/12新機能 #cfuncst: 構造体を値で返す DLL 関数の安全な呼び出し (入れ子対応スタック方式バッファ)
4/12DxLib hspdxlib: DxLibW ヘッダ自動生成 (2,548関数 + 901定数 + 55構造体)
4/11d1e4fae4setcallback/callbackarg: ネイティブコールバック関数ポインタ (x86 stdcall / x64 fastcall thunk動的生成)
4/11mcall: ジェネリックメソッド型パラメータ指定 ("Method<Type>" 構文)
4/11netlinq: LINQ操作のC#ラムダ式文字列実行 (Where, Select, OrderBy, First, Count等)
4/11netdelegate: HSPラベル→.NETデリゲート変換 (EventHandler, Action, Predicate対応)
4/11hwnd/hinstance/hdc を64bit環境で int64 として返すよう修正
4/11外部ライブラリ連携検証: Newtonsoft.Json 13.0.3 / NAudio 2.2.1 / DockPanelSuite 3.1.0
4/11.NET品質改善: Boolean→int変換修正、C#/VBコンパイル参照DLL自動解決、netstandard.dll自動参照、コンパイルエラーのnetexerr対応
4/11.NET命令改良: newnetジェネリクス対応、enumnet文字列アセンブリ名対応、nettovalフィールドアクセス修正・Enum変換追加、formsaddctrl実装
4/11b87295f5wstr Phase 3-5: 文字列関数/命令/note系 + 64bitビルド対応 + プラグイン64bit化
4/118d770d0cwstr (UTF-16) Phase 1-2: 変数型 + L"..." リテラル
4/1162878cbc構造体/共用体サポート (#defstruct/#defunion)
4/10Phase 12 #cfuncd/#cfuncf (double/float戻り値DLL)、callfuncd/callfuncf追加
4/10Phase 11 CnvCustom実装、tonet実装、objprm .NET対応、InvokeMethod Enum変換、enablewpfエラーチェック
4/10Phase 10 .NET 例外処理: neterror/netexerr 追加、Enum 自動変換
4/11 00:0046f627ecPhase 9 GUI オブジェクトを .NET コントロールに置換、Form.Controls 統合
4/10 23:30b03f3c0aPhase 8 アセンブリ自動解決、hsp3cl NETOBJ登録
4/10 23:00c3a136aePhase 7 hsp3cl .NET対応、DLL戻り値自動int64、mref修正、v4.8
4/10 22:30edb1dfdaPhase 6 #defcfunc 戻り値 + DLL 戻り値 int64 + hsp3cl 対応
4/10 22:003ee4970bPhase 5 #deffunc/#func の int64 パラメータ対応
4/10 21:30452d10eePhase 4 hspcmp: int64 リテラル(Lサフィックス、自動昇格)
4/10 21:00dbc1c3eePhase 3 int64()/dim64/qpeek/qpoke + varptr/dupptr 64bit対応
4/10 20:30baa389e5Phase 2 システム変数 stat/wparam/lparam/iparam の int64 化
4/10 20:00e284b003Phase 1 int64 変数型の基盤追加
4/10 19:307576902eビルド修正: v143化、CLR対応、charset設定、マージミス修正
4/10 19:0051f7a621hsp3net を 3.7 ベースに更新(87ファイル置換 + 6ファイル 3-way merge)
4/10 18:30ca5174533.7 を master にマージ(3-way merge)
4/10 18:00a61b1f32OpenHSP 3.7 (SVN r1616) をインポート

64bit ビルド対応一覧

ターゲット32bit 出力名64bit 出力名状態
ランタイム (GUI)hsp3.exehsp3_64.exe既存
ランタイム (CL)hsp3cl.exehsp3cl_64.exe新規
コンパイラ (DLL)hspcmp.dllhspcmp64.dll新規
コンパイラ (EXE)hspcmp.exehspcmp64.exe新規
デバッガhsp3debug.dllhsp3debug_64.dll出力名修正
hspexthspext.dllhspext64.dll出力名修正
hspdahspda.dllhspda64.dll新規
hspinethspinet.dllhspinet64.dll新規
hspvoicevoxhspvoicevox.dllhspvoicevox64.dll新規
hgimghgimg.dllhgimg64.dllvcxproj新規
obaqobaq.dllobaq64.dllvcxproj新規
hgimgxhgimgx.dllDirectX 8依存 (32bitのみ)
ZLibWrapZLibWrap.dllZLibWrap64.dll対応済み