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

この部分に関しては、こちらのサイトが参考になりました。
kait's Field C# から Access DB への接続時の x86-x64 の問題
また、AccessのVBA内でDeclareステートメントを利用してDLLを
呼び出している場合、64bitの場合はコンパイルエラーとなります。
これに関しては、32bitと64bitで異なる宣言をする必要があり、
64bit版は「PtrSafe」という宣言を加えなければなりません。
そのため、条件付きコンパイル命令を使用し、以下のように
記述する必要があります。
詳細はMSDNもあわせてご覧ください。
簡単ではありますが、現在の開発で気になっている部分を
メモ書きしてみました。今回は現行システムとの互換性を
優先したためターゲットCPUを「Any CPU」としましたが、
Accessを32bit版で(通常通り)インストールした上で
ターゲットCPUを「x86」にしたほうが手間がかからないのかも
しれません。そのあたりは、プロジェクトごとに最適解を
検討する必要がありそうです。
最後に、Win7パソコンを購入する際「64bitがほしい」という
わがままにこたえてくれたうちの会社に感謝します。
これだけを使う分には問題なく動くようです。そういえば
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が呼び出されるようになります。

この部分に関しては、こちらのサイトが参考になりました。
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がほしい」という
わがままにこたえてくれたうちの会社に感謝します。