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を閉じてください。

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

Hyper-V上のUbuntuで解像度を変えたい

Hyper-V上にUbuntuの仮想環境を作成すると、解像度が1152X864に固定されてしまっています。
Hyper-Vを全画面表示しても当然ダメ。

これを解決するにはGrubの設定ファイルにHyper-Vのビデオ解像度の値を追加します。

PCの環境は以下で行っています。
・ホストOS = Windows8.1 Pro(64bit)
・ゲストOS = Ubuntu15.04 DeskTop(32bit)
・Hyper-V世代 = 第1世代

/etc/default/grubを管理者権限でエディターを使って開きます。
viを使う場合は、以下のようにします。

$ sudo vi /etc/default/grub

表示されたら、「GRUB_CMDLINE_LINUX_DEFAULT」の項目を探します。
私の環境では、以下のようになっていました。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

この項目に「video=hyperv_fb:[解像度]」を書き加えます。
以下では解像度を1600×900に設定しています

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1600x900"

書き換えたら、保存します。
次に以下のコマンドを管理者権限で実行します。

$ sudo update-grub

最後に再起動します。
これで指定した解像度で表示されます。

VmWarePlayer起動時、「パワーオン中にエラーが発生しました」が表示される。

あまり無いことだと思いますが、VMWare Playerで仮想環境を開始する際に
「パワーオン中にエラーが発生しました」というメッセージボックスが表示され、起動できない事があります。

その場合は、下記の手順でサービスの「VMware Authorization Service」が起動されているか確認しましょう。
1.キーボードでWindowsキー+Rを押す
2.「ファイル名を指定して実行」のダイアログが表示されたら「services.msc」と入力
3.サービスの画面が表示されるので「VMware Authorization Service」の状態を確認
4.「VMware Authorization Service」の行をマウスで右クリック→表示されたメニューから「開始」を選択

このサービスは通常、「自動」で開始する設定になっていると思います。
それでも何らかの原因で自動開始できないこともあるようですので
VMWareが起動しないときには、確認してみましょう。

Ubuntuアップグレード後にgrub_term_highlight_color not found

Ubuntu13.10をUbuntu14.04にアップグレードしたところ、
‘grub_term_highlight_color’ not found
とGrub Rescue画面が出て起動できなくなりました。

デュアルブートのWindowsも起動できません・・・
Grubが駄目になっているのですから当然です。

一応、既知のバグとなっているようですね。
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1289977

この中に解決として以下の文章があります。
To fix the problem I had to boot to my persisting Ubuntu installation (e.g. using Super Grub Disk) and had to reinstall grub on my boot partition: “sudo grub-install –recheck /dev/sdx”
つまり・・・

sudo grub-install --recheck /dev/sdx

このコマンドが核心のようです。

で、無事起動した手順を記述します
(以下の海外サイトにあった手順を参考にしています)
http://askubuntu.com/questions/449680/upgrading-from-13-10-to-14-04-broke-grub

1:LiveCDで起動
まず何にしてもシステムを起動して中のファイルにアクセスしないといけません。
私はUbuntu13.10(64bit)のCDが手元にあったのでそれを使用しました。
起動できるならUSBなりなんでもいいです。

2:インストール済みのパーティションを把握
Live版で起動したら、インストール済みのUbuntuのパーティションを調べます。
lsコマンドで/media内のファイルを見ると楽かと思います。
私の環境では/media/ubuntu/199~という名称になっていました。
その後dfコマンドで一覧を表示し、/media内のファイルがどのデバイスに関連付られているかを見ます。
自分の環境では
/dev/sda5でした。

3:デバイスのマウント

sudo mount /dev/sda5 /mnt

/dev/sda5は手順2で見つけたデバイス名に置換えてください。

4:その他重要なファイルシステムのマウント

sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

5:chrootコマンドを実行し、起点のディレクトリを変更

sudo chroot /mnt

以下、rootユーザで実行されます。

6:GRUBを更新

update-grub

参考にしたサイトには「/boot/grub/grub.cfg」がない場合に行うとありますが、とりあえず実行しました。

7:GRUBの再インストール

grub-install /dev/sda

/dev/sdaは環境により書き換えてください。 番号は付けないようにします。
(つまり「/dev/sda5」なら「/dev/sda」となる。)

8:GRUBのチェック

grub-install --recheck /dev/sda

いよいよ核心のコマンドです。 手順7と同じく/dev/sdaは環境により書き換えてください。

9:chroot終了~再起動
CTRL+Dを入力し、chrootを終了します。
その後システムを再起動してください。

上記手順で、見事にGrubが起動しました。
めでたし めでたし。

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

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

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

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

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

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

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

MyBase.WindowState = FormWindowState.Maximized

SQLServerでのキーの追加スクリプト

テーブル仕様が一度は固まったけど、やっぱりこの項目がキーじゃないとやばい!
といった時には、以下の様なスクリプトを流すと解決して幸せです。

USE データベース名
GO
ALTER TABLE テーブル名 DROP CONSTRAINT プライマリキー名
GO
ALTER TABLE テーブル名 ADD PRIMARY KEY(
キー項目1,
キー項目2)
GO

一度Dropで削除して、その後追加します。

例文

USE [DB_NERV]
GO
ALTER TABLE [dbo].[Staff] DROP CONSTRAINT [PK_Staff]
GO
ALTER TABLE [dbo].[Staff] ADD PRIMARY KEY(
[ID] ASC,
[BirthDay] ASC)
GO

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()
;