antenn-a
company profile

MFC航海日記 五十二日目(VC...7 !?)


はて、VC7 ことVisual C++.NET に挑戦だ!
Delux Editionとかでは無くて、ふつーのVCしか入ってないパッケージなんだけど、CD7枚!
そして、、、インストールに約1.5時間!長すぎ!
CD1枚目なんかファイル1個1個コピーしてる!(そりゃ遅いよ・・・)
って、ワケでようやくインストロールが終わったと思ったら・・・
インタフェース全然変わってるぅぅぅぅぅぅ・・・。
で、小手調べに、今まで作ったプログラムを動かしてみることに。
さ、て、と・・・、、、?
「error PRJ0016 : このユーザーのセキュリティ設定が原因で、プロセスを作成できません。これらの設定はビルドで必要です。」
との事。はっきり言って、意味不明。
もはや、PCのアカウントにしか存在しない(涙)Admin権限でコンパイルを試みるも、駄目。
うーん。イキナリ終了ですか、この企画わ・・・。
で、例に拠って、対処法が書いてない。が、ネットで調べてみると、レジストリらしいのですわ。
どうも、窓の手を使った後にVC.NETはコンパイル不能になるっぽいですな。
レジストリエディタを開き(ファイル名を指定して実行から regedit)
\\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun
の RestricRun という物を消すと、あら不思議。コンパイルできるじゃあ〜りませんか。うーん。

prev


というわけで、コンパイルは出来る様になったけど、ColorMakeとかWinRenameとか、エラーでまくり!
VC5ではコンパイル出来た物がぜ〜んぜんコンパイル出来ないのですわ、うわっはっは!
ふー・・・。
まー良いや(良いの?)取り合えず作り始めよぅ〜っと。
ファイルから新規作成、、、そ、そりゅーしょん、、、?
もー意味分かりません!なんすか、そりゅーしょんって!?
取り合えず、プロジェクトを起動したりするのだけども、クラスウィザードがねーよ!
あーインタフェースが変わってさっぱしわかんねー・・・(涙)

しかも、.dsw ファイルが無いので、VC7でしかコンパイル出来ないっぽい。過去のdswは変換してくれるっぽいけど。
昔 .dsw だったファイルらしき物は .sln とかいうファイルに。そりゅーしょんって奴ですかね。
何ていうか、プログラムじゃ無くてVC7の使い方に困惑する私。
ふー。
この後もハマりにハマって、大変でした。とほほ。


prev


気を取り直して、これからやらねばならない事を整理してみよう。
1.JPGファイルとBMPファイルを読み込んで、描画を行う
2.全部メモリに持つのは辛いので、サムネイルを作りたい、つまり画像のリサイズ
3.リサイズした画像をJPGで保存したい
4.リサイズしたりする時間の掛かる処理は別スレッドにしたい

と、言う感じで、4項目を取り合えず目標にしたい。
で、取り合えず1からやってみたわけです。
まあ、BMPは良いでしょ。CBitmap使ってどうとでもなりそうなので。問題はJPGですな。
さーてどうするか。
適当にヘルプを漁った結果 OleLoadPicture() なる関数が有る。こいつを使ってみるか。

prev


OleLoadPicture() に渡す物としては、
1.LPSTREAM構造体
2.読み込むファイルのサイズ
3.オリジナルフォーマットを保持するかどうか
4.ppvObjの中で返すべきインターフェース・ポインターのタイプについてのフラグ 5.読み込まれるデータのバッファ
という感じらしいのだよ。
取り合えず、1個1個片付けるか。

LPPICTURE    m_pJpeg;
CFile        fp;

/* 取り合えず、ファイルを開き、読み込む。*/
if( !fp.Open( "test.jpg", CFile::modeRead) ){
    MessageBox( "test.jpgが開けませんですよ", "エラー", MB_OK );
    return FALSE;
}

/* サイズチェック */
DWORD	dwSize = (DWORD)fp.GetLength();

/* 領域を確保 */
HGLOBAL h = ::GlobalAlloc( GMEM_MOVEABLE, dwSize );
if( h == NULL)
{
    fp.Close();
    MessageBox( "メモリが確保できません。", "エラー", MB_OK );
    return FALSE;
}
/* 領域をロック */
void *pBuf = ::GlobalLock( h );
if( pBuf == NULL){
    fp.Close();
    ::GlobalFree( h );
    MessageBox( "GlobalLock失敗", "エラー", MB_OK );
    return FALSE;
}

/* ファイル読み込み */
if( fp.Read( pBuf, dwSize ) != dwSize ){
    fp.Close();
    ::GlobalUnlock( h );
    ::GlobalFree( h );
    MessageBox( "読み込みに失敗", "エラー", MB_OK );
    return FALSE;
}
// ファイルのクローズと領域のロック解除
fp.Close();
::GlobalUnlock( h );

/* IStreamを作成 */
LPSTREAM pstm = NULL;
HRESULT hr = ::CreateStreamOnHGlobal( h, TRUE, &pstm );
if( SUCCEEDED( hr ) == FALSE){
    MessageBox( "ストリームの作成に失敗", "エラー", MB_OK );
    return FALSE;
}

/* IPictureオブジェクトの取得 */
hr = ::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&m_pJpeg );
if( SUCCEEDED( hr ) == FALSE || m_pJpeg == NULL ){
    pstm->Release();
    MessageBox( "LoadPictureに失敗", "エラー", MB_OK );
    return FALSE;
}
/* IStreamの開放 */
pstm->Release();
					

prev


と、まあこんな具合にやる感じらしい。
ちなみに描画の方はと言うと、Render() という関数を呼べばOKなはず。
但し、この時LPPICTUREから得る幅と高さはHIMETRICなので、直さねばならない事に注意。
実際は CDC::HIMETRICtoDP() を呼べばOKかと思います。
今回のサンプルはここからダウンロード出来ます。
ただし、VC7.0じゃないと駄目です。そりゅーしょんじゃ無いと!
ま、やってる事は非常にシンプルなので、VC5とか6な人はコピーアンドペーストで一つ。
CJpegViewDlg::OnCreate()とCJpegViewDlg::OnPaint()しかいじって無いので。

prev


さ、てと。じゃこれで良いの?ってな話になるんだけど、うーん。どうも納得いかん崎(・・・)
まあ、これで良いと言えば良いんだけどねぇ・・・。
で、ネットでちらほら探しているともっとグレイツな物を発見したのですわ。
その話を次回。


antenn-a

prev next


antenn-a