スポンサーサイト

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

お忍びリネームを作り始めてみる

なかなか気分が乗らないので、ちょっと日記に書きながらやってみようかな。目指すべきコーディングスタイルがなかなか定まらないですが、今回もまた新たにコードを書き直します。とは言っても前のバージョンを参照しながら作ります。(Ver.1.0.0のコードを見てみると既に4年が経過しており、今の自分が漠然と思い描いているコーディングスタイルとはやはり違いますね。)
C++はずっと独学でやってますので、効率が悪かったり、おかしなところがあるかもしれません。お気づきの点がありましたらご教授いただけますとありがたいです。

まずはoshinameソリューションを作って、DLLのプロジェクトをoshiname_dllとしました。好みの問題で空のプロジェクトから始めます。お忍びリネームの場合、このDLLの中にシェル拡張のためのCOMクラスとグローバルフックのためのクラスを実装します。気分的にEXEは後回しにしたいので、DLL単体で動くシェル拡張部分から作ろうかと思います。

最初にProject.hというヘッダーファイルを作り、ここにDLLプロジェクトで共通に使用するヘッダーファイルの定義を入れます。(これは今回からのやり方で、スッキリ行くかどうか分かりません。(^^; )とりあえずプリコンパイル済みヘッダーの設定はしません。(ビルドに時間がかかるようなら設定します。)実はプリコンパイル済みヘッダーについてよく分かってなく、今までヘルプやネットで調べてもよく理解できなかったんですが、WTLで作ったプロジェクトを調べてみると、stdafx.hに共通に使用するヘッダーファイルや定義を記述し、stdafx.cppでstdafx.hをインクルードしています。ここまでは今までも分かっていたんですが、肝はstdafx.cppのプロパティで「プリコンパイル済みヘッダーを作成する」設定にすることみたいですね。これに今まで気がつきませんでした。そのようにしておいて、プロジェクトの設定では「プリコンパイル済みヘッダーを使用する」にすれば良いようです。
話が逸れましたが、Project.hにはとりあえずatlbase.hだけを入れておきます。他のは必要になった段階で追加する予定です。
お忍びリネームは、Win2000、XPの対応にしようと思うので、

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
#define _WIN32_IE 0x0500


とします。このあたりも自信が無く、毎回調べてるんですよね。きちんと設定しておかないと、いくつかのヘッダーファイルでVisual Studioのバージョン毎で異なる既定値に設定されてしまいます。ですので自分で設定しておく方が良さそうです。

次にDllMain.cppというファイルを作ります。今回から、WinMainを置くファイルをWinMain.cpp、DllMainを置くファイルをDllMain.cppにすることにしました。今まではプロジェクト名.cppとしていましたが、どうも他のファイルと区別が付きにくい気がしましたので。

はあ、ここまででもう疲れた・・・。orz

次はDllMain関数を書きましょうか。ここでいつも迷うこと。第1引数はDLLのインスタンスハンドルですが、これをhDLLにするかhDllにするか。(ちなみにMSDNではhinstDLL。)自分の感覚的にはhDLLなんですが、DllMainの関数名がDllにしているせい(?)でhDllに気持ちが引っ張られます。いつもhDllなんですが、今回はhDLLにしてみますか。変数の命名規約はいろんな考え方があって、自分でも何が良いのか分かりません。いろいろ議論はあるかもしれませんが、今のところはWindowsで(自分なりの基準で)よく使う型についてはプリフィクスを付けるのが自分の好みです。クラスのオブジェクトの変数については無理にプリフィクスは付けず、しかもC#風に最初を小文字にするのが好みです。クラス名をそのまま変数名にしますので、型はすぐに分かります。(でもクラス名があまりにも長い場合には多少省略するかも。)

<自分の中ではブレがない例>
BOOL bValue;
BYTE btValue;
int nValue;
LONG lValue;
PCTSTR pszValue;
CString strValue;
CTestObject testObject;

<ブレがある例>
UINT uValue;
ULONG uValue;

ブレがあるのは自分のせいかもしれないですし、MSDNや書籍のせいかもしれません。さらにはインテリセンスのせいもあるかもしれません。(^^;

情報源は忘れましたが、ハンガリアン記法は考案者の意図と違った形で使用されてしまったという経緯があるそうです。ネットで調べてみると、ハンガリアン記法のプリフィクスには型を表すものと付加情報を表すものがあり、それらが組み合わされます。この付加情報の使い方のブレというのが、型のプリフィクスのブレと共に気持ち悪さの原因だと思われます。DllMainの第2引数はfdwReasonとなってますね。f+dw+Reasonなわけですが、fを付ける基準はどうなんでしょう?COMの解説書などでは参照カウント変数はm_cRefとなっていて、型のプリフィクスが使われてません。基準がよく分かりませんので、この際、付加情報のためのプリフィクスは使わない方向で行きたい気がします。付加情報については~Flagだとか~Arrayのように変数名に書けば良いかと。ただ例外としてメンバ変数やグローバル変数を表すm_やg_といったプリフィクスは経験上では有用に思えます。個人的にはconst値にはc_、スタティックなメンバ変数にはsm_を付けています。

Windowsプログラミングでは、typedefされた型が多用されていて、そのプリフィクスをどうするかも私の中でスッキリしてません。

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

私はこんな風に書きますが、HWNDはhwndの人も多いのでは?WPARAM wparamの人もいるのかな?UINTはuiMsgですかね。はぁ。私の場合は、ハンドル系はhとしてしまうようです。ですのでHINSTANCEはhInstまたはhInstanceとなります。(HANDLE、HMODULEも同様)
しかし、WPARAM、LPARAMに至っては歴史的な経緯もあって無茶苦茶ですね。エントリポイントやWindows定義のコールバック等と、自分で作る関数のスタイルは別だと考えた方がスッキリするかもしれません。でも、インスタンスハンドルとかをグローバル変数に持つ場合にスタイルの違いが気になるかも。今回はとりあえず

BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpvReserved);

としておきます。気になったら変えるかもしれません。

こんな感じでいつも出足でブレまくってるので、なかなか進まないんですよね。(^^;
それを繰り返す度に、ちゃんと方針を決めてからでないと組むのが億劫になっていくんです。
あまり考えずに組んでいた頃は幸せでしたね。(^^)

今日はあともうちょっとだけ。DllMainの中にswitch文を付けます。switch文の書き方も好みが分かれますね。私の場合は下のような感じです。

BOOL WINAPI DllMain(HINSTANCE hDLL, DWORD dwReason, LPVOID lpvReserved)
{
  switch (dwReason)
  {
  case DLL_PROCESS_ATTACH:
    break;
  case DLL_PROCESS_DETACH:
    break;
  case DLL_THREAD_ATTACH:
    break;
  case DLL_THREAD_DETACH:
    break;
  }

  return TRUE;
}

私はVisual Assistというソフトの補助機能が生成するコードに任せることにしてます。Visual Assistを使う前はcaseのインデントはもう一つ深かったんですが、Visual Studioも勝手に左に移動させますし、もうこれでいいやと。(^^; ただ中カッコの位置、これだけは譲れません。(もちろん仕事でコード規約があれば譲りますが。)

switch (dwReason) {
<~略~>
}

これはイヤです。関数もfor文も然り。好みの問題です。カッコの始まりと終わりのインデントが揃ってないとイヤなんです。あと、中カッコを右に置いた場合、switch文とブロック内のコードが詰まりすぎてしまうのがイヤなんですね。


やっぱり書きながらだと全然進みませんね。ははは。しかし自分がどこが気になっているのかの整理にはなっている気がします。DllMainの中身がないですが、必要になったら付け足していきます。

さて、次はシェル拡張を実装するか。ファイルを右クリックしたときのお忍びツールの部分です。

関連記事

theme : 日記・日誌
genre : コンピュータ

comment

Secret

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリー
最近の記事
最近のコメント
タグ

カメラ GH2 GH3 

ブログ内検索
月別アーカイブ
RSSフィード
プロフィール
●オンラインソフト作家。しかし長らく活動休止中。
ソフトウェア

●Dさんの長押しIME起動2
●IME+ (仮称)

・Dさんの長押しIME起動。
・Dさんの日本語じゃなきゃイヤン。
・Dさんの名前変更お手伝い。
・Dさんのダイヤルアップ接続お手伝い。
・DさんのWindows終了お手伝い。

・お忍びランチャー。
・お忍びリネーム。
・デジくいっくサーチ!
・Simple Remote
・計算王?

※過去の開発ソフトの一部はリンク先からダウンロードできます。

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