トップページ > プログラム > 2015年10月28日 > DIDF3JCG

書き込み順位&時間帯一覧

5 位/187 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000014106



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Win32API質問箱 Build121 [転載禁止]©2ch.net

書き込みレス一覧

Win32API質問箱 Build121 [転載禁止]©2ch.net
419 :デフォルトの名無しさん[sage]:2015/10/28(水) 20:55:38.12 ID:DIDF3JCG
システムディレクトリのパスを得るために、パスの格納先であるクラスメンバのTCHAR型の配列を

GetSystemDirectory(Path, MAX_PATH + 1);

この様に渡すと、アクセス違反が発生するんですが
何故アクセス違反になるのか原因がさっぱり分かりません。
C++のクラスを使ったプログラミングはこれが初めてです。
Win32API質問箱 Build121 [転載禁止]©2ch.net
421 :デフォルトの名無しさん[sage]:2015/10/28(水) 21:31:49.85 ID:DIDF3JCG
>>420
TCHAR Path[MAX_PATH + 1];
こんな感じで宣言してあります。

その方法でやってみてもアクセス違反になりますね。
MSDNによるとGetSystemDirectoryの第2引数はMAX_PATH以上の値を指定しろとのことです。
通常の関数プログラミングではこんな問題に直面したことはないのですが。
ちなみにクラスのインスタンスはグローバルな領域に確保しています。

クラスの宣言はこんな感じです。実際のものと異なっていますが、質問の件のために割愛。

class AppBase
{
 TCHAR Path[MAX_PATH + 1];

 static LRESULT CALLBACK HookProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
};

プロシージャのクラス化を施しています。
GetSystemDirectoryはWndProc内のWM_CREATEメッセージをハンドルする際に実行しています。
Win32API質問箱 Build121 [転載禁止]©2ch.net
424 :デフォルトの名無しさん[sage]:2015/10/28(水) 21:46:47.48 ID:DIDF3JCG
>>422>>423
WndProcはstaticではありません。
staticにするとメンバのアクセスに制限があるそうなのでstaticにしていませんでした。
試してみます。
Win32API質問箱 Build121 [転載禁止]©2ch.net
426 :デフォルトの名無しさん[sage]:2015/10/28(水) 21:52:32.96 ID:DIDF3JCG
予想通りWndProcをstaticにすると静的ではないメンバへのアクセスができませんでした。
>>422さんが仰るとおり、WndProcをクラスの外に出すしか方法がないようです。

折角クラス化してスマートに書けると思っていたのに
まどろっこしいですね・・・。
Win32API質問箱 Build121 [転載禁止]©2ch.net
430 :デフォルトの名無しさん[sage]:2015/10/28(水) 21:58:44.54 ID:DIDF3JCG
>>425
なんかウィンドウプロシージャをクラス内に内包して使うには
staticなフック用のプロシージャ関数と実際の処理内容を書くプロシージャのふたつが必要なみたいなんです。
この場合、HookProc内でWndProcを呼ぶ形になります。

TCHAR型の配列をstaticにしていないのはWndProc内から参照できるようにするためです。
って、これはどっちでも参照できますね・・・。
普段やり慣れていないことをするとどうも頭が回らなくなってしまう。
Win32API質問箱 Build121 [転載禁止]©2ch.net
431 :デフォルトの名無しさん[sage]:2015/10/28(水) 22:02:36.33 ID:DIDF3JCG
メンバ変数を全部staticにしてしまうのが一番手っ取り早いかもしれない。
やってることがC言語で書いてた時と変わってない気がするけど。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。