新規記事の投稿を行うことで、非表示にすることが可能です。
2014年07月15日
GetVersionEx が Win8.1 からは使えなくなったようだ
従来のコードをメンテナンスしている際、Win8.1 対応コードを追加しようとしたが、びっくりの結果がわかった
やろうとしていたのは以下のようなこと
ところが、上記os.dwMinorVersionの値が、Win8.1 上で実行しても Win8 を示す2が返ってきてしまったのだ(本来3が返ってきてほしかった)
MSDNで質問してみたら、すぐに回答が付き、理由がわかった
要は GetVersionEx はマニフェストに応じて異なるバージョンを返すということだった(なぜそうしたかの合理的な理由は思い浮かばなかったが、ま、しょうがない)
GetVersionEx の解説
やろうとしていたのは以下のようなこと
OSVERSIONINFOEX os = {0};
os.dwOSVersionInfoSize = sizeof(os);
GetVersionEx((OSVERSIONINFO*)&os);
switch ( os.dwMajorVersion ) {
case 6:
switch ( os.dwMinorVersion ) {
case 0: return "Vista";
case 1: return "Win7";
case 2: return "Win8";
case 3: return "Win8.1";
}
break;
}
ところが、上記os.dwMinorVersionの値が、Win8.1 上で実行しても Win8 を示す2が返ってきてしまったのだ(本来3が返ってきてほしかった)
MSDNで質問してみたら、すぐに回答が付き、理由がわかった
要は GetVersionEx はマニフェストに応じて異なるバージョンを返すということだった(なぜそうしたかの合理的な理由は思い浮かばなかったが、ま、しょうがない)
GetVersionEx の解説
FbConsole が間違ったSQLを提示する
Firebird データベース管理コンソールとして、昔からある FbConsole.exe を使い続けている
これは使いやすく重宝しているのだが、今となってはいくつかバグがあり、注意を要する
1) まず、一旦ログインし、ログアウトするとログインできなくなる (プログラムを起動し直す必要がある)
2) テーブル表示ペインで、UTF-8文字列が化けてしまう
そしてさらに今回発見したのが、メタ情報から取得できるトリガーSQLが、不正な文法になっているケースである
例えば、以下のようなトリガーを作る
これをデータベースのメタ情報SQLで見てみると以下のようになってしまう
どこがまずいかというと、2行目のACTIVE POSITION 0という部分である
この部分は正しくはACTIVE BEFORE INSERT OR UPDATE POSITION 0でなくてはならない
信用してこのまま流してしまうと、エラーとなりトリガーが作成されないままとなってしまう
プログラム自体を直すことは今となってはもう無理なので、手作業で対処するしかない
これは使いやすく重宝しているのだが、今となってはいくつかバグがあり、注意を要する
1) まず、一旦ログインし、ログアウトするとログインできなくなる (プログラムを起動し直す必要がある)
2) テーブル表示ペインで、UTF-8文字列が化けてしまう
そしてさらに今回発見したのが、メタ情報から取得できるトリガーSQLが、不正な文法になっているケースである
例えば、以下のようなトリガーを作る
CREATE TRIGGER MY_TEST_TRIGGER FOR TEST_TABLE
BEFORE INSERT OR UPDATE
AS
BEGIN
new.RecordTimestamp = current_timestamp;
END
これをデータベースのメタ情報SQLで見てみると以下のようになってしまう
CREATE TRIGGER "MY_TEST_TRIGGER" FOR "TEST_TABLE"
ACTIVE POSITION 0
AS
BEGIN
new.RecordTimestamp = current_timestamp;
END
どこがまずいかというと、2行目のACTIVE POSITION 0という部分である
この部分は正しくはACTIVE BEFORE INSERT OR UPDATE POSITION 0でなくてはならない
信用してこのまま流してしまうと、エラーとなりトリガーが作成されないままとなってしまう
プログラム自体を直すことは今となってはもう無理なので、手作業で対処するしかない