- 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言語で書いてた時と変わってない気がするけど。
|