掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB.NETユーザー定義型でLong型を用いたい場合のマーシャリング (ID:147928)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
プリミティブの Long 型は、.NET の Int64 型にマッピングされています。 強いてマーシャリング指定するなら、MarshalAs(UnmanagedType.I8) であり、 COM のバリアント型として扱う場合は、VT_I8 相当の型となります。 Int64 型をもつ COM 構造体を、64bit 版の VBA で参照設定した場合、 VBA の オブジェクトブラウザ上からは y As LongLong のように見えます。一方、32bit 版の VBA や VB6 等で参照設定した場合は、 y As <サポートされていないバリアント型> のように表示されます。 VBA 側で「Dim xy As T1」のように宣言した場合、VBA32 では 上記の理由から、コンパイルエラーになりますのでご注意ください。 64bit版の VBA で使う場合は構いませんが、VBA32 でも使いたいなら、 Long(Int64)型の利用は避けた方が無難です。代わりに、Integer(Int32)型の メンバーを2つ用意したり、String や Decimal 等で代用できないか検討してみてください。 COM 連携などの都合上、どうしても Int64 のメンバーが必要な場合には、 代用として「内部処理形式 LongLong の Variant 型」を使う事で、 VBA32 でも限定的に利用可能でとなります。この場合、VB.NET 側では、 As Object にしておいて、そこに Long 値を受け渡す形にします。 VBA 側では、内部処理形式 LongLong の Variant 型で受け取った場合、 Debug.Print VarType(v) が、32bit/64bit共に「20」を返します。つまり、VT_I8 相当ですね。 なお VBA64 では、列挙値定数 vbLongLong (=20) が定義されています。 ちなみに上記の Variant 値を「Debug.Print TypeName(v)」した場合、 VBA64 では "LongLong" という文字列が返されますが、 VB6 や VBA32 では、TypeName 関数が以下のエラーを返します。 | 実行時エラー '458': | Visual Basic でサポートされていないオートメーションが変数で使用されています。 ちなみに VT_I8 は、Windows 2000 以下の OS では利用できません。 しかし最近の OS であれば、その Variant 値を四則演算したり、 CStr 等で変換したりすることが、32bit/64bit 共に可能となっています。 ただ、やはり VBA32 ではサポートされない型なので、 32bit版環境で使うなら、値を受け取った後で「CDec関数」で 変換しておくと良いでしょう。(64bit版VBAでは、CLngLng関数でOK) この他、VB2005 以降で追加されたプリミティブ型 (SByte, UShort, UInteger, ULong)も、VBA では サポートされていませんので、取扱いにご注意ください。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.