64ビット版VBA用の64ビット版COMライブラリを作る
Office 2010(以降?)は32ビット版と64ビット版の両方が提供されており、それぞれVBAも32ビット版と64ビット版として組まれています。このとき、32ビット版は今まで通りのVBAですが、64ビット版のVBAは「Declareステートメント」を初めとしていくつかの機能が64ビット版Windowsに合わせるように改良が加えられています。
また、VBAでは通常のVisual Basic(6.0シリーズまで)と同様に「参照設定」から外部COMライブラリを読み込むことがでますが、このCOMライブラリは32ビット版と64ビット版の両方を読み込むことが可能です。
ここで64ビット版のCOMライブラリを作成したいとなった場合に、どうしても(インターフェイス以外の)ポインタデータを扱いたい時、ポインタの型をどうするかという問題があります。32ビット版であれば単純にIDLファイルに
typedef long LPVOID;
などと定義しておいて使いまわせばよかったのですが、64ビット版ではポインタ型を「long」として使うことはできません。そこで、(MIDLのキーワードである)「hyper」や「__int64」などを用いてもいいのですが、新しいMIDL(バージョン5.01より上)では「__int3264」というキーワードが使用できます。なおWindows標準ヘッダーである「basetsd.h」をインポートすると「LONG_PTR」型などを使用することが出来るため、こちらを使用するのが望ましいとされています。
実際の使い方は以下のようになります。
「basetsd.h」を使わない場合
#if __midl > 501 typedef __int3264 LPVOID; #else #ifdef _WIN64 // 適宜ビルドオプションなどで「_WIN64」の定義を切り替える typedef hyper LPVOID; #else typedef long LPVOID; #endif #endif // __midl > 501
「basetsd.h」を使う場合
import "basetsd.h"; typedef LONG_PTR LPVOID;
ちなみに、64ビット版VBAでは「LongPtr」型と「LongLong」型が導入されており、MIDLにおける型との対応は以下の通りになります。
MIDL | VB |
---|---|
short | Integer |
int | Long |
long | Long |
hyper | LongLong |
__int3264 | LongPtr |
最終更新日: 2011/04/17