.NETプラグイン開発キットの動作について

  1. 初めまして。最近になってmeryの事を知ったのですが非常に使いやすく重宝しております。
    プラグインライブラリの内容についてもこちらで良かったでしょうか。問題ありましたらご指摘下さい。

    上記開発キットでの開発中に幾つか不具合が発生しました。

    ・Editor.GetBackColor
    背景色が標準に設定された項目を取得した際、表示されている背景色と異なるデータが得られました。

    ・Editor.SetOwned
    以下の例外が発生しました。
    型 'System.EntryPointNotFoundException' の例外が DotNetLib.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした
    追加情報:DLL 'User32.dll' の 'SetWindowLongPtrW' というエントリ ポイントが見つかりません。

    対処法や修正箇所分かる方いらっしゃいましたらお教え頂けると幸いです。
    よろしくお願いします。

     |  hima  |  返信
  2. はじめまして。
    Mery をお試しくださりありがとうございます、開発担当の Kuro と申します。

    > プラグインライブラリの内容についてもこちらで良かったでしょうか。問題ありましたらご指摘下さい。

    有志の方が掲載してくださっているプラグインなので正式なサポートではありませんが、このフォーラムで大丈夫ですよ~。.NET 開発キットの作者様も時々訪れてくださるので、もしかするとご回答いただけるかもしれません。

    > ・Editor.GetBackColor
    > 背景色が標準に設定された項目を取得した際、表示されている背景色と異なるデータが得られました。

    私は .NET はよく分からないので Mery のプラグインの仕様と想像で回答させていただきますが、「背景色と異なるデータ」というのはマイナスの値を示すものではないでしょうか?

    背景色・標準の場合は通常の色データとは異なり、システムカラー (Windows のテーマに依存) が割り当てられています。Mery の仕様 (というか Delphi の仕様) で、システムカラーはマイナスの値を示します。

    なので、Delphi のシステムカラーを通常の色コードに変換するためにはちょっとヨイショが必要かもしれません。色の値が 0 未満の場合はシステムカラーなのでこんな感じのロジックで通常の色に変換できるような気がします。

    .NET の知識がないため Delphi のコードで失礼します。(GetSysColor は Windows の API です)

    if Color < 0 then
        Color := GetSysColor(Color and $FF);

    > ・Editor.SetOwned

    こちらの症状はちょっとわかりかねますので、作者様のご降臨を待つしかなさそうです。

     |  Kuro  |  返信
  3. ● hima さん

    .NET プラグインを触っていただき、ありがとうございます。
    そちらを(勝手に)開発している ks です。

    > ・Editor.SetOwned
    > 以下の例外が発生しました。

    こちら手元では直していて、次のページを作るときに更新かけようと思っていた不具合でした。
    ページはそのままに、モジュールだけ更新したので、そちらを反映してもらえればと思います。
    ただテンプレートを更新しても既存のモジュールには反映されないので、伸張して中から Library 部分を取り出し、ご自身のプロジェクトに反映してもらえればと思います。
    (何かお手軽で良い更新方法がないか、考え中&募集中です)

    # Library 部分のソース公開は全然構わないので、GitHub か何かで公開したいとは思ってます

    > ・Editor.GetBackColor
    > 背景色が標準に設定された項目を取得した際、表示されている背景色と異なるデータが得られました。

    Kuro さんから仕様が公開されたので、それに合わせれば対応可能かなぁとは思います。
    ちょっと考える余裕がないので、長いですが Library 中の関係する部分だけ抜き出しました。
    計算部分は試行錯誤で出した部分なので、合ってないのはある種当然なんです……

    private enum MESSEAGE_CODE {
        WM_USER = 0x400,
        ME_FIRST = WM_USER + 0x0400,
        ME_INFO = ME_FIRST + 38,
    }

    private enum INFO_CODE {
        MI_GET_BACK_COLOR = 273,
    }

    /// <summary>
    /// テキスト、背景の色定義
    /// </summary>
    public enum COLOR_TYPE
    {
        /// <summary>
        /// 通常
        /// </summary>
        GENERAL = 0,
        /// <summary>
        /// 選択範囲
        /// </summary>
        SELECTION = 1,
        /// <summary>
        /// カーソルのある行
        /// </summary>
        CURRENT_LINE = 2,
        /// <summary>
        /// URL
        /// </summary>
        HYPERLINK = 3,
        /// <summary>
        /// 文字列
        /// </summary>
        STRING = 4,
        /// <summary>
        /// コメント
        /// </summary>
        COMMENT = 5,
        /// <summary>
        /// スクリプト
        /// </summary>
        SCRIPT = 6,
        /// <summary>
        /// 対応する括弧
        /// </summary>
        BRACKET = 7,
        /// <summary>
        /// タグ
        /// </summary>
        TAG = 8,
        /// <summary>
        /// 強調文字列(1)
        /// </summary>
        KEYWORD_1 = 9,
        /// <summary>
        /// 強調文字列(2)
        /// </summary>
        KEYWORD_2 = 10,
        /// <summary>
        /// 強調文字列(3)
        /// </summary>
        KEYWORD_3 = 11,
        /// <summary>
        /// 強調文字列(4)
        /// </summary>
        KEYWORD_4 = 12,
        /// <summary>
        /// 強調文字列(5)
        /// </summary>
        KEYWORD_5 = 13,
        /// <summary>
        /// 強調文字列(6)
        /// </summary>
        KEYWORD_6 = 14,
        /// <summary>
        /// 強調文字列(7)
        /// </summary>
        KEYWORD_7 = 15,
        /// <summary>
        /// 強調文字列(8)
        /// </summary>
        KEYWORD_8 = 16,
        /// <summary>
        /// 改行
        /// </summary>
        CRLF = 17,
        /// <summary>
        /// 折り返し
        /// </summary>
        WRAP = 18,
        /// <summary>
        /// タブ
        /// </summary>
        TAB = 19,
        /// <summary>
        /// EOF
        /// </summary>
        EOF = 20,
        /// <summary>
        /// キャレット行
        /// </summary>
        CARET_LINE = 21,
        /// <summary>
        /// 行番号
        /// </summary>
        LINE_NUMBERS = 22,
        /// <summary>
        /// ルーラ
        /// </summary>
        RULER = 23,
        /// <summary>
        /// 折り返し線
        /// </summary>
        VERTICAL_LINE = 24,
        /// <summary>
        /// 半角文字
        /// </summary>
        SB_ALPHABETIC = 25,
        /// <summary>
        /// 半角数字
        /// </summary>
        SB_NUMBER = 26,
        /// <summary>
        /// 半角記号
        /// </summary>
        SB_SYMBOL = 27,
        /// <summary>
        /// 半角カタカナ
        /// </summary>
        SB_KATAKANA = 28,
        /// <summary>
        /// 半角空白
        /// </summary>
        SB_SPACE = 29,
        /// <summary>
        /// 全角英字
        /// </summary>
        DB_ALPHABET = 30,
        /// <summary>
        /// 全角数字
        /// </summary>
        DB_NUMBER = 31,
        /// <summary>
        /// 全角記号
        /// </summary>
        DB_SYMBOL = 32,
        /// <summary>
        /// 全角かな
        /// </summary>
        DB_HIRAGANA = 33,
        /// <summary>
        /// 全角カナ
        /// </summary>
        DB_KATAKANA = 34,
        /// <summary>
        /// 全角漢字
        /// </summary>
        DB_KANJI = 35,
        /// <summary>
        /// 全角空白
        /// </summary>
        DB_SPACE = 36,
        /// <summary>
        /// ブックマーク
        /// </summary>
        BOOKMARK = 37,
        /// <summary>
        /// 不正なスペル
        /// </summary>
        SEARCH_STRING = 38,
        /// <summary>
        /// 諸外国語
        /// </summary>
        FOREIGN = 39,
        /// <summary>
        /// その他の文字列
        /// </summary>
        OTHER = 40,
        /// <summary>
        /// 制御文字
        /// </summary>
        CONTROL = 41,
        /// <summary>
        /// 例外
        /// </summary>
        INVALID = 42,
    }

    [DllImport("User32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    /// <summary>
    /// 背景色を取得
    /// </summary>
    /// <returns>背景色</returns>
    public Color GetBackColor(COLOR_TYPE color) {
        uint abgr = (uint)SendMessage(hwnd, (uint)MESSEAGE_CODE.ME_INFO, (IntPtr)INFO_CODE.MI_GET_BACK_COLOR, (IntPtr)color).ToInt32();
        // a == 255 => 標準
        // a == 31 => 透明
        // a == 0 => カスタム色
        uint a = (abgr >> 24);
        return Color.FromArgb(a==31 ? 0 : 255, (int)(abgr & 0xFF), (int)((abgr >> 8) & 0xFF), (int)((abgr >> 16) & 0xFF));
    }

     |  ks  |  返信
  4. ●Kuroさん

    お返事ありがとうございます。
    得られたデータそのものはマイナスの値ではありませんでしたが、どうやらその仕様によって問題が起きているようだと分かりました。

    ●ksさん
    お返事&素早いご対応ありがとうございます。

    > ページはそのままに、モジュールだけ更新したので、そちらを反映してもらえればと思います。

    確認しましたが、内容物が前回アップロードの物(20160629130333!DotNetPluginKit)と同様のようです。

    >ちょっと考える余裕がないので、長いですが Library 中の関係する部分だけ抜き出しました。

    Editor.GetBackColorの問題について、両氏に頂いた情報を参考にこちらで問題箇所を調べて見ました。

    >     uint abgr = (uint)SendMessage(hwnd, (uint)MESSEAGE_CODE.ME_INFO, (IntPtr)INFO_CODE.MI_GET_BACK_COLOR, (IntPtr)color).ToInt32();

    この行で取得したマイナスの値をuintにキャストした際に数値が異常になっているのではないかと思います。
    私も.NETの事はよくわかってないので的外れな事を言ってる可能性も多分にあります。

     |  hima  |  返信
スポンサーリンク