ラベル VBA の投稿を表示しています。 すべての投稿を表示
ラベル VBA の投稿を表示しています。 すべての投稿を表示

2017年11月12日日曜日

SafeArray でユーザー定義型を使いたい

SafeArray の要素をVBAのユーザー定義型にするにはどうしたらいいんだろうか
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms221482(v=vs.85).aspx

SAFEARRAY 構造体の fFeatures を FADF_RECORD にすればいいのか?

An array that contains records. When set, there will be a pointer to the IRecordInfo interface at negative offset 4 in the array descriptor.

とあるから IRecordInfo をセットするんだな、ユーザー定義型の情報なんだろう
でもこれどうやって調達すればいいんだろう
自前で作るとかはやりたくない

SafeArrayGetRecordInfo() でとれるかなと思ったんだけど失敗する
 dim arr()
 redim arr(1) as ユーザー定義型
の SafeArray 構造体がどうなってるか確認したら、arr の fFeatures には FADF_RECORD が格納されていない

ユーザー定義型を示すGUIDから取得できたりもするっぽい?
でもGUIDの取得方法わからない

んーーー
ユーザー定義型の配列を variant に突っ込もうとしたときに
「パブリックモジュールで定義されたなんとかかんとか」
みたいなエラーメッセージが表示されたりするのと関係があるんだろうか
そういうの以外は実はCOM的な意味でのユーザー定義型になっていなくて、
要素長だけかんりしてるとか
でもVBEでインテリセンスみたいなメンバ表示が出るあたり、
IRecordInfo とか持ってそうな感じするんだけどなぁ

2017年11月11日土曜日

AddRef() で落ちる 続き


variant 型に IEnumVariant をセットしようとしたときにエクセルが落ちることがある件の続き。

いろいろ試してみると、set variant = a.NewEnum() の時 queryInterface() でGUID B196B283-BAB4-101A-B69C-00AA00341D07 を要求しくることに気づいた。
これは IprovideClassInfo インターフェースというものらしく、唯一?のメソッド GetClassInfo() から ItypeInfo インターフェースを得るためのもの(っぽい)。
これをちゃんと実装するとたぶん落ちなくなるんだと思うが、かなり大変そうなのでやめとく。代わりに E_NOINTERFACE を返すようにした。
とりあえず「型が一致しません」エラーが出て、エクセルが落ちることはなくなった。

2017年10月31日火曜日

AddRef() が落ちる

制作中の VBAEnumration の話
For Each で列挙できるようにするため、EnumVariat をVBAから CoTaskMemAlloc() でメモリ確保して作っています。
そこに標準モジュール関数を登録した vtable をセットして仮想関数持ちのオブジェクトを再現しているんですが、なんか AddRef() で時々落ちてしまいます。エクセルが。

dim a as IEnumVariant
set a = q.NewEnum

だと落ちないっぽいのに、

dim a as variant
set a = q.NewEnum

だと、set a = したところで addref() に飛んで、そこを抜けると落ちる。気がする。

原因がわかんないなぁー

こういう悩み中みたいな話を GitHub のどこかにのせていってもいいんだろうか
Readme とか Issue?は違うのかな目的が

2017年10月25日水曜日

VBAでLINQみたいなことができるクラス群

意味ないものですが作成中

https://github.com/abarabone/vbaEnumeration

GitHub にアップしてるんだけど Git も GitHub もよくわかりませぬ…
とりあえず一通りのオペレータができるまでは黙々とやっていきます

実用性はないでしょうけど

ニューラルネットやってみてる

最近ニューラルネットやってみてる 理屈を学ぼうと思って、まずはオブジェクト的に作ってみてる (ベクトル化とかは後回しで) sigmoid, tanh, ReLU MSE, cross entorpy あたりを小規模にいじってみてます でも今 soft max の逆伝...