スポンサーサイト

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

Windowsファイヤーウォールの有効/無効チェック

ファイヤーウォールの有効/無効チェック
http://www.cplusplus.com/forum/windows/1534/
http://www.techtalkz.com/microsoft-device-drivers/270097-looking-code-detect-if-windows-firewall-turned.html


MSDNで、キーワード「GetProfileByType」を指定すると、
ファイヤーウォール関連のAPIが見つかる。
スポンサーサイト

Visual Studio でC++プログラムをリモートデバッグ(まとめ)

Visual Studio でリモートデバッグする方法については、こちらが非常に分かりやすくて助かった。


自分用にここにまとめておく。

●環境

ローカルPC
  マシン名:MyMachine
  OS:Windows XP Professional
  Visual Studio デバッガはこちらで動作する
  ↓
  LAN
  ↓
リモートPC
  マシン名:RemoteMachine
  OS:Windows XP Professional (※Home Edition ではデバッグできない)
  デバッグ対象のプログラムはこちら


●リモートPCにデバッガ用のモジュールをコピー

以下のフォルダ内のファイルを、RemoveMachine の適当な場所にコピーする。

(VisualStudioインストールフォルダ)\Common7\IDE\Remote Debugger\x86


●RemteMachine にデバッグ対象プログラムをコピー

RemoteMachine に、デバッグ対象のソースコードやビルド済みの実行モジュールを全てコピーする。
MyMachine 側と全く同じフォルダ構成でなければならないようだ。
(ドライブ名も同じでないといけない?)


●アカウント作成

MyMachine 側と RemoteMachine 側のそれぞれに、同じIDとパスワードを持つ
アカウントを作成する。


●セキュリティ設定

MyMachine 側と RemoteMachine 側のそれぞれで、以下の設定を変更する。

(1) 「コントロールパネル」 → 「管理ツール」 → 「ローカルセキュリティーポリシー」 を起動する。
  ローカルセキュリティ設定ツールが起動する。
  ※Windows XP Home Edition では、このツールが存在しないため、リモートデバッグ
    できないようだ。
(2) このツールの左側ツリーコントロールの、以下の項目を選択する。
  「セキュリティの設定」 → 「ローカルポリシー」 → 「セキュリティオプション」
(3) 画面右側の一覧で、以下の項目をダブルクリックする。
  「ネットワーク アクセス: ローカル アカウントの共有とセキュリティ モデル」
(4) 現在の設定が
  [Guest のみ - ローカル ユーザーが Guest として認証する]
  になっていたら、
  [クラシック - ローカル ユーザーがローカル ユーザーとして認証する]
  に変更する。


●ファイヤウォールを解除

 ファイヤウォールが有効になっているとエラーが出るようなので、デバッグ中は、無効化しておく。
 MyMachine側、RemoteMachine側それぞれで以下の設定を行う。

 (1) 「コントロールパネル」 → 「Windowsファイヤーウォール」を起動する。
 (2) 「全般」タブを選んで、「無効(推奨されません)」を選んでOKする。


●デバッグサーバを起動

(1) RemoteMachine側で、さきほどコピーした、
    (VisualStudioインストールフォルダ)\Common7\IDE\Remote Debugger\x86
  のフォルダ内の、
    msvsmon.exe
  を起動する。

(2) 「Visual Studio リモートデバッグモニタ」というツールが起動するので、
  その画面に表示されている以下のメッセージの中の、
  「ユーザ名@コンピュータ名」という部分をメモっておく。

  「Msvsmonはユーザ名@コンピュータ名という名前の新しいサーバーを開始しました。」


●デバッグ開始

(1) MyMachine側で VisualStudio 2005 を起動し、デバッグ対象をプロジェクトを開く。

(2) メニューの「プロジェクト」 → 「XXXXのプロパティ」 を選ぶ。

(3) 「デバッグ」タブを選択する。

(4) 「開始オプション」の「リモートコンピュータを使用する」をチェックし、右側の
  入力欄に、さきほどメモった 「ユーザー名@コンピュータ名」を入力する。

(5) あとは普通にデバッグを開始すれば良い。

任意のデータをBASE64に変換した場合に何バイトになるかの計算方法

任意のデータをBASE64に変換した場合に何バイトになるかの計算。
BASE64ってどうすんだっけ?と、いつも忘れてしまうので、メモしておく。


int calcBase64EncodedSize(int origDataSize)
{
// 6bit単位のブロック数(6bit単位で切り上げ)
int numBlocks6 = ((origDataSize * 8) + 5) / 6;
// 4文字単位のブロック数(4文字単位で切り上げ)
int numBlocks4 = (numBlocks6 + 3) / 4;
// 改行を含まない文字数
int numNetChars = numBlocks4 * 4;
// 76文字ごとの改行(改行は "\r\n" とする)を考慮したサイズ
return numNetChars + ((numNetChars / 76) * 2);
}

CHtmlViewでCDHtmlDialogと同様のイベント処理を行う方法

ご存じのとおり、CDHtmlDialog では、HTMLファイル内のボタンやリンク等がクリックされた、といったようなイベントを受け取ることができる。

例えば次のような具合で、簡単にハンドリングできる。


BEGIN_DHTML_EVENT_MAP(CMyDHtmlDialog)
DHTML_EVENT_ONCLICK(_T("ID_MY_BUTTON"), OnMyButton)
END_DHTML_EVENT_MAP()

HRESULT CMyDHtmlDialog::OnMyButton(IHTMLElement* pElement)
{
・・・省略・・・
return S_OK;
}



なんと驚いたことに、CHtmlView ではこれができないのだ。
CDHtmlEventSink の派生クラスでなければダメらしい。
CDhtmlDialog は CDHtmlEventSink を継承(多重継承)しているが、CHtmlViewはしていないからダメみたいだ。


この悩みを解決してれた方がいる。
CodeProject のここ↓だ。
http://www.codeproject.com/KB/MFC/dhtmlview.aspx?df=100&forumid=3217&exp=0&select=1322469
もし見つからない場合は
Integrating DHTML into MFC Views
という記事名で検索すれば良い。

CDHTMLView という名前で実装されている。
CViewからの派生になっている。
まだ MFC CHtmlView が出る前に書かれた記事だから?



ただし、残念なことに、このクラスではドロップターゲット機能がサポートされていない。
つまりこうだ。
CDHtmlDialog        イベント:○ ドロップ:×
CHtmlView           イベント:× ドロップ:○
このクラス(CDHTMLView)  イベント:○ ドロップ:×

MFCのCHtmlViewから、ドロップ機能に必要な個所を抜き出して、CHTMLViewクラスにねじ込んだら、動いた。
抜き出すのは結構大変そうに思えたが、一か所にまとまっていたのでなんとかなった。

MFC の CHtmlView からの派生クラスにして、イベント機能をそこに追加する、という解決をしてみたかったのだが、そちらの方法はとりあえず断念した。
そもそも可能なのかどうかすら分からないのだが。

CHtmlView で独自のドラッグ&ドロップする方法

MFC の CHtmlView で独自のドラッグ&ドロップする方法。

CHtmlViewを使っている場合、そのままでは自分のViewクラスの OnDragEnter や OnDrop が呼ばれない。
以下のように、OnGetDropTarget をオーバーライドして、自分が管理している IDropTarget を返してやればよい。



class CMyView : public CHtmlView
{
・・・省略・・・
virtual HRESULT OnGetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget);
COleDropTarget* m_pDropTarget;
};

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
・・・省略・・・(後始末なども省略)
m_pDropTarget = new COleDropTarget;
m_pDropTarget->Register(this);
}

// この OnGetDropTarget をオーバーライドするのがポイントだ
HRESULT CMyView::OnGetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget)
{
*ppDropTarget = (LPDROPTARGET)m_pDropTarget->GetInterface(&IID_IDropTarget);
if (*ppDropTarget == NULL) {
return E_FAIL;
}
// 呼び出し側でReleaseするようなので、ここでAddRefしたままで良い。
// (自分でReleaseするとおかしなことになる)
(*ppDropTarget)->AddRef();
return S_OK;
}




これにより、 CMyView の OnDragEnter とか OnDrop が呼び出されるようになる。

CDhtmlDialog でも同様のやり方ができるかと思ったのだが、CDHtmlDialog には OnGetDropTarget がない。
ということは同じやり方はできない。
別の記事で書いたが、CHtmlViewと同じ方法でドロップを受け付けるようにするためには、数百行程度のコードを追加する必要がある。


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