Programming Field - プログラミング Tips

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における型との対応は以下の通りになります。

MIDLVB
shortInteger
intLong
longLong
hyperLongLong
__int3264LongPtr

最終更新日: 2011/04/17