2008年10月18日土曜日

別プロセスに文字列を渡す ( プロセス間通信? )

10月から、再びVC++の案件に携わっている。
約一年ぶりのVC++ということもあり、忘れていることが多くて悪戦苦闘の日々だ。
だが、それがいい。
 
さて、本題の「別プロセスへ文字列を渡す方法」だが、
凡ミスで1時間ほど無駄な努力をしてしまったので、メモしておく。
 
手法はいくつかあるが、今回は WM_COPYDATA というメッセージを使って実装したのだが、
何故か受信側が WM_COPYDATA を受け取ってくれなかった。
そのほかのメッセージは届くというのに!
 
で、よく調べてみたら SendMessage じゃないとメッセージが届かないということが判明。
PostMessage は、受信側の応答を待たずに送信側の処理が進むため、送信データの領域を開放するタイミングがわからないのが原因らしい。
メッセージ自体が届かないということが問題を切り分けしづらくして厄介だった。
 
 
 

2008年3月9日日曜日

Visio ソリューション開発テクニック

昨日に引き続き、MSDN にて知識吸収。
 
今日は普段あまり活用していない Visio について、使いこなせるようなヒントを得られればと思い、
「Visio ソリューション開発テクニック」というものを視聴した。
 
例によって、マインドマップにメモを取ったので公開しておく。

*「-」ボタンで縮小して、ドラッグしながら見られます

    

マイクロソフトの開発プロジェクト管理

今日は時間があったので MSDN のセミナーを覗いてみた。

過去のセミナーでオンライン化されているもののうち、面白そうなのがいくつかあった。
その中で「マイクロソフトの開発プロジェクト管理」っていうのがあったので視聴。
・・・なぜって、リアルタイムでまるで体制のなってないチームで仕事をしているので。。。

まぁ、特に変わったことは言ってなかったのだけど、これまでの経験で培ってきたものが間違ってはいないという確認ができた。
んで、せっかくマインドマップも作ったし(ただ見るだけだと頭に入ってこないから)、公開してみる。

なんというか、便利な世の中だ。 

*「-」ボタンで縮小して、ドラッグしながら見られます

   

2008年3月2日日曜日

VARIANT型について

VARIANT型について

VSFlexGridの関数の引数がVARIANTでlongをどう渡すかこまった。
しかし、vc++には_variant_tという便利なものがあった。
こんな感じ。

long lNum = 123;
hoge(_variant_t(lNum)); // hoge は関数
便利!

SQL server と unicode について

 

SQL Server 2005 Express

Ⅰ問題
MFC の CDatabase および CRecordset が Unicode に対応していない。
ExecuteSQL でクエリがANSIに変換されてしまう。

Ⅱ対応
MFC のクラスを以下のクラスに変更する
CDatabase → CDaoDatabase
CRecordset → CDaoRecordset

Ⅲ参考
http://support.microsoft.com/kb/139759/en-us
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.mfc/2006-12/msg02521.html
http://objectmix.com/ado-dao-rdo-rds/49403-cdatabase-does-not-support-unicode.html

2007年9月15日土曜日

VC++ & Unicode 上での全角/半角の文字判定

正直、VC++ で文字列を扱うこと自体、嫌な思い出ばかりで嫌い・・・
でも EditBox の入力チェックとか、制限とか、かなり文字とは縁があるので避けて通れない道・・・。
 
と、いうことで今回は、VC++ & Unicode で開発しているプログラムで、全角文字の入力を制限することになった(仕様の関係で)。
Shift-JIS では散々やったが、Unicode か・・・。
Unicode 上では半角とか全角とか、そんなんないんだけどドーヨ?と、思ったが当然 API は存在した。
GetStringTypeEx という API で、こんなかんじ。
ちなみに、↑のドキュメントは 半角と全角の定数名が逆になっているので注意。
明らかに間違いです、、C3_HALFWIDTH が半角です・・・(動かして確認した)。
 
API だけ紹介しても意味ないですよお兄さん!
と、いうことで以下の感じで実装。
 
追記 2009.06.12: このページへの訪問がおおいので、サンプルコードを書いてみました。

// 文字列がすべて半角か確認する
BOOL IsAllHankaku( const TCHAR* pTarget, int nLen )
{
    // 文字の種別を取得する
    WORD* pType = new WORD[ nLen ];
    GetStringTypeEx(
         LOCALE_SYSTEM_DEFAULT   
// ユニコード版プロジェクトでは、無視される引数      
        ,CT_CTYPE3               
// 全角、半角、ひらがな等を判定するタイプ
        ,pTarget                 
// 判定対象となる文字配列
        ,nLen                    
// 判定対象となる文字配列のサイズ
        ,pType                   
// 判定結果の配列
        );
    // 結果がすべて半角なら TRUE をかえす
    BOOL isAllHankaku = TRUE;
    for( int i = 0; i < nLen; i++ ){
        if( !(pType[i] & C3_HALFWIDTH) ){
            isAllHankaku = FALSE;
            break;
        }
    }
    delete [] pType;
    return isAllHankaku;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
   
// ロケール設定
    std::wcin.imbue( std::locale("japanese") );
    std::wcout.imbue( std::locale("japanese") );
   
    std::wcout << _T("文字列を入力してください:");
    std::wstring szTarget;
    std::wcin >> szTarget;
    // 上記の関数を呼び出し
    BOOL isAllHan = IsAllHankaku( szTarget.c_str(), szTarget.length() );
    if( isAllHan ){
        std::wcout
            << _T("この文字列は、すべて半角文字です:")
            << szTarget
            << std::endl;
    }
    else{
        std::wcout
            << _T("この文字列には、全角文字が含まれています:")
            << szTarget
            << std::endl;
    }
    return 0;
}

 
なんともない、楽勝である。

2007年8月2日木曜日

MySQL 4.0系では、副問い合わせができない

今回は、タイトルの通り。
MySQL 4.0 系では、副問い合わせができないのである。
 
副問い合わせを使っている SQL 文が、ローカル環境の 5.x と 4.1.x では問題ないのに、4.0.21でだけ構文エラーが出ていたので、もしやと思い調べてみたら案の定だった。
 
なんというトラップ。
未だにこのいにしえ 4.0.x 系の MySQL を導入しているレンタルサーバがあるので(今回被害にあったの所もそう)、サーバーをレンタルする際には MySQL はもちろん、その他のサービスのヴァージョンには充分注意したい
まったく、こんなことで2時間ほど悩んでいた自分が情けなくなってくる。気持ち悪い
 
 
参考サイト