カテゴリ:C/C++/Win32( 131 )

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

MFC の CTreeView(CTreeCtrl)のチェックボックスで、上の階層や下の階層のチェックの制御

ツリーのアイテムをチェックすると、下の階層を全部チェックして、上の階層もルートまでのパスをチェックする。

チェックを外すと、下の階層を全部アンチェックして、上の階層の下の階層のチェックが全部消えていれば、チェックを外す。

という処理。

static void CheckChild(CTreeCtrl* pTree, HTREEITEM hParent, BOOL bCheck)
{
    HTREEITEM hItem = pTree->GetChildItem( hParent );
    while ( hItem != NULL )
    {
        pTree->SetCheck( hItem, bCheck );
        CheckChild(pTree, hItem, bCheck);
        hItem = pTree->GetNextItem( hItem, TVGN_NEXT );
    }
}

static bool IsAnyChildChecked(CTreeCtrl* pTree, HTREEITEM hParent)
{
    HTREEITEM hItem = pTree->GetChildItem( hParent );
    while ( hItem != NULL )
    {
        if(pTree->GetCheck(hItem) || IsAnyChildChecked(pTree, hItem))
        {
            return true;
        }
        hItem = pTree->GetNextItem( hItem, TVGN_NEXT );
    }
    return false;
}

static void CheckParent(CTreeCtrl* pTree, HTREEITEM hChild, BOOL bCheck)
{
    HTREEITEM hParent = pTree->GetParentItem(hChild);
    if(hParent == NULL) return;
    if(bCheck)
    {
        pTree->SetCheck(hParent, bCheck);
        CheckParent(pTree, hParent, bCheck);
    }
    else
    {
        if(!IsAnyChildChecked(pTree, hParent))
        {
            pTree->SetCheck(hParent, bCheck);
            CheckParent(pTree, hParent, bCheck);
        }
    }
}

void CXxxxTreeView::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO : ここにコントロール通知ハンドラ コードを追加します。
    NMTREEVIEW *pNMTree = ( NMTREEVIEW* )pNMHDR;
    TVHITTESTINFO ht = { 0 };
    CTreeCtrl* pTree = &GetTreeCtrl();
    DWORD pos = ::GetMessagePos();
    ht.pt.x = LOWORD( pos );
    ht.pt.y = HIWORD( pos );
    ::MapWindowPoints( HWND_DESKTOP, pNMHDR->hwndFrom, &ht.pt, 1 );
    pTree->HitTest( &ht );

    if ( TVHT_ONITEMSTATEICON & ht.flags )
    {
        // チェックが入る時→チェックが入っていない状態
        if ( !pTree->GetCheck( ht.hItem ) )
        {
            pTree->SetCheck(ht.hItem, TRUE);
            CheckChild(pTree, ht.hItem, TRUE);
            CheckParent(pTree, ht.hItem, TRUE);
            pTree->SetCheck(ht.hItem, FALSE);
        }
        else
        {
            pTree->SetCheck(ht.hItem, FALSE);
            CheckChild(pTree, ht.hItem, FALSE);
            CheckParent(pTree, ht.hItem, FALSE);
            pTree->SetCheck(ht.hItem, TRUE);
        }
    }
    *pResult = 0;
}

[PR]
by isoq | 2009-12-18 21:02 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

HP ProLiant ML 115 G5で、IMAPI v2が正しく動作しない問題の解決方法が見つかりました。

Windows Server 2003 R2 では、IMAPI v2 はサポートされていないのか???で、
OS側を疑っていたのですが、実は、PC本体側の問題と言うことが分かりました。

対象としていたハードは、HP ProLiant ML 115 G5です。
(プロライアントと読むそうです。)

ML 115 G5は、AMDプラットフォーム、Athron/Opteron搭載の
非常に低コストなサーバー用途向けPCです。
チップセットは、NVIDIAのサーバー向け nForce Professional 3400。
このチップセットには、SATA 接続の RAID機能 が搭載されていて、
特別なハードウェアなしに、RAIDを組む事が出来ます。

IMAPI v2 が動作しなかったのが、ML 115 G5ですが、
IntelプラットフォームのML 110 G5 で試したところ、
全く何の問題もなく、IMAPI v2が動作するではありませんか!

どちらも、OSは、Windows Server 2003 R2 Standard Edition。
その違いは、プラットフォームくらいでしょうか?

そこで、システム情報ツールのSIWで、
CD-ROMがOSからどういう風に認識されているのか確認してみました。
比較すると、こんな感じです。

ProLiant ML115G5 とML110G5 とのCD-ROMの認識され方の違い

ここでは、同じHP製の ProLiant ML115G5と、ProLiant ML110G5と、
比較のために、Windows XPがインストールされた xw4600 を比較しています。

ProLiant ML115G5だけが、CD-ROMがSCSI接続と認識され、
接続場所(Location)も、Bus Number 0, Target ID 0, LUN 0 とSCSI形式になっていました。

きっと、これが原因だ!

と思い、なんとかCD-ROMがIDE接続として認識されるようにしようと思い、
デバイスマネージャで、CD-ROMドライブのプロパティを確認しましたが、
設定などは全くなく、困り果てました。

で、見つけたのが、IDE ATA/ATAPIコントローラ グループ以下の
NVIDIA nForce Serial ATA Controller でした。
これ、オンボードのSATAコントローラなんですが、かなり怪しい。
こいつが、SCSIのふりをしているんじゃないだろうか???

ドライバを「標準デュアルチャンネル PCI IDE コントローラ」に入れ替えたところ、、、

やっぱり!

IMAPI v2が無事に動作するようになりました!

RAID機能搭載の特殊なSATAチップと、専用ドライバが問題でした!!

詳しいやり方は、以下の通り。



HP ProLiant ML115 G5 にて、
IMAPIv2 CD書き込みを有効にするための設定
=====================


ProLiant ML 115 には、オンボードのSATAコントローラとして、
NVIDIA nForce Serial ATA Controller が使用されている。

OSをインストールした時点で、このコントローラのドライバが自動的に
インストールされ、OSからSCSI バスに接続されたドライブとして認識されて
しまう。

このドライバをOSがIDEとして認識する標準IDEドライバに変更する事で、
OSからIDEバスト認識され、IMAPI v2からも、正常にアクセスできるように
なる。


設定手順
====


1.デバイスマネージャを開く

2.IDE ATA/ATAPIコントローラを開く

3.NVIDIA nForce ATA Controller を右クリックして「プロパティ」を選択。

4.「ドライバ」タブの「ドライバの更新」ボタンをクリック。

5.ハードウェアの更新ウィザードの開始ウインドウでは、
「◎いいえ、今回は接続をしません」 を選んで、「次へ」をクリック。

6.ハードウェアに付属のインストールCDまたはフロッピー… ウインドウでは、
「◎一覧または特定の場所からインストールする」を選んで、「次へ」をクリック。

7.検索とインストールのオプションを選んでください ウインドウでは、
「◎検索しないで、インストールするドライバを選択する」を選んで、「次へ」をクリック。

8.このハードウェアのためにインストールするデバイスドライバを選択してください ウインドウでは、
「標準デュアルチャンネル PCI IDE コントローラ」を選んで、「次へ」をクリック。

9.全てのNVIDIA nForce Serial ATA Controller に対して、3~8を繰り返します。

10.PCを再起動します。


これで、無事にIMAPI v2が動き出すでしょう!

本当は、NVIDIA nForce Serial ATA Controller の新バージョンなどで、
この辺の問題が解消されると良いのですが、HPのダウンロードサイトを探した
範囲では、新バージョンは無いようでした。

ドライバを「標準デュアルチャンネル PCI IDE コントローラ」にすると、
RAID関連の機能を使用している場合は、問題が発生するかもしれません。
たとえば、RAIDアレイでディスクエラーが発生しても、OSに通知する手段が絶たれる
とか、そういう点で、オンボードRAIDを使っている人には困ったことかもしれません。

(実際、私はオンボードRAID使っていませんので、
 RAIDとの併用の際にどのような弊害があるかは不明です。)

たいてい、オンボードのRAIDは、CPUで処理を行っており、
ソフトRAIDに毛の生えたようなものなのです。
RAID Arrayに使用しているディスクのフォーマットも互換性の問題があり、
そのまま別の種類のマザーボードに接続してもほぼ認識できません。

その点、Windows Server OS の標準機能のソフトRAIDでしたら、
Windows を使用している限り、別のPCにつなげても使えるという、
より柔軟で安心な非常時運用性が期待できます。
また、OS上から管理(ディスクの管理から)もグラフィカルに出来ますので、
Windows を使っていて、オンボードRAIDを使おうと思っているなら、
ソフトRAIDの方が何倍もおすすめです。

私も、高価で、超高速なハイエンドRAID Arrayが必要とされないような用途では、
ほとんどがソフトウェアRAIDを提案しています。

また、最近比較的安価になってきたRAID対応NAS(Network Attached Storage)は、
無停電電源を用意しないような安易な用途では、おすすめできません。
いきなり電源が切れると、3回に1回くらいの割合でクラッシュしますね。
(復旧困難なこともしばしば。。。 ^^;)

その点、WindowsベースのソフトRAIDは、非常に頑丈で、
何度強制終了しても、滅多にクラッシュしません。

このようなプロプライエタリOSの完成度の高さは、評価に値します。
[PR]
by isoq | 2009-12-01 23:37 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

MFCアプリでマウスが遅くなる。。。

Visual Studio 2008 で作成した MFC の SDI アプリケーションが
マウスフォーカスを取得すると、なぜかマウスが遅くなってしまいます。

使用しているマウスは、Logitech/Logicool の Optical Mouse USBで、
サイト上から何故か消えてしまったマウスウェアをインストールして、
マウスをびんびん動くようにしています。

マウスの設定に「ゲーム中は加速を無効にする」というチェックがあったので、
OFFにすると、直りました。

MFCのアプリケーションを「ゲーム」と認識していたようです。
DirectInput などを内部的に使用しているのかもしれません。

... というか、OpenGL を使ったアプリだったからか。。。

Microsoftじゃなくて、自分のせいでした (^^;)
[PR]
by isoq | 2009-11-06 10:57 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

オペレータのエラーってどうしてこうわかりにくいのだ。。。

はまった。。。
[PR]
by isoq | 2009-11-05 03:25 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

バイナリーSTLフォーマットファイルの読み込み

バイナリーのSTLファイルの読み込み方法を調べました。
(STLは、造形などに使われる三角形だけで作成された3次元モデル(CG)データのファイル形式)


STLファイルフォーマット からスクラップ:
バイナリフォーマット

* 構文

バイト数 データ型 データ内容
80 char[ ] 任意の文字列
4 unsigned int 三角形の枚数
- - 1つ目の三角形データ
4 float 三角形の法線ベクトルのX成分値
4 float 三角形の法線ベクトルのY成分値
4 float 三角形の法線ベクトルのZ成分値
4 float 三角形の1点目の頂点のX座標値
4 float 三角形の1点目の頂点のY座標値
4 float 三角形の1点目の頂点のZ座標値
4 float 三角形の2点目の頂点のX座標値
4 float 三角形の2点目の頂点のY座標値
4 float 三角形の2点目の頂点のZ座標値
4 float 三角形の3点目の頂点のX座標値
4 float 三角形の3点目の頂点のY座標値
4 float 三角形の3点目の頂点のZ座標値
2 - 未使用データ
- - 2つ目の三角形データ
4 float 三角形の法線ベクトルのX成分値
4 float 三角形の法線ベクトルのY成分値
4 float 三角形の法線ベクトルのZ成分値
4 float 三角形の1点目の頂点のX座標値
4 float 三角形の1点目の頂点のY座標値
4 float 三角形の1点目の頂点のZ座標値
4 float 三角形の2点目の頂点のX座標値
4 float 三角形の2点目の頂点のY座標値
4 float 三角形の2点目の頂点のZ座標値
4 float 三角形の3点目の頂点のX座標値
4 float 三角形の3点目の頂点のY座標値
4 float 三角形の3点目の頂点のZ座標値
2 - 未使用データ
・・・ - (三角形の法線ベクトルのX成分値から未使用データまでを1枚の三角形データとして三角形枚数分のデータが続く)


VC で C言語、C++互換で書くと、こんな感じかな。

typedef struct tagSTL_FILE_HEADER
{
    char comment[80];                    // オブジェクト名
    unsigned int numberOfTriangles;        // トライアングル数
} STL_FILE_HEADER, *LP_STL_FILE_HEADER;

#pragma pack(push,1)
typedef struct tagSTL_TRIANGLE_ENTRY
{
    float n[3];                            // 三角形の法線ベクトルのXYZ成分値
    float v1[3];                        // 三角形の1点目の頂点のXYZ座標値
    float v2[3];                        // 三角形の2点目の頂点のXYZ座標値
    float v3[3];                        // 三角形の3点目の頂点のXYZ座標値
    unsigned short reserved;            // 未使用データ
} STL_TRIANGLE_ENTRY, *LP_STL_TRIANGLE_ENTRYR;
#pragma pack(pop)

構造体のアラインメントを正しくセットしないと、読んでいくうちにずれちゃう。
この場合は、ズレを考慮して1トライアングルづつ読み込む事も不可能ではないけど、
ディスクアクセスの効率を考えたら、動的メモリ確保で作った配列を使用して、
まとめ読みした方が確実に早いので、その場合は、アラインメントの調整は必須。
(その分メモリを多く要するけど、最近はメモリがたくさん載っている事が多いから、、、)




[PR]
by isoq | 2009-11-01 02:54 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Windows Server 2003 R2 では、IMAPI v2 はサポートされていないのか???

サーバー製品に使用しているOSが とうとうR2しか入手できなくなりました。
R2のテストをしているのですが、ほとんど問題ないのですが、
IMAPIv2を使用した書き込み機能だけがうまく動きません。

IDiscMaster2::get_IsSupportedEnvironment() がエラーを返します。

...

サポートされていない環境ってことだけど、、、

困った。。。
[PR]
by isoq | 2009-10-06 23:23 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

セットアッププロジェクトのコンテンツ ファイル

Visual Studio.NET 2003 でのお話です。

プロジェクトの中で、ファイルのプロパティから、コンテンツ=True にしたファイルが、コンテンツファイルとなる。
コンテンツ ファイルをセットアッププロジェクトに含めると、プロジェクトのルートディレクトリからの相対パスで、ファイルがインストールされる。

つまり、プロジェクト上でのフォルダ分けは無視され、インストール後のディレクトリ階層は、プロジェクトディレクトリ内のディスク上の階層が再現される。

つまり、アプリケーションフォルダに直に配置するファイルは、プロジェクトディレクトリ内に保存しておき、サブディレクトリに入れたい物は、プロジェクトディレクトリ内のサブディレクトリに入れておく必要が有る。

多くのファイル(HTMLヘルプなど)をセットアッププロジェクトに入れると、ファイル数が多くなりやっかいになるので、コンテンツ ファイルを活用したいが、一般のプロジェクト上で管理するのもややややこしい。

HTMLによるヘルプなどは、専用のプロジェクトを作成した方がやりやすいかも。
しかも、C#の空のプロジェクトを作成すると、HTMLファイルを扱うときに、プロジェクト上のディレクトリ構成と、ディスク上のディレクトリ構成が一致する!
便利じゃん!
ダミーのEXEがビルドできるように、単純なアプリのC#コードを書かないと、エラーが出て醜いけど、使える!

...コンテンツ専用のプロジェクトがほしい。。。
[PR]
by isoq | 2009-07-08 19:55 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

SubVersion クライアント TortioseSVN を使ってみた

Subversion VS VisualSourceSafe からトラックバックさせていただきました。

riye_techさん(↑)も指摘されている様に、VSSで各プロジェクト間で共有されるべきファイルを共有する機能 - その名も共有 - が、SVNには無いようです。

何度も何度もSVNに興味を持ったのですが、それが見つからない(後にないと判った)ため、今回も断念。

VSS(Visual Source Save)+VS(Visual Studio) が掲げる方針は、従来の考え方から一歩進んでいる。

SVN (Sub Version - オープンソースのバージョン管理システム)
VSS (Visual Source Safe - Microsoft社純正のバージョン管理システム)
VS (Visual Studio - Microsoft社純正の統合開発環境)

VSS+VS では、プロジェクト(ソリューション)に含まれるバージョン管理の対象となるファイルは、すべて「ソリューションフォルダ以下にローカルコピーを保持しろ」と言っています。つまり、すべてのファイルをソリューションの管理下に置くということ。ファイルを共有する場合は、その共有ファイルのローカルコピーをソリューション管理下に置きます。共有されている同一のファイルのローカルコピーがそこかしこに出来ますが、VSSを通して共有をすると、VSSがそれぞれを最新の状態に保ってくれるというイメージ。

SVNでは、より原始的で、フォルダの中身を丸ごと、もしくは必要なファイルだけをバージョン管理する。1つのフォルダの中身は、SVN上でも1つのCSVフォルダに入っていて、作業フォルダには、別のCSVフォルダから取り出したファイルの共有コピーを混ぜる事はできない。そもそも共有コピーという概念がない。これはSVNの仕組み上の制約。(もし出きるのであれば、誰か教えてください ^^;)

このように、ファイルの管理方法には、VSSとSVNとではかなりの違いがある。

もし、SVNで共有ファイルを管理しようとしたら、その共有されるファイル群は、プロジェクト本体とは別のフォルダに保存して、プロジェクト内から、相対パスでそれらの共有ファイルを参照することになる。つまり、SNVNのリポジトリにCommon、A、Bという3つのフォルダがあり、これらをA+Common、B+Commonという組み合わせで使いたいとしたら、

方法1:すべてを1つのフォルダの中にチェックアウトしてしまう。
 projects
  Common
  A
  B

方法2:個別のフォルダを作成し、それぞれに必要なものだけチェックアウトする。
 projects
  projectA
   Common
   A
  projectB
   Common
   B

のような使い方になる。
必要なファイルを限定して1フォルダにまとめるというVSS+VS考え方からすると、方法2 の方がVSS+VSの使い方に近いかな。
Commonをさらに機能毎に細分化して、ファイル単位の共有に近づけることも出きるかな。

SVNは、「今まで単純にファイルをバックアップして管理してました。」というひとには、非常にわかりやすい仕組みではある。
もし、VSNを最初に使用していたとしたら、VSSの共有の仕組みがかなり理解不能だったかもしれない。
(現に共有をうまく使えるようになるまでだいぶ苦労した。。。)
けど、一度VSSの共有機能に慣れてしまうと、ちょっとSVNは使いにくい。

しかも、既にVSSで共有管理しているプロジェクトたちが既に数十あるわけで、、、
それらのプロジェクトの参照先をすべてプロジェクトフォルダ直下からプロジェクトフォルダ外への相対パス指定に変更するとなると、、、ものすごい労力。。。

なぜ、VSSじゃいけないのか?
別にいけない訳じゃないんだけど、はっきり言って「VSSのインターフェイスが使いにくい」の一言に尽きる。
まだ、VSのソリューションに含まれるファイルは良いが、自分でファイルをソース管理に追加したり、変更したりしていると、どのファイルが追加済みで、どれがまだかを確認するのに、自力で比較するしかないのが辛い。
すべてのファイルをVSのIDE上で管理すればすんなりといくかというと、そうでもない。VSのIDE上でフォルダを作成して、ファイル毎に整理しても、実際のファイルが保存されている場所との関連性がない。いくらIDE上でフォルダに入れても、ファイル作成のときに同じフォルダを作成してそこに入れないと、見にくくなってしまうし、あとから移動させるのも、VSS上で移動して、フォルダを作成して移動して、IDEに再登録と面倒な手順となってしまう。
だから、私は、ソース以外の関連ファイルは、IDEを使わず、自分でフォルダを作成して、手動でVSSに登録するようにしている。
それに比べ、TortoiseSVNのシェル拡張によってエクスプローラに統合された直感的なUIは、非常に魅力的。管理されているファイルと、されていないファイル。変更されているファイルといないファイルが、エクスプローラのアイコン上に張り付くマークで一目瞭然なのです。
VSSも純正なんだから、そのくらいやってほしいものだ。

TortoiseSVNは、どんどん高機能化してきており、ビジュアルマージが出きるようになったので、かなり使いやすくなっています。
VSSのファイル単位の共有を、機能毎にフォルダ分割してフォルダ単位の共有にすることで、どこまでできるか。。。
もう少し、検討してみたいと思います。
[PR]
by isoq | 2009-04-03 01:30 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

タスクスケジューラへのタスクの登録のためのメモ

ひとまず、WSHを使用して、タスクスケジューラへタスクを登録するための
基本的な手順について調べた事のメモ。

Microsoft TechNet - Managing Scheduled Tasks
http://www.microsoft.com/technet/scriptcenter/guide/sas_man_rsxs.mspx?mfr=true

MSDN - Create Method of the Win32_ScheduledJob Class
[PR]
by isoq | 2009-03-16 10:29 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

VC++ 2008 のIDEのタブについて

タブ。
エディタの上に並んでいて、1つのタブが1つのファイルを示してくれる便利な機能なのですが、不満な点があります。

一、なぜに、新しく開いたウインドウが左に表示されるのか?
一、画面横幅に収まり切らなくなったときに、
  ソリューションエクスプローラから右に消えたファイルを開くと、
  なぜに、一番左に表示されるのか??

私、几帳面なのか、並べる順番を決めているのです。
左から、リソース、ヘッダ、ソースの順に並んでくれないと、困るのです。

歯がゆいですね。
[PR]
by isoq | 2009-02-27 16:00 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇