変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

[EXCEL]ネストした表の拾い出し

こんなネストした表から(nnn)形式の番号とその後のテキストを拾い出すとしたら・・・

ネストした表

VBAではなくセルの数式で頑張ると

(nnn)を拾い出す簡易な数式
(nnn)の後のテキストを拾い出す簡易な数式

な感じだろうか・・・

一応6行目の様なケースも考慮してSEARCH関数で(nnn)な何かを判定している。

手元のEXCELは数式に改行コードが入るので、図の様に改行できて見やすい。けど、手元のPCのCPUは古いけどi9-9900でメモリ32GBだから不自由なく使えてるダケかもしれない。よくあるハズレPCアンド旧EXCELな状況ではそうもいかない。

多分、重い数式の説明やらヘルプ機能が邪魔で手に負えなくなるから、sakuraエディタで最終行を複製し1行範囲でセル座標を置換して貼り付けた方がマシな気がする。

FINDやSEARCHの検索対象を範囲指定してスピンさせる範囲分列を消費させる方法もあるけど、CONCATでかき集めないといけないし、悪質なくらいネストしている表の場合は列が足りなくなる恐れがあるので複数行な数式の方がマシな気がする。

でも行方向にスピルさせれば・・・

長すぎる番号を拾い出す数式
長すぎる番号の後のテキストを拾い出す数式

数式を行数分コピペしなくていいから便利かもしれない。

※範囲が1行分足りなくなった時に、数式の6を7に一斉置換するためにsakuraエディタが必須かも。

もし10ネストとかになると数式の長さに引っかかったりしそうだし、やっぱり編集も面倒!

「長いIF数式」をLAMBDA関数で括り、セル名の参照範囲に割り当ててみよう。

長い数式をセル名付きのLAMBDA式化
短くなった番号を拾い出す数式
短くなった番号の後のテキストを拾い出す数式

範囲パラメータを指定すると自動的にスピルされてしまうので、4つの番号取得を一つにまとめる方法が無いのかな?

複数列でまとめた数式をLAMBDA化してみよう

複数列からxxxな式を追加してみた

セル名の範囲をシートにすると「シート名!セル名」になってしまうのでセル名の範囲をブックに変更。

セルの数式の方も

もっと短くなった番号を拾い出す数式
もっと短くなった番号の後のテキストを拾い出す数式

とまれ、ここまで短くなれば十分かな。

ネストが深くなったら、

  1. 「複数列からxxx」の参照範囲のLAMBDAのパラメータと式を増やす
  2. セルの数式もパラメータ増やす

で何とかなりそう。

「複数列のxxx」セル名でBYCOL関数を使ってみる

ん-。やはり列範囲を指定した時点でスピルされてしまう。

うまく行かないや(笑

ここまで数式で頑張らなくても

シートからCSVに吐き出して、エディタでTAB(¥t)を一斉削除してシートに戻せばよいのは、秘密です。



とりあえず地球温暖化が原因

  • 地球の平均気温が上がる
  • 赤道付近が暑目で極地との温度差が大きくなる
  • 熱移動が盛んになり偏西風が大きく蛇行する
  • 暑さが極地まで届き北極海の氷が多く溶ける
  • 北極海の温度が上がり始める
  • 北極海の温度が上がり赤道付近との温度差が小さくなる
  • 温度差が小さくなり偏西風の蛇行を跳ね返すパワーが気団に無く蛇行が更に酷くなる
  • 地域によって暑くなりすぎたり寒すぎたりする
  • 春と秋が短く感じる

1行づつ読むと確かに「地球は温暖化」してそう。

しかし、上から下まで一気に読むとあちこち矛盾が生じている気がする。

そこは

とりあえず全ては地球温暖化が原因

と云うことで水に流そう。(大笑

但し、ここで判ることは

仮に地球が寒冷化しだしても

  • 熱移動が盛んになり偏西風が更に蛇行する
  • 地域によって暑くなりすぎたり寒すぎたりする
  • 春と秋が短く感じる

となって状況はほぼ変わらないのは間違いない様だ。



量子の冬

漁師の冬ではないが、意味は似ている。

今の量子コンピュータは使用できるビット長が少しづつ長くなりもうちょっとで何かができそうな雰囲気になっている。ところが、「何に使えるのか?」と云う具体的な話がなかなか出てこない。

つまり、小舟(量子コンピュータ)はできたけど、この小舟を海(市場)に出せば何が釣れる(何の問題を解決できる)のか?が思い当たらないのだ。

これは仕方が無い面もある。

PCもCPUが8あるいは16ビットの頃は扱えるメモリサイズが小さく、シーケンサーの様なコントローラか、手書きの代わりにワープロするぐらいしか使い道が見当たらなかったので、誕生から10年を待たずにPCの冬(PCを作ってる企業に投資するのはムダ的な雰囲気)を迎えてしまったがこの少ないメモリでもゲームは出来たので何とか生き延びたので、32あるいは64ビット化時にGPUの登場とあいまって綺麗なCGが動きまわる画面でゲームを生み出す下地があったからこそ。今でもゲーム機が存在しているのだ。

残念ながら、量子コンピュータに

まだショボイのでビジネスには向かないけどゲームなら楽しめます

的な要素がまだ生まれていないので、まだまだ地面で空を飛ぶ練習をしているヒナ鳥状態だけど

いつかは空を飛べるのかもしれない。(合掌)



宇宙考

地球から遠い星ほど速く遠ざかっている。

遠い星の光が地球に届くまで半端ない年月がかかる。そんな昔の宇宙は今より勢いよく拡大していたんだろう。

遠くなるほど早くなるなら光速を越えて遠ざかり地球から見ることが不可能な星もありそうだ。

宇宙ができて直ぐの頃は光速を越えて拡大していたかもしれない。

物質の速度を光速に近づくほど加速に必要なエネルギーは増大傾向にあるので、光速を越えて移動できない。否、光速度に到達できない。

物質を取り囲む空間そのものなら物質ではないので高速を越えても問題ない。

物質ではない空間とは?

物質とエネルギーの相互変化を繰り返す力場。

最初はたった1つの反応系。

この反応系は結果に揺らぎがあり、揺らぎ(有)が起きると相対する反応系(無)を生みだされる。

それが空間。

そして、生み出された空間で僅かな確率で再び新たな揺らぎが起こり、先と同様に空間が生み出される。

そして、2つの揺らぎと1つの空間が得られる。

これは有と無が不均衡であるので、新たな空間(無)が生み出さ、2つの揺らぎと2つの空間が得られる。

こうして、空間が増殖する。

さらに空間からほんの僅かな確率により、

4つの揺らぎと4つの空間が得られ、

8つの揺らぎと8つの空間が得られ、

・・・

この様に増殖する。

1,2,4,8,・・・

さらに空間の増殖は止まらない。

ほんの僅かな確率でしか増殖しないけどね。



[三国英雄の夜明け]第五回統合大型アップデート

10月14日にアップデートが実装されました。

タイトルは多分誤字
謎過ぎる

領地内に鎮魂の塔が追加され、

読みにくいけど「鎮魂の塔」

10階まであるけど、とりあえずは4日ごとに順に解放らしい。

一階の方々

絵はある程度、攻略済みのもので、最初は●●●で、武力や戦力を指定値まで上げると●●になる。

英雄の武力を11も上げるには

星の神紋とか

武力+5

強化した宝物とか

倚天剣

を他から融通して条件クリアし、クリア判定を済んだ後に元に戻せばいい。

武力の場合は魂玉とか獣霊を融通すれば良さげ。

但し、「二人の英雄の合計の武力」が条件の時は、+22(二人分)だから条件自体がギリギリだったり、ちゃんと元の英雄に装備を戻せるかちょっと心配だったりするので、スクショを撮ったり事前準備はしっかりやっておいた方が良さそう。

そして、更に指定のアイテムを貢ぐと●●●、また更に別のアイテムを貢ぐと●●●になる。

食料や銀銭なら都合しやすいが米酒や拝帖はストックが切れてると溜まるまで数日かかるかも。

3個足りない
試練完成(2日後)

これをクリアすると強化リストにご対面。

★★5段階強化★★★

条件のアイテムは、征戦「古代の夢魔」(告知では「永久の悪夢」)で、

征戦のメニュー

あみだくじの様な経路を進め、時にはミニゲームで対戦し、終焉条件(ラスボス対戦)をクリアすると貰える「夢境の塵」で、商店「夢獏見世」でアイテム「古の回響き」や「却数の棘」等に変えることになるので、5段階クリアは長丁場になりそうです。

1段進めたら●●●と色が変わったので、段階ごとに色は変化しそう。

●●●

古代の夢魔は地獄道の他に5個くらいあった様なので、進むたびに厳しくなるんだろうなぁ。

あ、途中で拾った呪われてそうなアイテムは捨ててしまいたいけど

ヤバそうなアイテム

レベル5デス的な状況もあるかもしれないから、取っておくか・・・



メタバースとリアルの隙間を妄想してみた

メタバースの世界で色々できればVRゴーグルっとコントローラで完結するから、もうパソコンやゲーム機どころかスマホも必要無い。

※実際にはメタバースの世界の中で最新版のデジタルデータのスマホ(あるいはアイフォン)の3Dモデルに課金して使ってたりする訳ですが。

しかし、VRゴーグルを付けていれば世界中どこへでも行けるし、ちょっと課金すればスマホのカラバリも即変更できるのに、日常生活のイベント(食事、睡眠、トイレなど)は別口。特に不意のイベント(宅急便や書留の受取りなど)の為にVRゴーグルを外し玄関まで移動するのはとてもストレスが溜まるだろう。

もし、そんなストレスから逃れるために、全てをメタバースに求めるなら、それは映画マトリクスの世界の住人の様に羊水の中に浸ることになるのかな?

退屈で無意味に長い火星旅行ならば、これが最適解だと思えるけどね。

仮にそんな状況で事故や事件に巻き込まれたり病気になったらどうなるんだろう?

誰もが羊水に使って自分の世界に閉じこもっているからすぐ隣で異変が起きても気が付かない。

メタバースの管理者は「メンドクサイから・・・とりあえず変わりのNPCを配置」、全ては無かった事にして終了かな?

だって、火星に着いたら、仲良しのあの人は?え?NPCだったの?気が付かなかったwwww

で済むじゃないですか。(笑

誰も元はプレイヤーだったなんで気が付きませんよ。(笑

もし、異変に気付いてしまったプレイヤーがいたら

・・・

あの映画と同じ様な結末が待っているんじゃないかな。

・・・

あれ?視界の端に何か文字っぽいものが流れている

この小さく鈍い音はどこから聞こえてくるんだ?

・・・

どんと、おはらい。



[三国英雄の夜明け]残されたもの(のびしろ)

幕府

レベルアップの度に2%づつPC対戦時に戦力がアップする応援システム。※レベル48で110%アップ。

但し、各府英雄の評価合計が低いと十分に戦力がアップされないので全員S評価にするのがお勧め。

押し職を集中して上げる方が無難。

定計

戦計でレベル4に上げると英雄に装備できる。

戦計

百貨市場で各計を3★以上に上げると

図の説明の様に全体または一部の英雄の戦力等が強化される。

4★になれば英雄に装備すると良いこともある。

魂玉

竜金探索でアイテムを収集し英雄に装備させパワーアップ。魂玉を合成して品質アップするとモリモリ強くなるが、品質が上がるほど合成に必要な魂玉の数が増えるので、合成すると全体の戦力は下がり気味。余ったら合成するのがいい。

シーズン(9日間イベント)

任務(全22)を達成する度にアイテムを貰えるので、ほどほどにやっている。

部隊が全滅するとポイントを多く貰えるので食料がいっぱい必要。

襄陽争奪戦(8日間隔)

任務達成や時間制のランキングに応じてアイテムが貰えるので、ほどほどにやっている。

部隊が全滅するとポイントを多く貰えるので食料がいっぱい必要。

襄陽の奪還に成功すると産業のうち3か所で黄金50が拾え(10回/日)、年度報酬も多めに入る。

異民族侵入

ランダムに発生する。報酬は少ないけど、取らないのも勿体ない。

黄巾の乱

襄陽争奪戦の日を除き、毎日10、11、18、19時に発生。※20時に大群が来襲する時もある

報酬は少ないけど、取らないのも勿体ない。

その他(未着手)

乱戦

乱戦商店で欠片の購入に使えるアイテムをゲットできる。参戦料(黄金500~1000。官邸レベルで変動?)が高いし、参加は時間制なのでやっていない。

乱戦商店

兵力を強化する欠片を売っている。

英雄の塚

課金は力也

過去に競売した「神」英雄を入手できる。図の通り課金必須。

ps.2022/9/19

ここを見た訳では無いだろうけれど、鯖統合情報が出た。

領地に鎮魂の塔という修行ストーリーが追加される様だが、課金必須なら「俺には関係ない」感。

そうでなくても、まだ砂盤演義を30章攻略中なので早すぎ感。

新年ぐらいに・・・と予告されていたバージョンアップの前倒しなのかな?

ps.2022/9/24

19.5million

平均すると4~5万/日だけど、戦計アップを含むので、その他の増強ペースが下がっている気がする。

課金勢に引き離され過ぎ。

それと、昨日(9/23)の午後8時くらいつい先ほどまでYoutobeももっさり、ゲーム画面で「ロード中…」が長すぎ!ブラウザを開き直す事x100回?いったい何があったんだろう?Nuro光とかに変えても無駄なんだろうけどね。

ps.2022/9/25

今日も夜から回線が重い。

対戦とは云え、反射神経がほとんど要らないスマホ・ゲームなのに支障が出る程度に酷い。

手元から一番遠いルータを再起動しても変化なし。

手元に一番近いハブをちょっと電源を外して再起動。お、症状は軽くなった。

※「ロード中…」が出たままになる状態から、5~10秒で消える程度に改善。

「あのロ編入投票」が始まったので妨害がきたのか?と思ってたw

昼間は大丈夫だったんだけど?

夜8時を回るとお眠なハブなのか?

やってないものに「究極・強化」があった。

あまりの低確率で「眼中」から外れて久しい。

けど、偶然+8になった。

今まで使えなかった上位アイテムを溶かしまくって・・・

なせか28%で成功

+13まで進む。

統率99だから+1欲しいなぁ

ps.2022.10.9

やっと2千万

爵位条件の1つが未達成に戻っていたので、アップデートの前に達成するようにスキルを調整したら、戦力2千万達成、長かったなぁ。

10月末にアップデートがあるから、そこで今後の進路を考えよう。

ps.2022.10.12

アップデートが前倒しに14:00までメンテらしい。

前倒しアップデート?

ps.2022.10.13

今日はサーバのメンテのみ、アップデートは明日らしい。



入手不可、お値が高すぎ

近所のケーブルが2Gbpsになったらしいので、多分、Nuro光可な地域になったんだろう。

もうPS5が発売されてから1年くらい過ぎたと思うけど

今もって、存在確認すら困難な状況。

そ・れ・な・の・に

Youtobeで

Nuro光なら、あの(入手困難な)PS5が・・・

とCMがかかるので、イラっと来る。

もうPS5はどうでも良くなってるけど、

Nuro光も、どうでも良くなってきた。

もし・・・

Nuro光に変えるにょかい?

変えにゃいのかい?

ドッチにゃんだぃ?

と、勧誘が来たら、

カップリング販売は嫌いなんで

答えることにしよう

さて、恒例のAppleの新製品発表もお値が高い。

あのApple信者系のネットメディアが「日本は世界で2番目に安く買える」と擁護していたけど、お高いことには変わりない。大体、以前に円安になった時には「即!大幅値上げ!」したが、円が戻っても新商品発表まで「そのままの高値」だったので、来年の9月までこのままだろう。

そう考えると、「一番円安な時期に買うのがお得」という事になるが、

誰得?である。

そんな訳で今回もiPhone化を断念

Android13のアップデートも電源周りのトラブルがまだ解消できていないみたいなので少し古いけど、Android11のモノに買い替えることにした。10月3日迄の期間限定でIIJがmoto g52j 5g29,800円(税込)で売っていたのでポチった。

前回はポチるだけだったが・・・

  • メールの認証コードをペースト
  • 本人確認資料の送信

の2段踏みになっていた。

転売対策なんだろうけど、

メンドクサイ。

しかも本人確認資料をちゃんとチェックしているらしく生年月日が不鮮明なので再送してねとメールが来た。再送したら数日くらいかかるかな?と思ったけど1時間くらいでOKメールが返ってきた。土曜日到着予定。

早すぎる。

手元のSH-M08の画面が5.5インチで重さ155Gなのに対して、moto g52j 5gは、画面が6.5インチと大きく200gと重いので片手で使うのは無理っぽいが、SH-M08の時点で両手使いしてるのでそう不便さは感じないだろう。

※片手で使えるのはipod touchサイズまでかな。

SnapDragon695 5Gで、重い3Dゲームは苦手らしい。

原神なら大丈夫かな?

一番面倒になりそうなのがアプリの移動。

楽天Edyとかマイナポイントとか入っているから・・・

あ~メンドクサイ

ps.2022.9.10

到着した。SH-M08と見比べると一回り大きい。本体はクリアケースに入ってるが、画面は印刷された保護カバーが付いていたので剥がして一足早く届いたガラスフィルムを貼る。真ん中に1cmくらいの空気が残ったけど横から爪で隙間を開けて容易に逃がせた。

EDYは機種変更済み。データとかは全部手作業かと思ったけど、USB-Cケーブルで繋げばコピれるらしいので充電率48%だったから30分くらい充電したら72%まで上がった(1分1%かな?)。

元がストレージ32GBだから128GBに増え、とてもスカスカで気持ちが良い。

ACのUSB充電器では通常速度、モバイルバッテリーなら急速充電っぽい感じがする。

FMラジオアプリが混じっていた。そんな機能はスペック表には無かったのにナゼだろう?

とか思いつつFMラジオを起動、権限設定、イヤフォンが繋がっていません、イヤフォンをつなぐ。

ノイズ混じりながらも選局できました。

Google認証システムはQRコードで一気に移行。

MSのAuthenticatorは設定でクラウドのバックアップをONにしておけば新スマホ側でバックアップから復元可能。但し、一度アカウント毎にパスワードや2段階認証を通さないといけないのが面倒い。パスワードのインポート・エクスポートもあるけど、これはブラウザ等で保存したIDやパスワードなんで別口。またファイル転送は新旧スマホをUSBケーブルで繋いでダウンロード・フォルダ経由でコピるのが速いし安心。

充電せずに朝まで放置したら50%くらいまで減っていた。いっしょに放置してたSH-M08は4%になってた・・・

ps.2022/9/17

なんと、9/30にほぼ同型のmoto g32が発売される。

moto g52j 5gがちょっと値下がりしたのコレのせいかな?

  • nanoSIM x2 、DSDV
  • 5G無し
  • おさいふケータイ無し
  • Snapdragon 680・メモリが4GB
  • 防水防塵IP52

と、ちょっとスペックダウンしてるけど、OSはAndroid12、ステレオスピーカーなのが羨ましい。

moto g52j 5gの12アップグレードはいつになるやら



[Windows]TypeLibraryってドコにあるの?

色々調べてもラチが空かないので、OLEのインタフェースを書いているハズのタイプライブラリィを調べてみる。

まずはタイプライブラリィを登録するにはRegSvr32.exeを使うので、レジストリィを探してみる。

HKEY_CLASSES_ROOT\TypeLib
HKEY_CLASSES_ROOT\WOW6432Node\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\TypeLib
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\TypeLib

この5か所に登録したプログラム(exeとかdll)のフルパスを登録しているらしい。

WOW6432Nodeは64ビット版Windowsだけだろう。パスこそ違えど、登録内容は同じみたいなので、一般ユーザで見れそうなトコを使えば良さそうだ。HKEY_CLASSES_ROOT\TypeLibが無難かな?

この配下に、

{CLSID}
  {バージョン1} @={TypeLibraryのバージョン1の名前}
    0
      win32 @={バージョン1の32ビット版のプログラムファイルのフルパス名}
      win64 @={バージョン1の64ビット版のプログラムファイルのフルパス名}
  ・・・
  {バージョンn} @={TypeLibraryのバージョンnの名前}
    0
      win32 @={バージョンnの32ビット版のプログラムファイルのフルパス名}
      win64 @={バージョンnの64ビット版のプログラムファイルのフルパス名}

な構成で、プログラムファイルのフルパス名だけが保存されていた。

※Windowsのバージョンごとにこの構成も違うのかもしれないけどね。

ファイルのありかは解ったけど、具体的なインタフェース(メソッドとかプロパティ等)を取得する方法は不明。またTypeLibの直下がクラス識別子 (CLSID)なので名前で検索しようとすると時間がかかりそうだから、一旦ヒットしたらINIファイルにでも保存して再利用した方がいいだろう。

とりあえず、ネットで探してみたら、この辺にやこのあたりに情報があった。

OLEView.EXEを管理者権限で開けば詳しく調べられるし見つけた内容はIDLファイルで保存できる

※管理者権限で開く必要がる。

CLSIDFromProgIDを使って名前からCLSIDを調べられるらしいが、正しい名前を知らないとダメだろうからOLEView.EXEで事前に正確な名前を判っていないと難しそう。

見つからなかったら、全検索して部分一致した名前を列挙するようなヘルプ機能が欲しい。

一応、TypeInfoを大元の情報を探してみる。

ただ、インタフェースで階層化してるトコまで見えてしまうので、

徹底的に調べ尽くしつくしかなく、最後に纏めて目の前のクラスから使えるメソッドを列挙するようにしないと使いにくい。

IDLファイルからADODB.ConnectionがOpenSchemaメソッドを持っていると判るまで

// Connectionを見つけた_Connectionが親らしい
    coclass Connection {
        [default] interface _Connection;
        [default, source] dispinterface ConnectionEvents;
    };
  ・・・
// _Connectionを見つけたConnection15が親らしい
    interface _Connection : Connection15 {
        [id(0x00000015), helpcontext(0x0012c8b8)]
        HRESULT Cancel();
    };
    ・・・
// Connection15を見つけた。これが本体らしい
    interface Connection15 : _ADO {
        [id(00000000), propget, helpcontext(0x0012c918)]
        HRESULT ConnectionString([out, retval] BSTR* pbstr);   // Getterらしい
        [id(00000000), propput, helpcontext(0x0012c918)]
        HRESULT ConnectionString([in] BSTR pbstr);       // Setterらしい
        ・・・
// OpenSchemaを発見
        [id(0x00000013), helpcontext(0x0012c8d8)]
        HRESULT OpenSchema(
                        [in] SchemaEnum Schema, 
                        [in, optional] VARIANT Restrictions, 
                        [in, optional] VARIANT SchemaID, 
                        [out, retval] _Recordset** pprset);
        }

この場合、Connectionの本体はConnection15らしいから、クラスのテンプレを作るならメソッドを列挙すれば良さそう。

このあたりのソースを改造しoleaut32.dllのLoadTypeLibでComTypes.TYPEKIND.TKIND_DISPATCHをチェックする様に

                    if (ta.typekind == ComTypes.TYPEKIND.TKIND_DISPATCH)
                    {
                        char[] numChars = { '0', '1', '2', '3', '5', '6', '7', '8', '9' };
                        if (sname.IndexOf("_") != 0 && sname.IndexOf("Events") == -1 && sname.IndexOfAny(numChars) == -1)
                        {
                            Console.WriteLine("DISPATCH {0} cFuncs:{1}, cImplTypes:{2}, cVars:{3}", sname, ta.cFuncs, ta.cImplTypes, ta.cVars);
                            int href;
                            info.GetRefTypeOfImplType(-1, out href); // -1は、謎仕様
                            ComTypes.ITypeInfo info2;
                            info.GetRefTypeInfo(href, out info2);
                            info2.GetTypeAttr(out ppta);
                            ComTypes.TYPEATTR ta2 = (ComTypes.TYPEATTR)Marshal.PtrToStructure(ppta, typeof(ComTypes.TYPEATTR));
                            if (ta2.typekind == ComTypes.TYPEKIND.TKIND_INTERFACE)
                            {
                                int con2;
                                string sname2, doc2, hlp2;
                                info2.GetDocumentation(-1, out sname2, out doc2, out con2, out hlp2);
                                Console.WriteLine("INTERFACE {0} cFuncs:{1}, cImplTypes:{2}, cVars:{3}", sname2, ta2.cFuncs, ta2.cImplTypes, ta2.cVars);
                                for (int j = 0; j < ta.cImplTypes; j++)
                                {
                                }
                            }
                        }
                    }

GetRefTypeOfImplTypeの謎仕様は偶然ココで見つけた。

Pythonのソースだけど、これが参考になるかもしれない。tlbparser.py のdef parse_typeinfo

MSのページでは

[in] index

ハンドルが返される実装された型のインデックス。有効な範囲は 0 からTYPEATTR 構造体のcImplTypesフィールドまでです。

となっているのに-1を渡すと得られるインデックスをGetRefTypeInfoに渡すと、その型が引き継いでいるインタフェース(typekind が ComTypes.TYPEKIND.TKIND_INTERFACE)な情報を得られる。

DISPATCH Properties cFuncs:11, cImplTypes:1, cVars:0
DISPATCH Property cFuncs:13, cImplTypes:1, cVars:0
DISPATCH Error cFuncs:14, cImplTypes:1, cVars:0
DISPATCH Errors cFuncs:12, cImplTypes:1, cVars:0
DISPATCH Fields cFuncs:17, cImplTypes:1, cVars:0
DISPATCH Field cFuncs:29, cImplTypes:1, cVars:0
DISPATCH Parameters cFuncs:13, cImplTypes:1, cVars:0
※名前に_や番号やEventsが付いていたものは除外

とインターフェースの情報の数が得られたので一歩前進かな?



[C#]Type.FindMembersとか

Type.GetType({型名})で取得できるタイプの中身を調べるType.FindMembersで見つけたサンプルをちょっこっと加工したもの。

// ToSearch フィルター
public static bool ToSearch(MemberInfo objMemberInfo, Object? objSearch)
{
    // Compare the name of the member function with the filter criteria.
    return true; // 常にtrueなのでFilterはnull以外なら何でもいい。
}
// FindMembers:MemberTypes.xxxx
public static void GetMemberTypes(Type t, MemberTypes mt, List<string> list)
{
    string filter = "*"; // 実はnull以外なら何でもいい。
    var mems = t.FindMembers(mt,
        BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance,
        new MemberFilter(ToSearch),
        filter);
    if (mems.Length > 0)
    {
        for (int j = 0; j < mems.Length; j++)
        {
            list.Add($"{t} {mt}'s supported: {mems[j].ToString()}.");
        }
    }
    else
    {
        // list.Add($"{t} does not implement the {mt}'s {filter}.");
    }
}
// GetMemberTypesAll
public static void GetMemberTypesAll(Type t, List<string>list)
{
    if (!listA.Exists(x => x == t.FullName))
    {
        listA.Add(t.FullName);
        GetMemberTypes(t, MemberTypes.Constructor,list);
        GetMemberTypes(t, MemberTypes.Custom, list);
        GetMemberTypes(t, MemberTypes.Event, list);
        GetMemberTypes(t, MemberTypes.Field, list);
        GetMemberTypes(t, MemberTypes.Method, list);
        GetMemberTypes(t, MemberTypes.NestedType, list);
        GetMemberTypes(t, MemberTypes.Property, list);
        GetMemberTypes(t, MemberTypes.TypeInfo, list);
        //以下はオマケ。
        GetTypeInterfaces(t, list);
        GetMembers(t, list);
    }
}
// FindInterfaces
public static List<string> listA = new();
public static void GetTypeInterfaces(Type t, List<string> list)
{
    string filter = "*";
    TypeFilter myFilter = new TypeFilter(ToSearch);
    Type[] myInterfaces = t.FindInterfaces(myFilter, "*");
    if (myInterfaces.Length > 0)
    {
        list.Add($"{t} implements the interface {filter}.");
        for (int j = 0; j < myInterfaces.Length; j++)
        {
            list.Add($"> Interfaces supported: {myInterfaces[j]}.");
            //
            string iTypename = myInterfaces[j].ToString();
            Type? t2 = Type.GetType(iTypename);
            if (t2 != null)
            {
                if (!listA.Exists(x => x == t2.FullName))
                {
                    List<string> list2 = new List<string>();
                    GetMemberTypesAll(t2, list2);
                    list.AddRange(list2);
                    listA.Add(t2.FullName);
                }
            }
        }
    }
    else
    {
        // list.Add($"{t} does not implement the interface {filter}.");
    }
}
// GetMembers
public static void GetMembers(Type t, List<string> list)
{
    // Get the MemberInfo array.
    MemberInfo[] members = t.GetMembers();
    // Get and display the name and the MemberType for each member.
    list.Add($"Members of {t.Name} ({members.Length})");
    foreach (var member in members)
    {
        MemberTypes memberType = member.MemberType;
        list.Add($"> {member.Name}: {memberType}");
    }
}

をこんな感じで呼び出す。

// 「コンソール・アプリ(>NET Framework)」のC#は、newの型省略表記やNull容認mの指定等が未対応の為
// 「コンソール・アプリ」でプロジェクトを作成。
// プロジェクトへのCOM参照: Microsoft ActiveX Data Object 6.1 Library
// using System.Reflection;

// コンパイラが変数の型宣言に伴う処理を行うことで
// Type.GetType("ADODB.Connection")で情報を得られる様にする。
public static ADODB.Connection dummy = null;
public static ADODB.Recordset? recordset = null;
public static ADODB.Connection? connection = null;
public static ADODB.Field? field = null;
//
public static void Main(string[] args)
{
    Type? t = Type.GetType("ADODB.Connection");
    List<string> list = new ();
    GetMemberTypesAll(t, list);
    //結果表示
    Console.Write("\r\n" + string.Join("\r\n", list.ToArray()) + "\r\n");
}

実行してみると、

ADODB.Connection implements the interface *.
> Interfaces supported: ADODB._Connection.
ADODB._Connection Method's supported: System.String get_ConnectionString().
ADODB._Connection Method's supported: Void set_ConnectionString(System.String).
ADODB._Connection Property's supported: System.String ConnectionString.
ADODB._Connection implements the interface *.
> Interfaces supported: ADODB.Connection15.
ADODB.Connection15 Method's supported: System.String get_ConnectionString().
ADODB.Connection15 Method's supported: Void set_ConnectionString(System.String).
ADODB.Connection15 Property's supported: System.String ConnectionString.
ADODB.Connection15 implements the interface *.
> Interfaces supported: ADODB._ADO.
Members of _ADO (0)
Members of Connection15 (3)
> get_ConnectionString: Method
> set_ConnectionString: Method
> ConnectionString: Property
> Interfaces supported: ADODB._ADO.
Members of _Connection (3)
> get_ConnectionString: Method
> set_ConnectionString: Method
> ConnectionString: Property
> Interfaces supported: ADODB.Connection15.
> Interfaces supported: ADODB._ADO.
> Interfaces supported: ADODB.ConnectionEvents_Event.
Members of ConnectionEvents_Event (0)
Members of Connection (0)ts_Event (0)
Members of Connection (0)

ほとんど情報を得られなかった。


  • タグ:


top