Skip to content

Ver 2.3.0 - ㊗️・外部依存ゼロでの「WebSocket(Port)ルート」正式解禁!

Choose a tag to compare

@Eschamali Eschamali released this 12 Jul 02:58
· 896 commits to main since this release

これまでOS直結の --remote-debugging-pipe(標準入出力パイプ)専用として研ぎ澄ましてきた本エンジンですが、この度、外部ツール(PowerShellやXLLアドインなど)を1ミリも介さない、完全な「Excel単体でのWebSocket(Port)制御」に正式対応いたしました。

プレリリース版からの大幅な通信コアの変革と、この機能に込めた開発の軌跡をお伝えします🤠


通信コアの大変革:「フリーズ」か「即死」か、地獄の二択の打破🏗️

先んじて公開していたプレリリース版では、Microsoft標準の WinHttpWebSocket○○ 系列のAPIを使ってWebSocket(Port接続)を行ってました。

しかし、VBA(Excel)という開発環境において、このAPIには致命的な設計上の弱点がありました。

VBE(開発画面)でデバッグ中にマクロを途中で止めたり、実行時エラーが発生して中断したりした瞬間、Windowsの「ワーカースレッド・コールバックハンドル」が解放済みのメモリ領域を指してしまい、Excelが警告なしで即座に強制終了(クラッシュ即死)するという、開発者にとって耐えがたい挙動が頻発したのです🫠

だからといって、安全のためにコールバックを使わない「同期モード」に切り替えると、今度はソケットバッファにデータが届いていない瞬間に受信APIを呼んだ瞬間、Excelが「応答なし」になって完全にフリーズする😔

「フリーズ(応答なし)」をとるか、それとも「クラッシュ(プロセス即死)」をとるか。

開発者にとってもユーザーにとっても絶対に妥協できない、絶望的な二択を突きつけられていました。

「……こんなお節介で不自由な高級API(WinHTTP)は、すべて捨て去る😠」

私は意を決して、通信コアを完全に白紙に戻し、Windows標準の生API 「WinSock」 を叩いて、WebSocketプロトコル(RFC 6455)のフレーム解析、マスク(Xor)処理、そして ioctlsocket を使った受信パースロジックを、完全に0からフルスクラッチで再構築しました🏗️

膨大な時間を要した大工事でしたが、この結果、WebSocketルートにおいても、既存のPipe版と全く同じ、

「コールバックを一切使わない(絶対に即死クラッシュしない)、しかしデータが届いていない瞬間でも1ミリもフリーズしない」

という、Excelのメインスレッドに100%優しく、極めてクリーンで堅牢なノンブロッキング・ポーリング動作を完璧に実現しました🥳

Tip

今回のリリースにおいて、接続先となるCDP-WebSocketの「接続用URL(ws://localhost:9222/devtools/page/...)」の自動特定機能(/json のHTTPパース処理等)は未搭載となっており、現段階ではユーザーが事前に調べたURLを直接引数に渡す設計になっています。
しかし、この自動特定機能はすでに次期バージョンに向けて実装が始まっています。
Excel単体で指定のメソッドを叩くだけで、起動中のEdgeのタブを自動検知して自動で吸い付く「真のスマートアタッチ」がまもなくアンロックされます。どうぞご期待ください!🦊


🛠️ システムが手に入れた、新たなるポータビリティの未来へ

「外部依存を一切持たず、VBAのネイティブコードだけでブラウザを完全に支配する」という、かつてのIEObjectが持っていた圧倒的なポータビリティのロマンが、このV2.3.0によって、Port版とPipe版という「2大通信経路」の両方において美しく完成しました🤠

ぜひ、磨き上げられたこの新しいエンジンの安定性と、スマホまでをもExcelから直接動かすオーバースペックな機能美を、お手元で体感してみてください🥳

皆様からのフィードバックや、過酷な実務環境での動作報告を、心よりお待ちしております!🦊