久しぶりのプログラマネタです。実は今年に入ってからアプリの
開発をWindows7の64bit版で行っていました。そのなかで、
32bitで開発していたときには遭遇しなかった場面がけっこうあり、
それをどこかでまとめたほうがいいかな、ということでの
覚え書きです。

現在、VB.net2010を使い、DBをSQLServerで開発しています。
これだけを使う分には問題なく動くようです。そういえば
ODBCドライバが32bit用と64bit用があって混乱したりしたな、
そこはまたおいおい調べます。

ただ、今回のシステムでは印刷にMS Access2010を使用して
おり、それがかなりの部分で引っかかってきました。こまかい
ことはまた余裕があるときに書きますが、まずVB.netから
Accessに渡す場合、通常の設定であればAccessの64bit版を
インストールする必要があります。Access2010のDVDには
64bit版が同梱されていますので、そちらからインストールが
可能です。自動起動ではなく、エクスプローラから
「\x64\setup.exe」を起動してください。

また、設定で32bitのAccessに渡すことも可能です。「プロジェクトの
プロパティ」>「コンパイル」>「詳細コンパイル オプション」から
「ターゲットCPU」の設定を変更することにより行います。「Any CPU」
の場合は該当OSに合わせた(64bit版なら64bit版の、32bit版なら
32bit版の)Accessが呼び出され、「x64」「x86」の場合は該当の
Accessが呼び出されるようになります。
CPUSetting
この部分に関しては、こちらのサイトが参考になりました。
kait's Field C# から Access DB への接続時の x86-x64 の問題

また、AccessのVBA内でDeclareステートメントを利用してDLLを
呼び出している場合、64bitの場合はコンパイルエラーとなります。
これに関しては、32bitと64bitで異なる宣言をする必要があり、
64bit版は「PtrSafe」という宣言を加えなければなりません。
そのため、条件付きコンパイル命令を使用し、以下のように
記述する必要があります。
#If VBA7 And Win64 Then
Public/Private Declare PtrSafe Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare PtrSafe Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type
#Else
Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)
Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type
#End If

詳細はMSDNもあわせてご覧ください。

簡単ではありますが、現在の開発で気になっている部分を
メモ書きしてみました。今回は現行システムとの互換性を
優先したためターゲットCPUを「Any CPU」としましたが、
Accessを32bit版で(通常通り)インストールした上で
ターゲットCPUを「x86」にしたほうが手間がかからないのかも
しれません。そのあたりは、プロジェクトごとに最適解を
検討する必要がありそうです。

最後に、Win7パソコンを購入する際「64bitがほしい」という
わがままにこたえてくれたうちの会社に感謝します。