スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

久しぶりに更新

ん~久しぶりに更新・・・・・・いそがすぃ・・・・・・

なんかVC++超初心者会議室がえらいことになってたんですが
いったいどうしたんでしょうね?

夕方くらいに覗いたらサーバーのファイルが丸見えだったのですが・・・・・・
(wGetとかASPTEST(?)というフォルダが見えた)

なにかテストしてるんでしょうかね?

それともサーバーがクラ(ry

スポンサーサイト

テーマ:インターネット関連 - ジャンル:コンピュータ

2006.06.17 | Comments(0) | Trackback(0) | 未分類

IProgressDialog

しばらくシェルプログラムでも書いていこうかな~と思います。
時間があればですがorz

IProgressDialog インターフェイス
読んで字の如く何らからの'進行'を表現するためのダイアログを
提供するインターフェイスです。

なにかしら(プログラムが)面倒なシェルインターフェイス群の中では
比較的簡単な部類に入るでしょう。

サンプルソース


#include <windows.h>
#include <shlobj.h>

static const int BROCK_SIZE = 8096;
IProgressDialog* s_Progress;
DWORD s_MaxSize = 0;
bool s_CancelOn = false;

// WriteFileEx のコールバック
void WINAPI FileIOCompletionRoutine(DWORD Error,
DWORD Transferred,
LPOVERLAPPED Overlap)
{
// キャンセルが押されたかどうかの判定
if(s_Progress->HasUserCancelled())
{
s_CancelOn = true;
return;
}

wchar_t line[64] = L"";
wsprintf(line, L"%ld byte 中 %ld byte 作成...",
s_MaxSize, Overlap->Offset);
// キャプションの設定
s_Progress->SetLine(2, line, FALSE, NULL);
// プログレスバーの更新
s_Progress->SetProgress(Overlap->Offset, s_MaxSize);
}

// メイン
int wmain(int argc, wchar_t* argv[])
{
// いつもの
::CoInitialize(NULL);
// インスタンスの作成
::CoCreateInstance(CLSID_ProgressDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_IProgressDialog,
reinterpret_cast(&s_Progress));

if(*argv[1] == NULL || *argv[2] == NULL) return -1;
if(_wtoi(argv[1]) == 0L) return -1;

s_MaxSize = _wtoi(argv[1]) * 1024 * 1024;
int brock_number = s_MaxSize / BROCK_SIZE;
int last_size = s_MaxSize % BROCK_SIZE;

HANDLE file_handle = ::CreateFile(argv[2], GENERIC_WRITE,
0, NULL,
CREATE_ALWAYS,
FILE_FLAG_OVERLAPPED, NULL);

if(file_handle == INVALID_HANDLE_VALUE) return -1;

// タイトルの設定
s_Progress->SetTitle(L"ダミーファイル作成中...");
// AVI アニメーションの設定
// AVI ファイルをリソースに登録して使いましょう
s_Progress->SetAnimation(::GetWindowLong(m_hWnd, GWL_HINSTANCE),
"AVI リソース ID");
// ダイアログの表示
s_Progress->StartProgressDialog(NULL, NULL, PROGDLG_AUTOTIME, NULL);
// キャンセルメッセージ
s_Progress->SetCancelMsg(L"キャンセルされました。", NULL);
// タイマーのリセット
s_Progress->Timer(PDTIMER_RESET, NULL);

OVERLAPPED overlap;
char *dummy_data;
int offset = 0;
int write_size = BROCK_SIZE;
ZeroMemory(&overlap, sizeof(OVERLAPPED));

dummy_data = new char[write_size];
memset(dummy_data, 0x00, sizeof(char) * write_size);

for(int i = 0; i < brock_number + 1; i++)
{
if(i == brock_number && last_size > 0)
{
delete [] dummy_data;
write_size = last_size;
dummy_data = new char [write_size];
memset(dummy_data, 0x00, sizeof(char) * write_size);
}

overlap.Offset = offset;
// 使い方は間違っていないと思うんだけどなあ……
::WriteFileEx(file_handle, dummy_data, write_size,
&overlap, FileIOCompletionRoutine);
if(s_CancelOn) return 0;

::SleepEx(INFINITE, TRUE);
offset += write_size;
}

delete [] dummy_data;
// ダイアログの停止
s_Progress->StopProgressDialog();

::CloseHandle(file_handle);
::CoUninitialize();
return 0;
}


ダミーファイルを作成するサンプルです。
SHFileOperation API を使えばいいだけじゃないの?
という突っ込みは無しの方向で('A`)

IProgressDialog の使い方は楽だったのですが
WriteFileEx で躓きましたorz
私はコールバックを指定したらファイル作成が終了するまで何度か
コールバックに処理が入ってくると思ったのですが
最初の一回のみで後はうんともすんとも言いません(´・ω・`)
誰かボスケテ……

次回は IShellIconOverlay をお届けする予定です。


テーマ:プログラミング - ジャンル:コンピュータ

2006.02.19 | Comments(0) | Trackback(0) | 未分類

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。