Archive for the ‘Vista’ Category

windows vista sp2 が来てました。
家に帰ったらさっそく入れてみます。

colinux 0.7.4 が来てました。
カーネルの更新や、ネットワークブリッジの更新なんかがあるみたい。
でも vista 64bit には相変わらず非対応。。

visual studio 2010 beta1 が一般公開されてます。
STL の見直しや、一部 C++0x 対応などがあるらしいです。

windows 7 RC が一般公開されています。

windows xp 入手困難に
新しい windows が見えてきましたけど、xp の在庫がなくなって来たようです。
欲しい人はお早めに。

 
amazon のアフィリエイトアカウント取ってみた。
ぶっちゃけアフィリエイトはどうでもいいんだけど、写真付きでリンク貼れるのが便利なのよね。

最近読んだ本

きじねこの高木氏の本。
組み込みといわず、C/C++のちょっとマイナーな話が面白い。


Faith and Brave のアキラ氏、東方算程譚のεπιστημη氏の共著。
template の仕組みやテクニックについてわかりやすく書かれている。
Modern C++ Design には挫折してしまったという人はこちらオススメ。

今読んでる本


まだ全然読めてないー

XPの後、vista 入れたんだけどばっちり動く。。
前と同じで どっちも Cドライブ なんだけどな・・・
vista 64bit は ディスクからしかインストールできないので、がんばってもCドライブ になるというオチ。

ちゃんと起動したときのブート設定メモ。
ちなみにハードディスクの起動優先度は XPのディスク > vista のディスク になってる。

C:\>bcdedit /enum

Windows ブート マネージャ
——————————–
identifier {bootmgr}
device partition=D:
description Windows Boot Manager
locale ja-JP
inherit {globalsettings}
default {current}
displayorder {ntldr}
{current}
toolsdisplayorder {memdiag}
timeout 30

Windows レガシ OS ローダー
——————————–
identifier {ntldr}
device partition=D:
path \ntldr
description Microsoft Windows XP

Windows ブート ローダー
——————————–
identifier {current}
device partition=C:
path \Windows\system32\winload.exe
description Microsoft Windows Vista
locale ja-JP
inherit {bootloadersettings}
osdevice partition=C:
systemroot \Windows
resumeobject {ユニークなGUID}
nx OptIn

Microsoft が トク得キャッシュバック キャンペーン なるものをやってます。

期間中に
「Windows Vista Ultimate 通常版、Windows Vista Ultimate アップグレード版、Windows Vista Home Premium 通常版」
を購入すると、それぞれキャッシュバックがあるとのこと。

これって、ダウングレード前提で考えると XP 買えてキャッシュバックあるってことよね?
XP買うなら、vista 買ってダウングレードした方が安いですYO。

※ダウングレードには XP のディスクが必要なので注意

普段使うのは MultiByteToWideChar とかな自分です。
変換関数は CのランタイムとWin32 API が用意されているけど、確か挙動が違うとどっかに書いてあったんだよね。
ぐぐったら出てきました -> 理ろぐ

自分で調べてなかったので、調べたくなりました。コードは 理ろぐ のを改造。
結論から言うと、locale 設定するだけでどちらでも正しい結果が出ます。

まぁ、ここまでが序章。
locale 設定しなくても Win32 API の方は正しく動いているように見えますので確認します。

C++:
  1. #include <iostream>
  2. #include <locale>
  3. #include <iomanip>
  4. #include <stdlib .h>
  5. #include <windows .h>
  6.  
  7. using namespace std;
  8. const int ARRAY_SIZE = 64;
  9.  
  10. std::ostream& couthex(const int n) {
  11.     return cout <<"Ox" <<setw(n) <<setfill('0') <<setbase(16);
  12. }
  13.  
  14.  
  15. void dump(unsigned char *data) {
  16.     for (int i=0; ; i++) {
  17.         if (i%16 == 0 && i != 0) cout <<endl;
  18.         couthex(2) <<static_cast<int>(*(data+i)) <<" " <<flush;
  19.  
  20.         if ((*(data+i) == 0) && (*(data+i+1) == 0)) break;
  21.     }
  22.  
  23.     cout <<endl <<endl;
  24. }
  25.  
  26.  
  27. bool charToWchar(const char* src, wchar_t* dst1, wchar_t* dst2) {
  28.     ::ZeroMemory(dst1, sizeof(wchar_t) * ARRAY_SIZE);
  29.     ::ZeroMemory(dst2, sizeof(wchar_t) * ARRAY_SIZE);
  30.  
  31.     bool retval = true;
  32.     if (::mbstowcs(dst1, src, sizeof(wchar_t) * ARRAY_SIZE) == -1) {
  33.         cout <<"mbstowcs : error" <<endl;
  34.         retval = false;
  35.     }
  36.  
  37.     if (::MultiByteToWideChar(CP_ACP, 0, src, -1, dst2, sizeof(wchar_t)* ARRAY_SIZE) == 0) {
  38.         cout <<"MultiByteToWideChar : error" <<endl;
  39.         retval = false;
  40.     }
  41.  
  42.     return true;
  43. }
  44.  
  45.  
  46. bool wcharToChar(const wchar_t* src, char* dst1, char* dst2) {
  47.     ::ZeroMemory(dst1, sizeof(char) * ARRAY_SIZE);
  48.     ::ZeroMemory(dst2, sizeof(char) * ARRAY_SIZE);
  49.  
  50.     bool retval = true;
  51.  
  52.     if (::wcstombs(dst1, src, sizeof(char) * ARRAY_SIZE) == -1) {
  53.         cout <<"wcstombs : error" <<endl;
  54.         retval = false;
  55.     }
  56.  
  57.  
  58.     if (::WideCharToMultiByte(CP_ACP, 0, src, -1, dst2, sizeof(char)* ARRAY_SIZE, 0, 0) == 0) {
  59.         cout <<"WideCharToMultiByte : error" <<endl;
  60.         retval = false;
  61.     }
  62.  
  63.     return true;
  64. }
  65.  
  66.  
  67. int main(int argc, char** argv)
  68. {
  69.     const char    csrc[]"Mrブギータンブリンマン";
  70.     const wchar_t wsrc[] = L"Mrブギータンブリンマン";
  71.     char    cdst1[ARRAY_SIZE] = "";
  72.     char    cdst2[ARRAY_SIZE] = "";
  73.     wchar_t wdst1[ARRAY_SIZE] = L"";
  74.     wchar_t wdst2[ARRAY_SIZE] = L"";
  75.  
  76.     // 1ループ目はロケール設定なし
  77.     // 2ループ目はロケール設定あり
  78.     for (int i=0; i&lt;2; i++) {
  79.         // マルチバイト文字 -> ワイド文字
  80.         {
  81.             charToWchar(csrc, wdst1, wdst2);
  82.             cout <<"mbstowcs : " <<endl;
  83.             dump(reinterpret_cast<unsigned char*>(wdst1));
  84.             cout <<"MultiByteToWideChar : " <<endl;
  85.             dump(reinterpret_cast<unsigned char*>(wdst2));
  86.         }
  87.         // ワイド文字 -> マルチバイト文字
  88.         {
  89.             wcharToChar(wsrc, cdst1, cdst2);
  90.             cout <<"wcstombs : " <<endl;
  91.             dump(reinterpret_cast<unsigned char*>(cdst1));
  92.             cout <<"WideCharToMultiByte : " <<endl;
  93.             dump(reinterpret_cast<unsigned char*>(cdst2));
  94.         }
  95.  
  96.         // locale 設定
  97.         cout <<"-- set locale --" <<endl;
  98.         locale::global(std::locale("japanese"));
  99.     }
  100.  
  101.     return 0;
  102. }

実行結果

mbstowcs :
Ox4d Ox00 Ox72 Ox00 Ox83 Ox00 Ox75 Ox00 Ox83 Ox00 Ox4d Ox00 Ox81 Ox00 Ox5b Ox00
Ox83 Ox00 Ox5e Ox00 Ox83 Ox00 Ox93 Ox00 Ox83 Ox00 Ox75 Ox00 Ox83 Ox00 Ox8a Ox00
Ox83 Ox00 Ox93 Ox00 Ox83 Ox00 Ox7d Ox00 Ox83 Ox00 Ox93 Ox00

MultiByteToWideChar :
Ox4d Ox00 Ox72 Ox00 Oxd6 Ox30 Oxae Ox30 Oxfc Ox30 Oxbf Ox30 Oxf3 Ox30 Oxd6 Ox30
Oxea Ox30 Oxf3 Ox30 Oxde Ox30 Oxf3 Ox30 Ox00

wcstombs : error
wcstombs :
Ox4d Ox72 Ox00

WideCharToMultiByte :
Ox4d Ox72 Ox83 Ox75 Ox83 Ox4d Ox81 Ox5b Ox83 Ox5e Ox83 Ox93 Ox83 Ox75 Ox83 Ox8a
Ox83 Ox93 Ox83 Ox7d Ox83 Ox93 Ox00

-- set locale --
mbstowcs :
Ox4d Ox00 Ox72 Ox00 Oxd6 Ox30 Oxae Ox30 Oxfc Ox30 Oxbf Ox30 Oxf3 Ox30 Oxd6 Ox30
Oxea Ox30 Oxf3 Ox30 Oxde Ox30 Oxf3 Ox30 Ox00

MultiByteToWideChar :
Ox4d Ox00 Ox72 Ox00 Oxd6 Ox30 Oxae Ox30 Oxfc Ox30 Oxbf Ox30 Oxf3 Ox30 Oxd6 Ox30
Oxea Ox30 Oxf3 Ox30 Oxde Ox30 Oxf3 Ox30 Ox00

wcstombs :
Ox4d Ox72 Ox83 Ox75 Ox83 Ox4d Ox81 Ox5b Ox83 Ox5e Ox83 Ox93 Ox83 Ox75 Ox83 Ox8a
Ox83 Ox93 Ox83 Ox7d Ox83 Ox93 Ox00

WideCharToMultiByte :
Ox4d Ox72 Ox83 Ox75 Ox83 Ox4d Ox81 Ox5b Ox83 Ox5e Ox83 Ox93 Ox83 Ox75 Ox83 Ox8a
Ox83 Ox93 Ox83 Ox7d Ox83 Ox93 Ox00

VS2008 st でコンパイルしました。
cl /EHsc /DWIN32 /MD /D_NODEBUG /D_CONSOLE convert.cpp

ちとソースが長いですが、結果を見ると locale 設定前でも Win32 API の方の変換は正しいことが確認できます。
ランタイムの方は locale を設定しないと、変換エラー出てますね。 (wcstombs)

windows で文字列の変換を行うときは Win32 API がよさそうですね。 Continue reading ‘VisualStudio でのマルチバイト文字とワイド文字の変換’ »

前回のエントリで書いたコンストラクタの問題。
それの解答ってことで。間違ってるって場合はコメントくだちい。

まず、何が問題であったか。
前回のコードでは bad_alloc をまったく考えていないですよね。
で、コンストラクタ内で例外が発生し、コンストラクタが正常終了しないと、デストラクタが呼ばれません。これ重要。
なぜならオブジェクトとして生成されないんだから。

初期化リストやコンストラクタ内でメモリ確保を行って、 bad_alloc が発生するとどうなるでしょう。例えば one_ では確保成功、two_ で確保失敗のようなケースです。
one_ で確保したメモリはデストラクタが呼ばれないので解放されんのです。リーク。

解決策としては下記のようなコードを書きます。

C++:
  1. class Hoge
  2. {
  3. public:
  4.     Hoge() : one_(0), two_(0)
  5.     {
  6.         try {
  7.             one_ = new A;
  8.             two_ = new B;
  9.         }
  10.         catch (...) {
  11.             delete one_;
  12.             delete two_;
  13.         }
  14.     }
  15.  
  16.     ~Hoge() {
  17.         delete one_;
  18.         delete two_;
  19.     }
  20.  
  21. private:
  22.     A* one_;
  23.     B* two_;
  24. };

先日のコードだと長いので要素を減らしましたが、やってることといえば 例外をキャッチして後始末をする ってだけです。
メモリ解放に失敗してもコンストラクタは成功し、デストラクタも呼ばれます。
初期化リストではヌルポでも入れておきましょう。

# Seasons 氏に言われたので 補足しときますね。
# 上記例では int でメモリ確保してますけど、これは例ですので、 class とかに置き換えて考えてくだちい。

# アキラ 氏につっこみ貰いましたので、ソースを修正しました (2008/06/10)
# ついでに、クラスが持つメンバ変数を class A, class B のようなものにしてみました (2008/06/10)

Windows Vista を利用するようになってからは、一緒にインストールした Visual Studio 2008 (VS2008) を利用しています。
以前日記で書きましたが、Visual Studio 2005 (VS2005) も入れてあります。
Vista 上で VS2005 を利用すると結構問題があるようです → Windows Vista で動作する Visual Studio
管理者権限にしていても動作が不安定ってのはやばいよなぁー。
新しいサービスパックでの対処に期待しておきます。

仕事から帰ってからは Vista の環境構築を少しづつやってます。
今日は DirectX SDK を入れました。
インストールに関しては特に問題は無いので特に書くこともないのですが。

入れた DirectX SDK は以下2つ。
DirectX SDK - October 2004
DirectX SDK - March 2008

実際にゲーム作成に利用する場合、static-link な SDK の方が好ましいよね。(d3dx9_29.dll が無いとかのエラーが出ませんし
DirectX SDK は December 2004 が static-link できる最終バージョン。
でも今公開されているドキュメントは October 2004 なので、Octber 2004 を入れます。
もうひとつのSDKは最新版の March 2008。グラボ買ってから DX10 で遊ぶために入れたSDK。

ちなみに、こいつでビルドすると d3dx9_37.dll が必要といわれる。最新のランタイムが必要になりますと。

ぐぐったら最初に出てきた y_mashiro 氏のページ見ながらビルドした。
何か一回エラー出てとまったけど、もう一回ビルドし直したらうまくいったみたい(何だそりゃ
clean はしてない。何でエラー出たんだろう。コンパイルは時間かかるから原因調べるのしんどいっす。

使ったオプションは
-platform win32-msvc2005
これだけ。

QTDIR とか環境変数指定って必要ないんだっけかな。
ともあれ、vista + VS2008 でもビルドはできましたとさー。

XP のときに使っていた coLinux を Vista に運んできたのですが動きませんでした。
最新版の coLinux0.72 では Vista対応していたのでそのへんのメモ。
単なる移行作業ですので、はじめからインストールしたい人向けの話じゃないです。
あと、coLinux0.7.2 でカーネルが更新されているのが良いですね。

ネットワークをブリッジで接続する。
Vista たんではどうやるかわからなかったので、google 先生に教わりました → ここ
これで TAP の準備完了。

次に設定ファイルですが、 XML 形式をやめている点が異なりますね。
以前のXML形式を見ながら、自分の記述した内容は以下。

HTML:
  1. kernel=vmlinux
  2.  
  3. cobd0="e:\Linux\img\ubuntu4gb.img"
  4. cobd1="e:\Linux\img\ubuntu-swap.img"
  5.  
  6. cofs0="c:\"
  7. cofs1="d:\"
  8. cofs2="e:\"
  9.  
  10. root=/dev/cobd0
  11. ro
  12. initrd=initrd.gz
  13. eth0=tuntap, "TAP"

XML のとほとんど変わってません。書き方が違うだけ。
この記述の方がすっきりしていて良いですな。

これを config.ini のような名前で保存し

colinux-daemon.exe "@config.ini"

で起動します。
これで Vista への移行完了であります。

vista になって3日目くらいなのですが。
何かファイルが消せません。消せないファイルは、 C:\cygwin
こいつはXPから付いてきたファイルのようで。
そもそも vista を入れるときに XP のファイルを全削除しないのね。フォーマットとかも指定できなかったし。

で、この消えないファイル。アクセス権限が無いとかほざきやがるわけです。
俺様 Administorator だぜー?何故消えないーーー、むきーー
となりながら格闘すること数時間。
海外サイトにブーーンと飛んで調べたりしたのだけど、結局消えない。なんだ、このゴミファイルは。

最終的に vista を再インストールしました。めでたしめでたし。