INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32]

目次 | ←前へ / 2022-03-11 00:00 / 次へ→ / 最新へ⇒

■.NETな言語からWin32APIを呼び出すときに使われるマーシャルってどういう意味なんだっけ

2022年 3月11日(金) 0:00:00



RSSRSS配信中
https://www.inasoft.org/



INASOFTで公開しているソフトウェアのうち、いくつかについては、作者の練習目的も兼ねて、.NET Frameworkで製作されていたことがありました。例えば、キーボードシミュレータもそのうちの一つです。

このソフトウェアでは、Windowsのキー操作のシミュレーションを行うため、SendInput() という Win32 API を呼び出しています。このWin32 APIでは、構造体配列のサイズを与えることで、何文字の入力を行うのかを判定しているのですが、そのサイズ算出の箇所で、マーシャル(Marshal)というキーワードが登場します。

.NET Frameworkで管理された(マネージド)領域から、Win32 API(主にC/C++で呼び出されることを前提とした)アンマネージな領域を繋ぐ部分です。

抜粋します。

    // Win32APIを呼び出すためのクラス
    public class win32api
    {
        [DllImport("user32.dll", EntryPoint = "SendInput")]
        public static extern int SendInput(int nInputs, INPUT[] pInputs, int cbSize);

         :
         :
       (中略)
         :
         :

        [StructLayout(LayoutKind.Explicit)]
        public struct INPUT
        {
            [FieldOffset(0)]
            public uint type;
            [FieldOffset(4)]
            public MOUSEINPUT mi;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        }

    }

         :
         :
       (中略)
         :
         :

    if (IntPtr.Size != 8)
    { // x86を想定
        win32api.INPUT[] inputs = new win32api.INPUT[2];

        // 押し
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].ki.dwFlags = KEYEVENTF_UNICODE;
        inputs[0].ki.wScan = kv;
        // 離し
        inputs[1] = inputs[0];
        inputs[1].ki.dwFlags |= KEYEVENTF_KEYUP;

        // Unicodeモードで文字の流し込み
        win32api.SendInput(inputs.Length, inputs, Marshal.SizeOf(typeof(win32api.INPUT)));
    }

赤字の箇所でMarshalという言葉が登場しています。

Marshalクラスは、.NET Framework内から、アンマネージドコードを扱うためにメソッドを提供するクラスです。アンマネージなコードからのメモリ内容の変換・コピーなど、相互変換というか、橋渡し的な機能を提供します。相互運用マーシャリング(インターロップ・マーシャリング、interop-marshaling)です。

すいません、意味わからず書いています。

プログラミングの世界では、初学者は、訳の分からない単語が登場した時に「おまじない」だと思って、とりあえず意味の追求を横に置いておくことが結構あります。C言語の初学者がincludestdio.hvoidの意味を放置しておくように、僕もこのマーシャル(Marshal)という言葉の意味を放置していました。

そういえば、太平洋にはマーシャル諸島という国がありますが、こちらはスペルがMarshallなので、無関係ですかね。

ところが最近、無視することができなくなってくる事情が生じました。長女から頼まれた、ネット上で流行している歌の歌詞カード作りです。

この歌詞カード作りを通じて、ちょっとでも言葉の学習につなげられたらなと思っています。例えば、『ボナペティ(bon-appetit)はフランス語で召し上がれという意味だから「ボナペティだ針千本」は「針千本飲ますぞコラ」という意味だよ』『ダミン(Damn it!)は「クソっ!」という意味だよ』と教えてあげるなどするわけですね。

で、今回は次の歌が出てきました。

ひいらぎマグネタイトさん作「マーシャル・マキシマイザー」。声は可不かふによるソフトウェア音声。

歌の中では「マキシマイザー」という言葉が繰り返される箇所があり、他は韻を踏みまくるための言葉の羅列が多い印象ですが、題名に付けられている「マーシャル」で、.NETのキーワードMarshalを不意に思い出しました。そういえば、Marshalの意味を放置したままだったっけな、と。

改めて、Marshalの意味を調べてみることにしましょう


  • 名詞としての意味
    • 《軍事》(陸軍)元帥
    • 〈米〉連邦保安官
    • 〈米〉市保安官
    • 〈米〉消防[警察]署長
    • 〈米〉消防保安官
    • 〔競技会やパレードなどの〕式典担当者[係]
    • 〈英〉〔王座裁判所の〕司法官
  • 他動詞としての意味
    • 《軍事》〔部隊を〕整列[集結]させる
    • 〔人を〕集める、組織化する
    • 〔考えや事実などを〕整理する、まとめる
    • 〔儀式などで人を〕先導する、案内する
  • 自動詞としての意味
    • 《軍事》〔部隊が〕整列する、集結する
    • 〔考えや事実などが〕整理される、まとまる
引用:英辞郎 on the WEB

ん? 元帥? どの意味? 過去にも execute(死刑執行実行) とか、master/slave(主人と奴隷)とか、オス/メス(male/female parts)のようなキナ臭かったりハラハラする意味を持ちがちな単語がコンピュータ用語に登場することもありましたけど、なんかスゲェ単語が出てきたもんだな、と。

マネージドコードとアンマネージドコードの橋渡しのため、「先導する、案内する」という意味が、一番近いでしょうかね。あるいあ、アンマネージドコードに情報を渡すために、マネージドコード内でいったんデータを整理するという意味かもしれません。

で、マキシマイザー(最大化する人?)にくっつくマーシャルは、どの意味でしょうか? この歌の歌詞を深読みしている人の解釈を見ると、わりと軍事的な意味から持ってきているのではないか?判断力を持ったAIによる戦闘ロボットについて語っているのではないか?あるいはデーモン・コア実験について語っているのではないか?等々。3.11の日に語るには、なかなかヘビーな内容ですね。

これについて子供に教えるには、僕自身の勉強がもっと必要な気がしてきました。



目次 | ←前へ / 2022-03-11 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。


- 最近の更新 -



3211839 (+0204)[+0260]

Copyright© 2010-2024 INASOFT