Windows7のVB6開発環境でCOMCTRL.OCX系のエラーが出る場合の対処法

初期のWindows7では問題なかったのですが、WindowsUpdateでOSが更新されていると、VB6開発環境で開けないプロジェクトが出てきます。特にCOMCTRL.OCXに関連するものが。

環境: Windows7(SP1) 32bit
   VisualStudio6.0(SP6)

まずはレジストリに再登録を行います。
通常、VB6(SP6)がインストールされているならC:\Windows\System32\にはCOMCTRL.OCXは存在するはずですので、以下のコマンドを管理者権限で上げたコマンドプロンプトで実行します。

regsvr32 C:\Windows\System32\MSCOMCTL.OCX

PCを再起動します。

次にタイプライブラリを再定義しなおします。タイプライブラリとはCOMオブジェクトへのアクセスを行うためのインターフェースのライブラリです。ここがキモとなります。
コマンドプロンプトを管理者権限であげて、以下のディレクトリに移動します。

CD C:\Windows\Microsoft.NET\Framework\v4.0.30319\

続いて同ディレクトリの「regtlibv12.exe」を使用してタイプライブラリを再定義します。

regtlibv12.exe C:\Windows\system32\msdatsrc.tlb

PCを再起動します。

VB6を管理者権限で起動します。
管理者権限はVB6を右クリックしプロパティ→互換性タブを開き「管理者としてこのプログラムを実行する」にチェックを入れます。

エラーとなっているプロジェクトを開きます。
この時点では、まだOCXのエラーメッセージは表示されます。

画面上部のプロジェクト→コンポーネントを開きます。
画面の参照ボタンを押します。System32のOCXを選択するダイアログが開かれるので、COMCTRL.OCXを選択します。[Microsoft Windows Common Control6.0(SP6)]にチェックが付きます。

保存してVB6を閉じてください。

以降、問題なくプロジェクトが開けると思います。

コントロールのサイズ変更が出来ない(VB 継承フォーム)

環境
OS:Windows7 SP1
開発環境:VisualBasic2010 ExpressEdition SP1

ベースとなるフォームを作成し、そのフォームを継承して別フォームを作成するスタイルはよく行われることだと思います。ところが、このようにフォームを継承した時に継承した先に貼り付けたコントロールのサイズが変更できなくなる、という事があります。

原因:
ベースとなる継承元フォームのWindowStateプロパティを変更したため。

WindowStateプロパティはフォームの最初の表示状態を決めるものです。
ここを「Maximized」や「Minimized」というように初期状態の「Normal」から変更すると、継承先のフォームに貼り付けたコントロールのサイズ変更が何故かできなくなります。

対策:
画面デザインでWindowStateプロパティを変更している場合は「Normal」に戻します。
継承元フォームのLoadイベントやコンストラクタ内でプロパティの変更をコードで記述している場合、まずコメントアウトか削除します。その後リビルドするか一度実行するなりしてください。これで継承先フォームに貼り付けたコントロールのサイズ変更が出来るようになると思います。

WindowStateを変更する場合は、継承先フォームのコンストラクタ内などで実行時に変更するようにしましょう。

MyBase.WindowState = FormWindowState.Maximized

SQLServerCEのImage型における画像データの取扱い

環境
・SQLServer CompactEdition 3.5
・VisualStudio2010 SP1 (VB)

SQLServerのImage型は廃止予定らしいので、あまり一生懸命追いかけなくてもいいと思うのですが、
Image型を使用して画像の出し入れをする必要に迫られたので、描いておきます。

○テーブル構造 (テーブル名:PilotData)
UserID     nvarchar(50)
UserName   nvarchar(100)
Photo1      image


1.Image型に画像データを格納する

'画像データをバイト配列にする。
Dim stream As New System.IO.FileStream("C:\asuka.jpg", IO.FileMode.Open, IO.FileAccess.Read)
Dim reader As New System.IO.BinaryReader(stream)
Dim photo As Byte() = reader.ReadBytes(stream.Length)
reader.Close()
stream.Close()

'SQLCeConnectionオブジェクトの用意
Dim conn as New SqlCeConnection("Data Source=|DataDirectory|\NERV.sdf")
conn.Open()

’SQLCeCommandオブジェクトの用意
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
'SQL文の設定
cmd.CommandText = "INSERT INTO PilotData(UserID, UserName, Photo1) VALUES (@UserID, @UserName, @Photo1)
’パラメータの格納
cmd.Parameters.Add("@UserID", SqlDbType.NVarChar).Value = "Asuka"
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = "アスカ・ラングレー"
cmd.Parameters.Add("@Photo1", SqlDbType.Image, photo.Length).Value = photo
’コネクションオブジェクトとの紐付け
cmd.Connection = conn

'実行
cmd.ExecuteNonQuery()
;


2.Image型から画像データを取り出しPictureBoxに表示する。

'SQLCeConnectionオブジェクトの用意
Dim conn as New SqlCeConnection("Data Source=|DataDirectory|\NERV.sdf")
conn.Open()

’SQLCeCommandオブジェクトの用意
Dim cmd As New System.Data.SqlServerCe.SqlCeCommand
'SQL文の設定
cmd.CommandText = "SELECT * FROM PilotData WHERE UserID = @UserID "
’パラメータの格納
cmd.Parameters.Add("@UserID", SqlDbType.NVarChar).Value = "Asuka"
’コネクションオブジェクトとの紐付け
cmd.Connection = conn

'実行
Dim ds As New DataSet
Using adapter As New SqlCeDataAdapter(cmd)
   adapter.Fill(ds)
End Using

'データをPictureBoxに表示する。
Dim b As Byte() = DirectCast(ds.Tables(0).Rows(0)("Photo1"), Byte())
Dim stm As New MemoryStream(b)
PictureBox1.Image = System.Drawing.Image.FromStream(stm)
stm .Dispose()
;