64bit対応ユーザーコントロール作成方法

64bitに対応したユーザーコントロール(カスタムコントロール)を作成するには、前提条件として

 

Visual Studio はOSが64bitであっても32bitで動作している!

 

という点に注意しないといけません。

つまり、プラットフォームを64bitで作成したユーザーコントロールをVisual Studioのフォームデザイナでフォーム上に配置すると、32bitプログラムから64bitプログラムを呼び出す事になるので、フォームデザイナがエラーとなり、フォームを表示してくれません。

 

これを回避するためには、ユーザーコントロールのプラットフォームをAny CPUに設定して下さい。

 

この時点で、Any CPUの設定がないC++/CLIのユーザーコントロールは64bit対応ができないという事になります。

これを知らずにC++/CLIのユーザーコントロールを32bitである程度作成してしまい、64bitに対応させようと思った時に、エライ目に会いました...→結局、C#で作り直すハメに。

 

次に私がハマったのが、ユーザーコントロールからアンマネージのライブラリを呼ぶ場合の処理。

 

作成したプログラムのプラットフォームがAny CPUの時の挙動ですが、

32bitOSの場合:32bitのライブラリを呼び出す

64bitOSの場合:64bitのライブラリを呼び出す

となります。

 

つまり、64bitOS環境でユーザーコントロールを開発すると、Visual Studioで開発中にフォームデザイナでは、Any CPUのユーザーコントロールから、64bitのライブラリを呼び出そうとします。

ユーザーコントロールはフォームに配置した時点で、コントロールのプロパティやコンストラクタ、各種イベント処理が動いてしまうので、この時に64bitライブラリの関数が呼ばれてしまうと、フォームデザイナがエラーとなってしまいます。

 

これを回避するには、フォームがデザインモードかどうかを調べる

 System.ComponentModel.Component.DesignModeプロパティ

を用います。

この値がtrueの場合、64bitライブラリの関数を呼び出さないようにすると、回避できます。

 

さらに話をややこしくするのが、DesignModeプロパティはコンストラクタや入れ子となったユーザーコントロールでは正しい値が取得できません

そのため、DesignModeプロパティを取得する際には注意して下さい。

(参考)

http://support.microsoft.com/kb/839202/ja

http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/d946a597-0ba4-4880-b99b-13c728e2f39f

 

まとめると、

●ユーザーコントロールはVB.NETもしくはC#でプラットフォームをAny CPUにして作成する。

●デザイン時に64bitライブラリの関数を呼び出さい。

 

という感じでしょうか?

 

VB.NETやC#だけで作るならプラットフォームは全てAny CPUにしておくと、あまり64bit対応の事は気にしなくても大丈夫ですね。

また、逆に32bit対応のライブラリしかなく、32bitで動くプログラムを作る場合は、64bit対応のライブラリが呼び出されないように、プラットフォームをAny CPUにはせずに、Win32に設定しておく必要があります。

 

Visual Studioへ戻る

【Visual Studio】コントロールの配置順序を変更する方法

フォーム上に先にピクチャボックスを配置してしまい、後からツールバーを配置したくなった時、ピクチャボックスを親にドッキングしたときに、ピクチャボックスがツールバーの下側に回り込んで、困った事は無いでしょうか?(私はたまにやってしまいます。)

 

ピクチャボックスを先に配置し、ツールストリップを後から追加し、ピクチャボックスを親にドッキングする場合

 

 

ピクチャボックスがツールストリップの下に回り込んでしまう例↓

 

 

本来であるなら、ツールストリップを先に配置し、次にピクチャボックスを配置すれば問題ないのですが、上図の様になってしまった場合は、ピクチャボックスをマウス右クリックで選択し、最前面へ移動をクリックすすると、ピクチャボックスがツールストリップの下へ配置されます。

 

もしくは逆に、ツールストリップを右クリックし、最背面へ移動をクリックすると、同様にピクチャボックスがツールストリップの下側へ配置させます。(こっちの方が汎用的ですね。)

 

 

すると、このよう↓にピクチャボックスがツールストリップの下側に来てくれます。

 

 

これを知る前までは、ピクチャボックスを切り貼りして、順番を変えていました...

 

Visual Studioへ戻る

【C++/CLI】VB.NET固有の関数を使用する方法

.NET Framework ではVisual Basic.NETであっても、ただのVisualBasicという名前空間であるだけなので、C#やC++/CLIからVB.NET固有の関数を使うことが可能です。

 

以下、VB固有の関数の代表格のInputBox関数の使用方法を紹介します。

 

まず、VisualBasicの名前空間を参照できるように参照設定を行います。

 

プロジェクトの名前の部分で右ボタンをクリックし、参照を選択します。

 

 

次に新しい参照の追加ボタンをクリックします。

 

 

すると、使用可能な.NETの名前空間を表示されるので、この中からMicrosoft.VisualBaicを選択しOKボタンをクリックします。

 

 

すると、現在参照設定している名前空間の一覧にMicrosoft.VisualBasicの名前か追加されます。

 

 

これで準備は完了です。

 

実際にInputBoxを呼び出すのは、こんな感じ↓です。

 

String^ str = Microsoft::VisualBasic::Interaction::InputBox(“入力文字?”, “タイトル”, “初期値”, -1, -1);

 

とすると、このよう↓に表示されます。

 

 

C++からVBの関数が呼べてしまうのは不思議な感じもしますが、他にも使いたいVBの関数があったので、今回わざわざ記事にしてみました。