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 は、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 版はサブセット)。
newnet / mcall / netlinq / netdelegate)。enablewpf で WPF アセンブリ動的ロード。C# / VB.NET ソースの動的コンパイルにも対応screen / button / input 等が WinForms コントロールとして生成され、Form.Controls に統合される (Phase 9)dim64 / int64() / qpeek / qpoke、L サフィックスリテラル、#deffunc/#func/#defcfunc の引数・戻り値 int64 化、stat/wparam/lparam/iparam の int64 化、varptr/dupptr の 64bit 対応、hwnd/hinstance/hdc の 64bit 化#func / #cfunc / #cfuncd / #cfuncf / #cfuncst / #comfunc / #cbmethod すべての DLL インターフェースで使用可L"..." リテラル、文字列関数・命令・note* 系すべて wstr 対応#defstruct / #field / #defunion / #endunion、専用変数型 NSTRUCT、stdim 命令、varsize(S)、C ABI 互換のパディング計算、#cfuncst (値返しDLL関数) + callfuncst で構造体値渡し/値返しをサポート#cfuncd / #cfuncf で double / float 戻り値、#cfuncst で構造体値返し、#comfunc の x64 vtable dispatch 修正、newcom -1 の 64bit ポインタ引取り修正。可変長引数 (...) で C の printf 系 variadic DLL 関数を直接呼び出し可能#defcbcom) — vtable allocator + IUnknown 自動実装 + 動的 thunk + bridge dispatcher により、HSP 側で実装した COM インターフェースを C++ 側 API (例: IBindStatusCallback) にそのまま渡せるsetcallback / callbackarg で x86 stdcall / x64 fastcall thunk を動的生成し、HSP ラベルを C 関数ポインタとして渡せるgetenv / setenv / delenv / hasenv で環境変数を操作、getcmdargc / getcmdarg / getcmdargs / getcmdargi / hascmdarg で Python の sys.argv / argparse 相当のコマンドライン引数パースを内蔵。--name=value / --name value 両形式対応neterror / netexerr、Enum 自動変換、CnvCustom、tonet、objprm .NET 対応#func 化済。32bit + 64bithspllama (llama.cpp LLM) / hspwhisper (whisper.cpp) / hspvosk (Kaldi) / hspsapi (SAPI 5) / hspwinrtspeech (WinRT) / hsponnx (ONNX Runtime) / hsptflite (TFLite + MediaPipe)hspmfcam (Webcam 68 関数) / hspmidi (MIDI) / hspaudioloop (WASAPI ループバック) / hspcapture (DXGI キャプチャ) / hspwgcapture (Win Graphics Capture)hspjson (JSON) / hspdb (SQLite) / hspduckdb (DuckDB)hspwebsrv (HTTP/WS サーバ) / hspmcp (MCP) / hspsmtp (SMTP) / hspssh (libssh2) / hsphtml (HTML パース)hspcrypto (AES/ChaCha20) / hspregex (std::regex) / hsppcre2 (PCRE2)hspwebview2 (Edge WebView2) / hspribbon (Ribbon Framework) / hspble (BLE) / hspwinrtocr (WinRT OCR)hsp7z (7-Zip) / hspwasm (Wasm3) / hsppdf (PDFium) / hspcv4 (OpenCV, 上述)#func 形式。32bit + 64bit 両対応 (一部 x64 専用)package/win32/ に hsp3_net(_64).exe / hsp3cl_net(_64).exe / hspcmp_net(_64).exe を配置。バニラと共存IronHSP リポジトリには、HSP 風の文法で 純粋な .NET Framework 4.8 アセンブリ (DLL / EXE) を生成する独自言語・独自コンパイラ NHSP を同梱しています。IronHSP (HSP ランタイム上で .NET を呼ぶ) とは逆方向の、HSP 風文法で .NET ネイティブな成果物を作るアプローチです。
#func / #class / #assembly などのディレクティブ形式。内部は C# 相当の型システム (クラス / ジェネリクス / List<T> / String / Math 等、全 .NET API が使用可)nhspc) — NhspCompiler.Core (Lexing / Parsing / Emit / Diagnostics) + NhspCompiler.Tests。-platform で x86 / x64 / AnyCPU / AnyCpu32BitPreferred、-debug で PDB 生成、サブシステム (Console / Windows) 切替対応#icon, PNG/JPG/BMP/GIF 可) / バージョン情報 (#version) 等の EXE メタ情報埋め込みにも対応Pdb2PortablePdb で変換) を生成し、Visual Studio / dnSpy でブレークポイント・ステップ実行可能NhspLanguageServer (LSP サーバ) + NhspVsLanguageClient (Visual Studio 2022 拡張) + vscode-nhsp (VS Code 拡張) + NhspEditor (スタンドアロンエディタ) + sakura (サクラエディタ連携)| プロジェクト | 出力ファイル | CLR | プラットフォーム |
|---|---|---|---|
hsp3\win32gui\hsp3.sln | hsp3.exe | なし | x86 |
hsp3\hsp3_64.sln | hsp3_64.exe | なし | x64 |
hsp3\win32\hsp3cl.sln | hsp3cl.exe | なし | x86 |
hsp3\hsp3cl_64.vcxproj | hsp3cl_64.exe | なし | x64 |
hsp3net\win32gui\hsp3.sln | hsp3.exe (.NET版) | あり | x86 |
hsp3net\hsp3_64.sln | hsp3_64.exe (.NET版) | あり | x64 |
hsp3net\win32\hsp3cl.sln | hsp3cl.exe (.NET版) | あり | x86 |
hsp3net\hsp3cl_64.vcxproj | hsp3cl_64.exe (.NET版) | あり | x64 |
| プロジェクト | 出力ファイル (x86) | 出力ファイル (x64) |
|---|---|---|
hspcmp\win32dll\hspcmp.vcxproj | hspcmp.dll | hspcmp64.dll |
hspcmp\win32\hspcmp.vcxproj | hspcmp.exe | hspcmp64.exe |
tools\win32\hsp3debug\hsp3debug.vcxproj | hsp3debug.dll | hsp3debug_64.dll |
| プラグイン | 出力 (x86) | 出力 (x64) | 備考 |
|---|---|---|---|
| hspext | hspext.dll | hspext64.dll | |
| hspda | hspda.dll | hspda64.dll | |
| hspinet | hspinet.dll | hspinet64.dll | |
| hspvoicevox | hspvoicevox.dll | hspvoicevox64.dll | voicevox_core 0.14.6 |
| hgimg | hgimg.dll | hgimg64.dll | vcxproj 新規作成 (VS2022) |
| obaq | obaq.dll | obaq64.dll | vcxproj 新規作成 (VS2022) |
| ZLibWrap | ZLibWrap.dll | ZLibWrap64.dll | |
| hgimgx | hgimgx.dll | — | DirectX 8 依存 (32bitのみ) |
| hspcv | hspcv.dll | — | 旧OpenCV (後日対応予定) |
/execution-charset:shift_jis)、64bit版はUTF-8 (/execution-charset:utf-8) で動作します。#ifdef __hsp64__ で 64bit DLL 名に自動切替されます。IronHSP はバニラ HSP3 の変数型 (int / double / str / label / struct / comobj) に加え、5 つの新規変数型を追加しています。本章では全変数型と各拡張型の詳細を解説します。
| Flag | 値 | 型名 | サイズ | 説明 |
|---|---|---|---|---|
HSPVAR_FLAG_NONE | 0 | - | - | 未定義 |
HSPVAR_FLAG_LABEL | 1 | label | ポインタ | ラベル(ジャンプ先) |
HSPVAR_FLAG_STR | 2 | str | 可変長 | 文字列 |
HSPVAR_FLAG_DOUBLE | 3 | double | 8 byte | 倍精度浮動小数点 |
HSPVAR_FLAG_INT | 4 | int | 4 byte | 32bit 符号付き整数 |
HSPVAR_FLAG_STRUCT | 5 | struct | 可変 | モジュール変数構造体 |
HSPVAR_FLAG_COMSTRUCT | 6 | comobj | ポインタ | COM オブジェクト |
| (予約) | 7 | - | - | VARIANT 用に予約 |
HSPVAR_FLAG_INT64 | 8 | int64 | 8 byte | 新規 64bit 符号付き整数 |
HSPVAR_FLAG_NETOBJ | 9 | netobj | ポインタ | .NET .NET オブジェクト参照 |
HSPVAR_FLAG_WSTR | 10 | wstr | 可変長 | 新規 UTF-16 LE ワイド文字列 |
HSPVAR_FLAG_NSTRUCT | 11 | nstruct | 可変 | 新規 ネイティブ構造体 (#defstruct 用、stdim で確保) |
HSPVAR_FLAG_MAP | 12 | map | 可変 | 新規 連想配列 (dimmap で確保、文字列キーで要素アクセス) |
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")
| 名前 | 種別 | 書式 | 説明 |
|---|---|---|---|
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)を書き込む。文字列を渡すと自動変換 |
| 機能 | 対応内容 |
|---|---|
stat | int64 型で返す。_s = stat で _s は自動的に int64 型になる |
wparam / lparam / iparam | int64 型で返す |
varptr() | 64bit環境ではポインタを int64 で返す |
dupptr | 第2引数(ポインタアドレス)を int64 で受け取る(64bitポインタ対応)。第4引数の型指定で vartype("int64") も使用可能 |
#deffunc / #defcfunc | パラメータ型に int64 を指定可能。戻り値も int64 対応 |
#func / #cfunc | パラメータ型に int64 を指定可能 |
dimtype | dimtype var, vartype("int64"), n で int64 配列を宣言可能 |
| DLL 戻り値 | #cfunc の戻り値が32bit範囲を超える場合、自動的に int64 で返す |
mref val, 0x40 | stat を int64 型として参照する |
| 変換元 | 変換先 | 動作 |
|---|---|---|
| int | int64 | 符号拡張 |
| int64 | int | 下位32bitに切り捨て |
| int64 | double | 浮動小数点に変換(精度253まで) |
| double | int64 | 整数部を取得 |
| int64 | str | 10進文字列に変換 |
| str | int64 | 10進 / 16進($, 0x)文字列をパース |
; 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
新しい変数型 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 動作 |
|---|---|---|
| 関数 | strlen | wcslen() で文字数を返す |
| 関数 | instr | wcsstr() で検索 |
| 関数 | strmid | wchar_t 部分文字列 (戻り値も wstr) |
| 関数 | strtrim | wchar_t トリム (戻り値も wstr) |
| 関数 | getpath | パス操作 (戻り値も wstr) |
| 命令 | strrep | wchar_t 文字列置換 |
| 命令 | split | wchar_t 分割 (出力変数も wstr) |
| 命令 | getstr | wchar_t 区切り読み取り |
| note | notesel/noteget/noteadd/notedel | wchar_t 行操作 |
| note | noteinfo/notefind | wchar_t 行カウント/検索 |
| note | noteload/notesave | UTF-16 LE バイナリ読み書き |
str と wstr の間は MultiByteToWideChar / WideCharToMultiByte で自動変換されます。
int/double との変換も wcstol / swprintf 等で対応済みです。
詳細は wstr 設計書 を参照してください。
intptr はプラットフォーム依存サイズの整数型で、x86 ビルドでは 32bit、x64 ビルドでは 64bit のスロットを使用します。
HANDLE や LPxxx 系のポインタ引数を含む DLL 関数を 1 つの HSP source で **両プラットフォーム共通** に書けます。
hsp3net 専用 (vanilla hsp3 では未サポート)。
従来は x86 / x64 で int / int64 を使い分ける必要があり、
ポインタ系の引数が出てくるたびに #ifdef __hsp64__ 等での切り替えが必要でした。
intptr を使えば 1 行で両対応できます。
| directive | 用途 |
|---|---|
#func | void 戻り値の DLL 関数 |
#cfunc | int 戻り値の DLL 関数 |
#cfuncd / #cfuncf | double / float 戻り値 |
#cfuncst | 構造体戻り値 |
#comfunc | COM メソッド呼出 |
#cbmethod | COM コールバックメソッド (後述) |
#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 HSP64 で code_geti64() または code_getdi() を使い分けて読む。
スロットサイズも platform に従う (x64=8 byte / x86=4 byte)。
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
int() / double() で変換してください"" が返ります (エラーにはなりません)mapkey() の列挙順序は 挿入順とは限りません (unordered_map のため)dim) との併用はできません。dimmap で作成した変数は MAP 専用ですvartype() は 12 (HSPVAR_FLAG_MAP) を返します| 命令 | 説明 |
|---|---|
loadnet | アセンブリをロードする。mode: 0=GAC短縮名, 1=GAC完全名, 2=ファイルパス, 3=C#ソース, 4=VBソース |
newnet | .NET クラスのインスタンスを生成する。static モード、ジェネリック型パラメータの自動検出に対応 |
delnet | .NET オブジェクトを解放する |
netres | メソッド戻り値の格納先変数を設定する |
tonet | HSP の値(int/double/str/int64)を .NET オブジェクト (netobj) に変換する |
enumnet | enum メンバーの値を取得する。第2引数に netobj 変数またはアセンブリ名文字列を指定可能 |
getforms | HSP ウィンドウ ID から WinForms の Form インスタンスを取得する |
pushnet | ネイティブポインタのスコープをプッシュする(メモリ管理用) |
popnet | スコープをポップし、自動的にポインタを解放する。引数で保持するポインタを指定可能 |
enablewpf | WPF 関連アセンブリ(PresentationCore等)をロードする |
neterror | .NET 例外のエラーモードを設定する。0=stat のみ(デフォルト), 1=HSP エラーとして throw |
nettoval | .NET オブジェクトを HSP の値型に変換する(関数形式)。Enum→int 変換、obj("$field") 式に対応 |
netexerr | 最後に発生した .NET 例外の情報を文字列で返す(関数形式) |
formsaddctrl | Form に .NET コントロールを追加する (0=Button, 1=CheckBox, 2=TextBox, 3=ComboBox, 4=ListBox)。GUI版のみ |
netdelegate | HSP ラベルを .NET デリゲートに変換する。EventHandler, Action 等に対応 |
netlinq | LINQ 操作を C# ラムダ式文字列で実行する (Where, Select, OrderBy 等) |
newcom, querycom, delcom, comres, comevent, comevarg, comevdisp, sarrayconv 等)と
文字コード変換命令(cnvstow, cnvwtos, cnvstoa, cnvatos)は HSP3 標準機能として引き続き利用可能です。
HSPVAR_FLAG_NETOBJ = 9 として登録されるユーザー定義型です。.NET オブジェクトへの参照を HSP 変数として保持します。
内部的には GCHandle によってネイティブポインタとして保持し、GC による回収を防ぎます。delnet または popnet のスコープ管理によって解放されます。
C++/CLI の管理クラス tv::hsp::net::Hsp3Net が .NET 連携の中核です。主要な機能:
newnet でアセンブリ名を指定する際、以下の順序で自動解決されます:
loadnet で明示ロードしたもの)AppDomain.CurrentDomain.GetAssemblies() からアセンブリ名で検索Assembly.LoadWithPartialName で動的ロードアセンブリ名に空文字列 "" を指定すると、ステップ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"
クラス名に `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
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"
netobj 変数の連想配列記法で $ プレフィックスを付けるとフィールドに、付けないとプロパティにアクセスします。
nettoval と組み合わせてフィールド値を直接取得可能です。
; フィールド読み取り
s = nettoval(pObj("$FieldName"), 2)
; フィールド書き込み
pObj("$FieldName") = "new value"
; プロパティアクセス($なし)
s = nettoval(pObj("Text"), 2)
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
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) → bool | return 0/1 で結果返却(Predicate等) |
コレクションに対して 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", ""
.NET オブジェクトのネイティブポインタを管理する静的クラスです。
CreateNativePtr() — GCHandle を確保してネイティブポインタを返すGetNativePtrToNetClass() — ポインタから NetClass を復元するFree() — GCHandle を解放するPushNativePtrCurrentStack() / PopNativePtrCurrentStack() — スコープベースの自動解放.NET の例外が発生した場合のエラー報告には2つのモードがあります。neterror 命令で切り替えます。
| モード | 動作 | 用途 |
|---|---|---|
neterror 0(デフォルト) | stat に -1 を設定するのみ。スクリプト実行は継続される | 個別にエラーを確認して処理する場合 |
neterror 1 | HSP エラー HSPERR_DOTNET_EXCEPTION (#45) を throw する。onerror で捕捉可能 | 例外を一括でハンドリングする場合 |
最後に発生した .NET 例外の情報を文字列で返す関数です。引数でモードを指定できます:
| 引数 | 返す内容 | 例 |
|---|---|---|
netexerr() または netexerr(0) | 例外メッセージ(Message プロパティ) | "型 'System.Foo' が見つかりません" |
netexerr(1) | 例外の型名(FullName) | "System.TypeLoadException" |
netexerr(2) | 詳細情報(ToString = メッセージ+スタックトレース) | デバッグ用の完全な情報 |
newnet pObj, "System", "System.NoSuchClass", 0
if stat = -1 {
mes "エラー: " + netexerr()
mes "例外型: " + netexerr(1)
}
neterror 1
onerror goto *err_handler
newnet pObj, "System", "System.NoSuchClass", 0
stop
*err_handler
dialog "例外: " + netexerr()
end
netexerr() は例外スタックからポップするため、呼び出すたびに次の例外が取得されます。
同じ例外の複数の情報(メッセージと型名など)が必要な場合は、変数に保存してから使用してください。
.NET プロパティ/フィールドへの代入時、以下の自動型変換が行われます:
Enum.ToObject() で自動変換; int → Enum の自動変換例
pEH("Dock") = 5 ; DockStyle.Fill (int → DockStyle 列挙型)
pBtn("FlatStyle") = 0 ; FlatStyle.Flat (int → FlatStyle 列挙型)
pChk("CheckState") = 1 ; CheckState.Checked
IronHSP では screen 命令で生成されるウィンドウは System.Windows.Forms.Form(HspForms2 クラス)です。
HSP の描画命令(mes, boxf, color 等)は HWND 経由の GDI 描画として Form 上にそのまま表示されます。
| HSP 命令 | 実際の動作 |
|---|---|
screen id, w, h | HspForms2 (Form) を生成。HWND = Form.Handle |
title "text" | Form.Text を設定 |
width w, h | MoveWindow → Form サイズ変更 |
hwnd | Form.Handle (IntPtr) を返す |
mes / boxf 等 | HWND 経由の GDI 描画 → Form クライアント領域に表示 |
HSP の GUI オブジェクト命令は、.NET の WinForms コントロールとして生成され、Form.Controls コレクションに自動的に登録されます。
| HSP 命令 | .NET コントロール | イベント |
|---|---|---|
button | System.Windows.Forms.Button | Click → WM_COMMAND (BN_CLICKED) |
chkbox | System.Windows.Forms.CheckBox | CheckedChanged → WM_COMMAND |
input | System.Windows.Forms.TextBox | TextChanged → WM_COMMAND (EN_UPDATE) |
mesbox | System.Windows.Forms.TextBox (Multiline) | TextChanged → WM_COMMAND (EN_UPDATE) |
combox | System.Windows.Forms.ComboBox | SelectedIndexChanged |
listbox | System.Windows.Forms.ListBox | SelectedIndexChanged |
.NET コントロールの Win32 コントロール ID は SetWindowLongPtr(GWLP_ID) で設定され、
HSP の既存の WM_COMMAND ベースのイベントルーティングがそのまま動作します。
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
HSP の button 等で作成したコントロールと、newnet + mcall で作成した .NET コントロールは
同一の Form 上で共存します。両方とも Form.Controls に登録されます。
winobj 命令は、従来通り CreateWindowEx を直接呼びます。
生成されたコントロールは Form の子ウィンドウとして動作しますが、Form.Controls には登録されません。SetWindowText 等の Win32 API 経由で動作するため、.NET コントロールでもそのまま使用可能です。
以下のシステム変数で、現在アクティブなスクリーン (gsel で選択中) の情報を取得できます。
| 変数 | 型 (32bit) | 型 (64bit) | 内容 |
|---|---|---|---|
hwnd | int | int64 | ウィンドウハンドル (HWND) |
hinstance | int | int64 | インスタンスハンドル (HINSTANCE) |
hdc | int | int64 | 描画バッファの DC (HDC) |
hdc はオフスクリーン描画バッファ (DIB Section) のデバイスコンテキストです。
HSP の描画命令 (mes, boxf, line 等) と同じ DC なので、
Win32 GDI API (BitBlt, TextOut 等) で直接描画すればスクリーンに反映されます。
getforms + CreateGraphics() + GetHdc() でも取得可能ですが、
この場合はウィンドウ DC (画面に直接描画) であり、HSP の描画バッファ DC とは異なります。
HSP の描画と統合するにはシステム変数 hdc を使用してください。
NuGet パッケージ等の外部 .NET ライブラリは loadnet (opt=2: ファイルパス) でロードして使用できます。
以下のライブラリで動作確認済みです。
| ライブラリ | バージョン | 確認項目 | 結果 |
|---|---|---|---|
| DockPanelSuite | 3.1.0 | DLL ロード / インスタンス生成 / Enum / プロパティ / Form 追加 | 全項目 PASS |
| Newtonsoft.Json | 13.0.3 | JObject.Parse / indexer / SerializeObject / JArray / ToString | 全項目 PASS |
| NAudio | 2.2.1 | WaveFormat / 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.dll が自動的に参照に追加されます(.NET Framework 4.7.2 以降に同梱)。loadnet (opt=3/4) で C#/VB をコンパイルする際、参照 DLL のファイル名は
ロード済みアセンブリの Location パスに自動解決されます。
IronHSP のコンパイラ (hspcmp) に追加された言語拡張機能です。構造体定義、DLL 関数の戻り値拡張、COM コールバック、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
#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 | 定義の終了 |
int x) は廃止されました。
構造体メンバは必ず #field ディレクティブで宣言してください。
共用体サブブロックは #defunion ~ #endunion で記述します。
| 型名 | サイズ | 備考 |
|---|---|---|
byte | 1 byte | 8bit 符号なし整数 (BYTE) |
short | 2 bytes | 16bit 整数 (SHORT / WORD) |
int | 4 bytes | 32bit 整数 (INT / DWORD / LONG) |
int64 | 8 bytes | 64bit 整数 (LONGLONG) |
intptr | 4/8 bytes | プラットフォーム依存サイズ整数 (32bit=4, 64bit=8)。HANDLE, HWND, ポインタ等に使用。#func / #cfunc の intptr 型と同名・同義 |
| 型名 | サイズ | 備考 |
|---|---|---|
float | 4 bytes | 単精度浮動小数点 (FLOAT) |
double | 8 bytes | 倍精度浮動小数点 (DOUBLE) |
| 型名 | サイズ | 備考 |
|---|---|---|
bool | 4 bytes | Win32 BOOL (TRUE=1, FALSE=0) |
bool1 | 1 byte | C/C++ bool |
bool2 | 2 bytes | VARIANT_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 命令を使います。
内部では 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 ; 配列要素のメンバアクセス
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(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 は文脈で動作が変わります:
#defunion 名前 ... #endunion: 共用体型を定義 (名前は varsize() や型として参照可能)#defstruct 内 — #defunion ... #endunion (名前なし): 構造体内のサブ共用体ブロック。
ブロック内の全メンバが同じオフセットを共有します。#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
#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 つを値渡し
同じ C 構造体でも、関数によって「値渡し」と「ポインタ渡し」のどちらで宣言されているかが異なります。
#func 宣言では パラメータ型キーワードで明示的に指定 します:
| C 側のシグネチャ | HSP の #func 宣言 | 呼び出し例 |
|---|---|---|
void f(VECTOR v)(構造体の値渡し) | #func global f "f" VECTOR | f myvec — 12 バイトを直接展開 |
void f(VECTOR *v)(ポインタ渡し / out 引数) | #func global f "f" var | f myvec — 変数のアドレスを渡す |
void f(int n) | #func global f "f" int | f 42 |
判断基準:
VECTOR v と書かれている) → VECTOR 等の構造体名を指定VECTOR *v や VECTOR &v) → 従来通り var を指定DxLib のように構造体値渡しが多用される API では VECTOR, MATRIX などを直接書きます。
逆に Win32 API の GetWindowRect(HWND, LPRECT) のように out 引数として構造体ポインタを取る関数は int, var のままです。
var と宣言してしまうと、
ポインタの 4/8 バイトしかスタックに積まれず、構造体の残りバイトが読まれずに ABI が破綻して動作不定になります。
DxLib の auto-generated hspdxlib.as はこの罠を避けるため、ヘッダの自動生成時に
構造体値渡しの関数を全て VECTOR, VECTOR 等として展開してあります。
PP_ReplaceStructParamNames() が #func 行のパラメータリスト中の構造体名を
svalN (N = サイズ) に置換。マクロ展開で VECTOR → 12 に化けるのを防ぎます。GetParameterTypeCG() が svalN を MPTYPE_STRUCTVAL (-23) として認識し、
STRUCTPRM->subid に N を格納。code_expand_next() の MPTYPE_STRUCTVAL ハンドラ (hsp3extlib.cpp) が
上記の x86/x64 ABI に従ってバイト列を展開。HSP コンパイラ (hspcmp) とランタイム (hsp3) の連携で構造体を処理しています。 プリプロセッサ段階・コード生成段階・実行段階のそれぞれで以下の処理が走ります:
#defstruct / #defunion — 構造体定義テーブル cg_structdefs にエントリを追加。
ブロックレベルカウンタ pp_defstruct_level を増加。#field 型 名前 — PP_StructMember() でメンバを解析し、
pack を考慮したオフセットを計算して cg_structdefs.back().members に追加。#defunion (名前なし) / #endunion — pp_union_base_offset を保存し、
ブロック内のメンバが同一オフセットを共有するように制御。#endstruct — アライメント切り上げで total_size を確定し、
構造体名を LAB_TYPE_PPVAL として登録 (値 = 構造体サイズ)。
これにより VECTOR という識別子はマクロ展開で 12 に展開されます。PP_DetectStructDim() — stdim v, STRUCT 行を検出して
pp_var_structid マップに変数 → 構造体ID を記録。PP_DetectCfuncstAssign() — v = SomeCfuncstFunc() 行を検出して、
v を構造体型の変数として pp_var_structid に登録 (メタデータのみ、テキストは書き換えない)。PP_RewriteVarsizeStruct() — varsize(STRUCTNAME) を整数リテラルに置換
(文字列リテラル内・コメント以降はスキップ)。PP_ExpandStructAccess() — v->x パターンを _struct_peek(v, offset, type, struct_size)
または _struct_poke v, offset, type, struct_size, member_size, value 形式に展開
(オフセットはコンパイル時に解決)。PP_ReplaceStructParamNames() — #func / #cfunc / #cfuncst 行のパラメータリスト中の
構造体名を svalN (N = 構造体サイズ) に置換。マクロ展開で構造体名が数値に化けるのを防ぎます。stdim 命令 → opcode 0x22 として出力。第 1 引数 = 変数、第 2 引数 = サイズ (バイト)、第 3 引数 = 要素数。v->x 書き込み (CG case 0x65) → _struct_poke 内部命令を生成。v->x 読み取り → PP 段階で展開済みの _struct_peek() 関数呼び出し。HSPVAR_FLAG_NSTRUCT (= 11) 専用変数型。
pval->len[0] に 1 要素のバイトサイズ、pval->pt に生バイト列を保持。stdim opcode は HspVarCoreDispose + 直接 PVal 構築 + Alloc で
指定サイズ × 要素数を calloc。_struct_poke / _struct_peek は pval->pt + (aptr * struct_size) + member_offset
に対する型付きアクセス。v1 = v2) は標準の '=' ハンドラ経由で
HspVarNstruct_Set() が memcpy(dst, src, len[0]) を実行。#cfuncst の戻り値も HSPVAR_FLAG_NSTRUCT として返ります (詳細は次章)。標準 HSP の #func / #cfunc に加え、IronHSP では戻り値の型に応じた拡張ディレクティブを提供します。
| ディレクティブ | 戻り値型 | DLL の戻り値 | 追加バージョン |
|---|---|---|---|
#func | なし (stat に int 格納) | EAX / RAX → stat | 標準 HSP |
#cfunc | int / int64 | EAX / RAX | 標準 HSP |
#cfuncd | double (実数) | x87 FPU / XMM0 | IronHSP |
#cfuncf | float → double に変換 | x87 FPU / XMM0 | IronHSP |
#cfuncst | NSTRUCT (構造体) | 隠しポインタ経由 | IronHSP |
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 を使用してください。
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 キーワードで宣言します。double とは異なる 4 バイト幅で渡されます。
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 の定義からサイズが自動取得されるため、手動指定が不要HSPVAR_FLAG_NSTRUCT 型として返るため、
標準の '=' 代入経路 (HspVarCoreClearWC + Set) で自動的にコピーされるstrmid(...) の戻り値が代入先変数を自動的に文字列型にするのと同じ要領で、
v = GetCameraTarget() だけで v は自動的に構造体型として確保される (事前の stdim 不要)vec->x のようなメンバアクセスが可能
(PP_DetectCfuncstAssign が変数 → 構造体ID メタデータを記録するため)#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 紐付けはないので -> アクセスはできない
; (構造体名指定の新構文を推奨)
PP_Cfuncst() が #cfuncst ディレクティブを認識し、STRUCTDAT_OT_RETSTRUCT (0x30) フラグを otindex に設定MPTYPE_SRET (-22) の STRUCTPRM を生成。subid フィールドに構造体サイズを格納pp_cfuncst_structid マップに 関数名 → 構造体ID を記録#cfunc と同じ処理code_expand_and_call() が STRUCTDAT_OT_RETSTRUCT フラグを検出sret_buffers[16][4096]) からスロットを確保し、ゼロ初期化code_expand_next() で MPTYPE_SRET を処理 — バッファポインタを隠し第 1 引数としてパラメータ配列に挿入 (ユーザー入力は読まない)call_extfunc() で DLL 関数を呼び出し — x86/x64 とも既存アセンブリがそのまま動作hspctx->stat に格納reffunc_dllcmd() が RETSTRUCT を再検出し、hsp_nstruct_pending_size に構造体サイズを書き込む。
*type_res = HSPVAR_FLAG_NSTRUCT として sret_buffer のポインタを返すcode_get → StackPush → HspVarCoreClearWC → Set) が
HspVarNstruct_GetSize / HspVarNstruct_Alloc 経由でヒントを参照し、
代入先変数を NSTRUCT として正しいサイズで確保 → memcpy'=' ハンドラの末尾でヒント (hsp_nstruct_pending_size) をクリアHSPVAR の GetSize(PDAT*) は要素サイズしか返せない API ですが、構造体は型ごとにサイズが異なるため、
グローバル変数 int hsp_nstruct_pending_size をヒントとして使います。
これは strmid() が strsize 経由で文字列長を伝達するのと同様の仕組みです。
| 段階 | 動作 |
|---|---|
1. reffunc_dllcmd | hsp_nstruct_pending_size = struct_size をセット |
2. HspVarNstruct_GetSize | ヒント値を返す (StackPush のサイズになる) |
3. HspVarNstruct_Alloc | pval->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 呼び出しは新しいスロットを確保(sret_ring_index++, sret_depth++)sret_depth--sret_depth == 0)に戻った時点で sret_ring_index = 0 にリセット → 全スロット解放HSPERR_STACK_OVERFLOW エラー#cfuncst の戻り値ポインタは一時バッファへの参照です。次の最外レベル #cfuncst 呼び出しで再利用されます。結果を保持するには dupptr や memcpy で即座にコピーしてください。
#cfuncst は #cfunc と同じパラメータ型キーワードが使えます:
| 型キーワード | 用途 | DLL 側の型 |
|---|---|---|
int | 整数 | int, DWORD, BOOL 等 |
float | 単精度浮動小数点 | float |
double | 倍精度浮動小数点 | double |
str | ANSI 文字列 | const char* |
wstr | Unicode 文字列 | const wchar_t* |
var | 変数アドレス(構造体ポインタ等) | void*, VECTOR* 等 |
int64 | 64bit 整数 | int64_t, LONGLONG |
intptr | プラットフォーム依存サイズ整数 | INT_PTR, HANDLE, SIZE_T 等 (x86=32bit / x64=64bit) |
| ディレクティブ | 戻り値型 | DLL の戻り値 |
|---|---|---|
#func | なし (stat に格納) | int → stat |
#cfunc | int / int64 | EAX / RAX |
#cfuncd | double | FPU / XMM0 |
#cfuncf | float | FPU / XMM0 |
#cfuncst IronHSP | NSTRUCT (構造体) | 隠しポインタ経由で構造体バッファに書き込み → NSTRUCT として代入先に memcpy |
...) IronHSPC の 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 変数 | int | 4/8 byte (x86/x64) |
123L、int64 変数 | int64 (intptr) | 8 byte — ポインタやハンドルの受け渡しにも使用可 |
3.14、double 変数 | double | 8 byte (ビットパターンを整数レジスタ経由で渡す) |
"abc"、str 変数 | str | char* ポインタ (UTF-8 → ローカルバッファにコピー) |
L"abc"、wstr 変数 | wstr | wchar_t* ポインタ (UTF-16 → ローカルバッファにコピー) |
float 引数は ABI 規約により自動的に double に昇格されます (default argument promotion)。そのため HSP 側で特別な対応は不要で、double として渡せば正しく動作します。DLL 側のフォーマット文字列では %f を使用してください。
... はパラメータリストの末尾にのみ記述可能 (C 言語と同じ制約)#func (命令版) と #cfunc (関数版) の両方で使用可能IDropTarget や IBindStatusCallback のように
HSP 側で実装して外部 COM API に渡す COM コールバックインターフェースを宣言・実装するための言語拡張。
hsp3net 専用。
IUnknown の QueryInterface / AddRef / Release は runtime が自動実装するので、
ユーザーは vtable index 3 以降の実メソッドだけを HSP ラベルにマッピングすればよい。
動的 vtable トランポリンは x86 / x64 両対応。
#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 を発行 |
| 型 | 用途 | 備考 |
|---|---|---|
int | 32bit DWORD / BOOL / enum | |
int64 | 明示的 64bit | LARGE_INTEGER 等 |
intptr | platform-sized pointer | HANDLE / 構造体ポインタ等 |
comobj | IUnknown 派生インターフェース | auto wrap (callback 終了で auto release) |
wstr | LPCWSTR | SJIS 自動変換 |
str | LPCSTR | |
double / float | 浮動小数点 | XMM 経由 |
| 関数 | 戻り値 | 説明 |
|---|---|---|
comprm(N) | 宣言型に応じる | 現在 callback の N 番目 (0-origin) の user 引数を取得。#cbmethod で宣言した型に従ってマーシャリング |
comcbidx() | int | 呼ばれたメソッドの vtable index |
comcbtag() | int | newcomcb 時に指定した int tag |
comcbtags() | str | newcomcb 時に指定した str tag |
comcbis(comobj_var) | int | 引数の comobj 変数が現 callback の this と一致なら 1 |
comcbthis() | intptr | raw IUnknown* (advanced 用途) |
comret val | (命令) | HRESULT 戻り値を明示セット (省略時 0 = S_OK) |
newcomcb var, "CLASS" [, tag] | (命令) | callback クラスのインスタンス生成 |
comcbtag() 等の関数は 必ず () 付きで呼ぶこと。
括弧なしで呼ぶと cmdfunc_dllctrl の statement 経路に流れて syntax error になる。
#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
VirtualAlloc(PAGE_EXECUTE_READWRITE) で生成し、
COM 呼び出し時に rcx/rdx/r8/r9 + stack 引数を HspCbComMethodThunk::args[] にコピーして
hsp_cbcom_bridge 経由で HSP ラベルに dispatch。newcomcb の class name 引数は現状 string literal のみ対応。
IronHSP のランタイムに追加されたコア機能です。ネイティブコールバックによる関数ポインタ生成と、環境変数・コマンドライン引数の組み込みサポートを提供します。
Win32 API には EnumWindows, EnumFontFamiliesEx, SetTimer, qsort など、C 関数ポインタをコールバックとして受け取る API が多数存在します。バニラ HSP ではこれらを直接呼ぶ手段がありませんでしたが、IronHSP の setcallback 命令を使うと HSP のラベルを C 関数ポインタに変換 でき、任意のコールバック API を利用できます。
.NET は不要で、hsp3net の全ランタイム (GUI / CL / 32bit / 64bit) で動作します。
| 命令/関数 | 書式 | 説明 |
|---|---|---|
setcallback | setcallback var, *label, argcount |
*label を呼び出す C 関数ポインタを動的に生成し、var に格納する。argcount: コールバックが受け取る引数の数 (0〜16、デフォルト 2)。32bit ビルドでは var は int 型、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 で停止です。
; 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 → 停止
; 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
; 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
setcallback は VirtualAlloc(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_bridge | mov rcx, thunk; mov rax, hsp_thunk_bridge; call rax |
| 戻り値取得 | call hsp_thunk_getstat → EAX | call 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) です。浮動小数点の戻り値が必要なコールバックには対応していません。VirtualAlloc で確保され、プロセス終了時に自動解放されます。明示的な解放 API はありません。
バニラ HSP には環境変数操作やコマンドライン引数の構造化パースが存在しません。IronHSP では以下の命令・関数を組み込みで提供しています。全て UTF-8 で処理され、日本語を含むパスや値も正しく扱えます。
| 命令/関数 | 書式 | 説明 |
|---|---|---|
setenv | setenv "KEY", "VALUE" | 環境変数を設定。内部で MultiByteToWideChar(CP_UTF8) → SetEnvironmentVariableW を呼ぶ。 |
delenv | delenv "KEY" | 環境変数を削除 (SetEnvironmentVariableW(key, NULL))。 |
getenv() | v = getenv("KEY" [, "default"]) | 環境変数の値を取得。未定義の場合はデフォルト値 (省略時 "") を返す。内部で GetEnvironmentVariableW → WideCharToMultiByte(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)。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 を経由した自動生成パイプラインで
体系的に再構築した。
| 項目 | 旧 (手書き) | 新 (CsWin32 bridge) |
|---|---|---|
| カバー DLL 数 | 10〜15 (部分) | 51 DLL |
| 関数数 | 数百 | 6020 関数 |
| COM インターフェース | 0 | 118 interface / 1238 method |
| 構造体 (NSTRUCT) | 未対応 | 734+ 構造体を自動 #defstruct |
| 定数 enum | 手書きで一部 | 608+ enum 群 (SW_*/SM_*/WS_*/MB_*/...) を自動 #define 完全展開 |
| A/W 自動選択 | 手書きで明示 | 自動 (CreateFileW, MessageBoxW, RegOpenKeyExW 等) |
| 型マッピング | すべて sptr | HWND→intptr / PCWSTR→wstr / LPRECT→var / enum→int |
| 日本語 MSDN ヘルプ | なし | 約 28000 entries 翻訳済 (Phase E/F の +1682 関数分は次回翻訳予定。常体 MSDN-JP 準拠) |
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)
dump_exports.py: C:\Windows\System32\*.dll を dumpbin /exports で走査 → 5631 候補抽出 → NativeMethods_full.txtNativeMethods.txt として配置 → dotnet build -c Release で CsWin32 が obj/generated/.../*.g.cs に C# P/Invoke 署名 + XML doc コメントを emitfilter_unsupported.py: PInvoke001 / 003 / 005 警告から非対応 API を // removed: <reason> でコメントアウト (削除せず audit 用に残す)gen_from_cswin32.py: C# を regex parse → 型マッピング → <dll>_gen2.as + win32_<dll>_gen2.hs を SJIS / CRLF で emit、docs_en.json も dumpsplit_for_translation.py で per-DLL チャンク化 → 並列 subagent で翻訳 → merge_translations.py で docs_ja.json に集約docs_ja.json をルックアップして日本語版 .hs を出力初期は libclang Python binding で Windows SDK ヘッダを直接 parse する案 (tools/gen_winapi_as.py) を検討したが、以下の理由で CsWin32 経由に切り替えた:
cursor.type.spelling で HWND が int に脱糖される (token hack で回避は可能だが脆弱)。CsWin32 は型情報を完全に保持#define MessageBox MessageBoxW を追跡する必要があるが、win32metadata は最初から W バリアントを別エントリで持っている#define SW_HIDE 0 系を全部マクロ展開で拾う必要があるが、win32metadata は SHOW_WINDOW_CMD enum として整理済みapi-docs.msgpack 経由で MSDN の関数 / 引数 / 戻り値説明を XML コメントとして埋め込む。これがそのまま .hs ファイルの源泉になるallowMarshaling=true モードで [ComImport] 属性付き C# interface を生成 → #usecom / #comfunc 形式に変換可| カテゴリ | DLL | 関数数 |
|---|---|---|
| ベース (大規模) | kernel32 | 881 |
| user32 | 606 | |
| advapi32 | 419 | |
| oleaut32 | 404 | |
| ベース (中規模) | gdi32 | 384 |
| crypt32 | 218 | |
| shell32 | 195 | |
| wininet | 192 | |
| マルチメディア / OLE / デバッグ | winmm | 146 |
| ole32 | 143 | |
| dbghelp | 128 | |
| comctl32 | 94 | |
| UI / IME / DWM | uxtheme | 77 |
| imm32 | 63 | |
| dwmapi | 31 | |
| セキュリティ | bcrypt | 53 |
| userenv | 34 | |
| wintrust | 7 | |
| ネットワーク | winhttp | 46 |
| netapi32 | 45 | |
| ws2_32 | (未対応) | |
| システム | psapi / version / shlwapi / msimg32 / comdlg32 他 | ~50 |
| bonus (依存解決) | ncrypt / normaliz / propsys | 27 |
| 合計 | 51 DLL | 6020 関数 |
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)。
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:
IShellLinkW, IPersistFile, IModalWindow, IFileDialog, IFileOpenDialog, IFileSaveDialog, IShellItem, IShellItemArray, IFileDialogEventsIDropTarget, IDropSource, IDataObject, IEnumFORMATETCIBindStatusCallback, IBindCtx, IMoniker, IRunningObjectTable, IPersistFile, IPropertyStore, IPropertyDescriptionList, IStreamID2D1Factory, ID2D1RenderTarget, ID2D1HwndRenderTarget, ID2D1BitmapRenderTarget, ID2D1Bitmap, ID2D1SolidColorBrush, ID2D1LinearGradientBrush, ID2D1RadialGradientBrush, ID2D1Geometry, ID2D1PathGeometry, ID2D1RectangleGeometry, ID2D1RoundedRectangleGeometry, ID2D1EllipseGeometry, ID2D1StrokeStyle 等IDWriteFactory, IDWriteTextFormat, IDWriteTextLayout, IDWriteFontCollection, IDWriteFontFamily, IDWriteFont, IDWriteFontFace, IDWriteTextAnalyzer, IDWriteInlineObject 等IWICImagingFactory, IWICBitmap, IWICBitmapSource, IWICBitmapDecoder, IWICBitmapFrameDecode, IWICBitmapEncoder, IWICBitmapFrameEncode, IWICFormatConverter, IWICStream, IWICBitmapLock, IWICBitmapClipper, IWICBitmapScaler, IWICColorContext, IWICPalette 等IDXGIFactory, IDXGIAdapter, IDXGIDevice, IDXGISwapChain, IDXGIOutput, IDXGISurfacecomdlg32 の OPENFILENAMEW 系構造体は AnyCPU 非互換 (PInvoke005) で GetOpenFileName / GetSaveFileName / ChooseColor / ChooseFont / PrintDlg は生成不可 → 代替として IFileOpenDialog / IFileSaveDialog COM インターフェースを使う想定POINTL など 8byte 値渡し構造体は COM パーサが現状 int にフォールバック (将来 intptr 経由で対応予定)ws2_32) は sockaddr 系の union 多用構造体が特殊で未対応d3d11 / d3d12 / xaudio2 等の重量級 COM 階層は今回は対象外 (Direct2D / DirectWrite / WIC / DXGI のみ)IronHSP が提供する 151 個の iron_* モジュール、31 個の C++ プラグイン DLL、hspd2d / DxLib / OpenCV 統合 の詳細は別ドキュメントに記載しています:
iron_modules_intro.html — モジュール & プラグイン リファレンス
stat, iparam, wparam, lparam が int (4byte) から int64_t (8byte) に変更されたため、HSPCTX 構造体のメンバーオフセットが変わっています。
mref val, 0x44 で HSPCTX を直接参照しているプラグインやスクリプトは、オフセットの再計算が必要mref val, 0x40 (stat) は int64 型として正しく参照されるよう修正済み2147483647 + 1 は int 同士の演算なのでオーバーフローして -2147483648 になる2147483647L + 1 は int64 と int の演算なので正しく 2147483648 になるTYPE_INUM64 = 19 として参照されるL"..." リテラルを含む .ax は従来のランタイムでは実行できないstrf は現状 wstr 非対応(wstr 引数は自動的に str に変換される)L"..." の変換は CP_ACP で行われる。32bit版はSJIS、64bit版はUTF-8前提notesave で wstr バッファを保存すると UTF-16 LE バイナリとして出力される(BOM なし)HSPUTF8 + CharacterSet=Unicode)#ifdef __hsp64__ で DLL名を分岐(例: hspext.dll → hspext64.dll)hwnd, hinstance, hdc は 64bit 環境で int64 型を返す(HWND/HINSTANCE/HDC はポインタサイズ)#deffunc / #defcfunc は #module ~ #global で囲む必要がある変数名@ の記法を使用するnettoval は関数形式で使用する: s = nettoval(net_var, type)2 = str, 4 = int, 3 = doublenettoval s, net_var) では使用できないnettoval(obj("$field"), 2) に対応Convert.ToInt32 等で変換)System.Object は mscorlib アセンブリに属するため、newnet p, "System", "System.Object", 0 では見つからない場合がある"" を指定するとクラス名で自動検索される(推奨)loadnet で明示的にアセンブリをロードすれば、そのアセンブリ名で検索可能mes pObj で直接表示可能(内部で ToString() が呼ばれる)s = "" + pObj — ToString() の結果が使われるConvert.ToInt32() で変換可能な場合のみ(それ以外は 0)Convert.ToDouble() で変換可能な場合のみ(それ以外は 0.0)tonet 命令で HSP の値(int/double/str/int64)を netobj にラップ可能従来の #cfunc では DLL 関数の戻り値を整数としてのみ扱えましたが、
#cfuncd(double)/ #cfuncf(float)を使うことで浮動小数点の戻り値を正しく取得できます。
| プリプロセッサ命令 | 戻り値の型 | 用途 |
|---|---|---|
#cfunc | int / int64 | 整数を返す DLL 関数(従来互換) |
#cfuncd | double | double を返す DLL 関数 |
#cfuncf | float → double | float を返す 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 を使用してください。
| 日時 | コミット | 内容 |
|---|---|---|
| 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:13 | 3649f02b | 新機能 #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:00 | 55eacc14 | 新機能 hspcmp: Allman ブレーススタイル (改行 {) をサポート: if / else / else:if の後に { を次行に置く記法を許容。GenerateCodeBlock() の TK_EOL 処理で次行先頭が { かを先読みし、単行 if の即時クローズをスキップして SCOPE モードへ移行。既存の同一行 { パターンには一切影響なし。15 パターンのコンパイル+実行テスト済み |
| 4/16 07:22 | c3a26226 | バグ修正 hspd2d d2d_drawtext の絵文字末尾文字化け修正: strlen(text) は UTF-8 バイト数を返すため、サロゲートペア絵文字を含む文字列で ID2D1RenderTarget::DrawText の stringLength が過大になり、未初期化メモリが末尾に描画されていた。MultiByteToWideChar(CP_UTF8, -1) で UTF-16 コードユニット数を算出して渡すよう修正 |
| 4/16 07:21 | 53b63972 | バグ修正 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:06 | deb148bd | リファクタ 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〜05 | 4c6b7f80 / 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:07 | c3a4eb78 | 新機能 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:00 | c6e15488 | インフラ 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:44 | 7bc95bf2 | 改修 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:43 | 3c4fd3d8 | 改修 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:42 | a3ea7d05 | 改修 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:41 | e69627d8 | 新機能 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:40 | 8da9880c | 改修 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:38 | b71ef7b9 | 新機能 / ドキュメント 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:37 | 32fb2c5b | 新機能 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:36 | 0fce7424 | 新機能 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:35 | 131c5902 | ドキュメント README.md + docs/IronHSP_specification.html を本セッション全成果に追従更新 (第 1 回) |
| 4/14 20:34 | ec3a570f | 新機能 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:33 | 58fc0b05 | 新機能 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:32 | 8a12302b | 新機能 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:31 | df1cf228 | 新機能 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:30 | c9723196 | 新機能 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:29 | a2eac105 | 新機能 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:28 | c667f77a | ドキュメント 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:27 | 84dc6e4d | ドキュメント 新規 DLL の日本語ヘルプ追加: hspjson.hs (10 命令), hspmcp.hs (7 命令), hspmfcam.hs (18 命令、Phase 2 で先行追加済) |
| 4/14 20:26 | 82e8f094 | 新機能 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:25 | aee3b832 | 新機能 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:24 | d89da696 | 新機能 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:23 | 174db403 | 新機能 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:22 | 195c59da | 新機能 iron_camera_mf.hsp ハンドルベース API + dual-cam サンプル。iron_cam_open がハンドル返却、最大 256 並列。sample_camera_mf_dual.hsp で 2 カメラ同時プレビュー |
| 4/14 20:21 | 9a655566 | 新機能 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:20 | ad8f0332 | 新機能 iron_camera.hsp: hspcv4 の cv4_video_open/cv4_video_read を 1 行 API でラップした Webcam モジュール。OpenCV 内部で MSMF を使うため結果として MF backend。FPS 表示 + S スナップショット保存サンプル付き |
| 4/14 20:19 | cf13d865 | 新機能 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:18 | 6051ac4d | 新機能 iron_toast.hsp: Shell_NotifyIconA + NOTIFYICONDATAA 構造体手組みでタスクトレイバルーン通知。Win10/11 ではトースト風表示。toast / toast_warning / toast_error / toast_clear の 4 命令 |
| 4/14 20:17 | 69ca49e8 | バグ修正/新機能 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:16 | 9b1569e0 | 新機能 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:15 | 15d9ec86 | 新機能 Phase H: 自前 JSON 読み書きプラグイン hspjson.dll + iron_json.hsp モジュール。サードパーティ依存ゼロ (300 KB)、JSONPath-like パスで値取得・配列ループ・型判定・整形/minify。10 命令 |
| 4/14 | 4a1cd689 | 新機能 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/14 | dc7f9ddc | 新機能 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/14 | 92722d93 | 新機能 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.py の LEGACY_LOWER_PREFIXES に gl/wgl/glu を追加 (OpenGL 関数は小文字始まり慣例)。累計 35 → 51 DLL / 4733 → 6020 関数 |
| 4/14 | 31765549 | 新機能 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.py の PInvoke005 警告処理を line-number lookup ベースに修正 (90 件追加コメントアウト)。累計 23 → 35 DLL / 4338 → 4733 関数 |
| 4/14 | ea6ebc39 | バグ修正 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/14 | e2406644 | バグ修正 OpenMutex / OpenSemaphore / SetEnvironmentStrings / IsCharLower の 4 API は win32metadata の複数 namespace に同名が存在し CsWin32 が CS8785 で source generator ごと crash する問題を解決。NativeMethods.txt に fully-qualified name (Windows.Win32.System.Threading.OpenMutex 等) を指定して個別に復活 |
| 4/14 | 21b72511 / 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/14 | 383ab46c | 新機能 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/14 | 4cce6e7d | バグ修正 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/14 | 3680c4b7 / 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 して、HWND→intptr / PCWSTR→wstr / 構造体ポインタ→var / enum→int 等にマップして .as 出力。A/W バリアント自動選択 (CreateFileW / MessageBoxW 等)、定数 enum 群 (SW_* / SM_* / WS_* / MB_*) 完全展開。cswin32_bridge_com/ 側は allowMarshaling=true で COM インターフェース ([ComImport]) を生成し #usecom + #comfunc 形式に変換 |
| 4/14 | 0c4750d5 | 新機能 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/13 | 16b50129 / 813e0ce1 | 新機能 hspcv4 Phase 27: highgui Trackbar / mouse events / FreeType による日本語フォント描画 (FreeType + HarfBuzz via vcpkg) を本実装 |
| 4/13 | b91186e9 | 新機能 COM コールバック Phase B3: IBindStatusCallback サンプルで URLDownloadToFile 経由の e2e 動作確認 (HSP 側で実装した COM コールバックが外部 COM API から正しく invoke される) |
| 4/13 | 90e9bdb1 | 新機能 COM コールバック Phase B2: bytecode emission + runtime opcodes (newcomcb / comprm / comcbtag / comcbtags / comcbis / comcbthis / comcbidx / comret) |
| 4/13 | 6b1d2541 | 新機能 COM コールバック Phase B1: hspcmp に #defcbcom / #cbmethod / #endcbcom パーサ追加 |
| 4/13 | 7cbef99b | 新機能 COM コールバック Phase B0: vtable allocator + IUnknown 自動実装 + 動的 thunk + bridge dispatcher (runtime 基盤) |
| 4/13 | 70a76926 | 新機能 intptr 型を hsp3net + hspcmp に追加。プラットフォーム依存サイズ整数 (x86=32bit / x64=64bit)。#func / #cfunc / #cfuncd / #cfuncf / #cfuncst / #comfunc / #cbmethod 全 DLL 系で使用可 |
| 4/13 | b27f3b09 | 新機能 hspd2d Phase 3: 複数フォント対応 + D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT による 色付き絵文字レンダリング |
| 4/13 | be451a92 | 新機能 hspd2d Phase 2: d2d_font / d2d_drawtext / d2d_image_save 動作確認 + local 宣言追加で安定化 |
| 4/13 | c3e07e41 | 新機能 hspd2d: DirectWrite + Direct2D + WIC を pure HSP の COM 機能だけで wrap した 2D 描画モジュール (Phase 1 PoC) |
| 4/13 | 3436d4e4 / 7ecdea9f | 整理 NSTRUCT / #cfuncst / setcallback を hsp3net 専用に集約。hsp3 (vanilla) からは削除し、文法を拡張する系は hsp3net のみ持つ役割分担に |
| 4/13 | 908aca8b | バグ修正 hsp3/hsp3net: x64 COM #comfunc dispatch のバグ (vtable indexing が 4 byte 単位で誤動作) と newcom -1 で 64bit ポインタが切り詰められる問題を修正 |
| 4/12 | DxLib 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/12 | DxLib hspdxlib: DxLibW ヘッダ自動生成 (2,548関数 + 901定数 + 55構造体) | |
| 4/11 | d1e4fae4 | setcallback/callbackarg: ネイティブコールバック関数ポインタ (x86 stdcall / x64 fastcall thunk動的生成) |
| 4/11 | mcall: ジェネリックメソッド型パラメータ指定 ("Method<Type>" 構文) | |
| 4/11 | netlinq: LINQ操作のC#ラムダ式文字列実行 (Where, Select, OrderBy, First, Count等) | |
| 4/11 | netdelegate: HSPラベル→.NETデリゲート変換 (EventHandler, Action, Predicate対応) | |
| 4/11 | hwnd/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/11 | b87295f5 | wstr Phase 3-5: 文字列関数/命令/note系 + 64bitビルド対応 + プラグイン64bit化 |
| 4/11 | 8d770d0c | wstr (UTF-16) Phase 1-2: 変数型 + L"..." リテラル |
| 4/11 | 62878cbc | 構造体/共用体サポート (#defstruct/#defunion) |
| 4/10 | Phase 12 #cfuncd/#cfuncf (double/float戻り値DLL)、callfuncd/callfuncf追加 | |
| 4/10 | Phase 11 CnvCustom実装、tonet実装、objprm .NET対応、InvokeMethod Enum変換、enablewpfエラーチェック | |
| 4/10 | Phase 10 .NET 例外処理: neterror/netexerr 追加、Enum 自動変換 | |
| 4/11 00:00 | 46f627ec | Phase 9 GUI オブジェクトを .NET コントロールに置換、Form.Controls 統合 |
| 4/10 23:30 | b03f3c0a | Phase 8 アセンブリ自動解決、hsp3cl NETOBJ登録 |
| 4/10 23:00 | c3a136ae | Phase 7 hsp3cl .NET対応、DLL戻り値自動int64、mref修正、v4.8 |
| 4/10 22:30 | edb1dfda | Phase 6 #defcfunc 戻り値 + DLL 戻り値 int64 + hsp3cl 対応 |
| 4/10 22:00 | 3ee4970b | Phase 5 #deffunc/#func の int64 パラメータ対応 |
| 4/10 21:30 | 452d10ee | Phase 4 hspcmp: int64 リテラル(Lサフィックス、自動昇格) |
| 4/10 21:00 | dbc1c3ee | Phase 3 int64()/dim64/qpeek/qpoke + varptr/dupptr 64bit対応 |
| 4/10 20:30 | baa389e5 | Phase 2 システム変数 stat/wparam/lparam/iparam の int64 化 |
| 4/10 20:00 | e284b003 | Phase 1 int64 変数型の基盤追加 |
| 4/10 19:30 | 7576902e | ビルド修正: v143化、CLR対応、charset設定、マージミス修正 |
| 4/10 19:00 | 51f7a621 | hsp3net を 3.7 ベースに更新(87ファイル置換 + 6ファイル 3-way merge) |
| 4/10 18:30 | ca517453 | 3.7 を master にマージ(3-way merge) |
| 4/10 18:00 | a61b1f32 | OpenHSP 3.7 (SVN r1616) をインポート |
| ターゲット | 32bit 出力名 | 64bit 出力名 | 状態 |
|---|---|---|---|
| ランタイム (GUI) | hsp3.exe | hsp3_64.exe | 既存 |
| ランタイム (CL) | hsp3cl.exe | hsp3cl_64.exe | 新規 |
| コンパイラ (DLL) | hspcmp.dll | hspcmp64.dll | 新規 |
| コンパイラ (EXE) | hspcmp.exe | hspcmp64.exe | 新規 |
| デバッガ | hsp3debug.dll | hsp3debug_64.dll | 出力名修正 |
| hspext | hspext.dll | hspext64.dll | 出力名修正 |
| hspda | hspda.dll | hspda64.dll | 新規 |
| hspinet | hspinet.dll | hspinet64.dll | 新規 |
| hspvoicevox | hspvoicevox.dll | hspvoicevox64.dll | 新規 |
| hgimg | hgimg.dll | hgimg64.dll | vcxproj新規 |
| obaq | obaq.dll | obaq64.dll | vcxproj新規 |
| hgimgx | hgimgx.dll | — | DirectX 8依存 (32bitのみ) |
| ZLibWrap | ZLibWrap.dll | ZLibWrap64.dll | 対応済み |