- ベストアンサー
CreateDCA、CreateDCWのパラメータ指定法とエラーの原因
- CreateDCA、CreateDCWのパラメータ指定法について説明します。具体的には、Unicode版とANSI版が実装されており、それぞれの呼び出し方が異なることに注意が必要です。
- また、CreateDCではなくCreateDCAとCreateDCWを直接呼び出す理由として、APIフックでCreateDCを引っ掛けたいからです。しかし、正しい呼び出し方ができずにエラーが発生しています。
- 現在、CreateDCA、CreateDCWのパラメータ指定法に関する資料は見当たらないため、解決策が見つかっていません。資料を探し続けるか、他の方法を検討する必要があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
さらに1つ補足しておくと、1~3番目の引数の型の LPCTSTR は ANSI版では LPCSTR となり(「T」が不要)、Unicode版では LPCWSTR となります。また、DEVMODE も同様にANSI版とUnicode版があり、それぞれ DEVMODEA と DEVMODEW がありますのでご注意ください。
その他の回答 (2)
- fresh_homepie
- ベストアンサー率64% (24/37)
> typedef HDC (WINAPI *PFNCREATEDCA) (PCTSTR, PCTSTR, PCTSTR, CONST DEVMODE); > typedef HDC (WINAPI *PFNCREATEDCW) (LPCWSTR, LPCWSTR, LPCWSTR, CONST DEVMODE); 最後の引数の型が変わってしまってますね。ポインタではなく構造体の値渡しになってしまっています。正しくは typedef HDC (WINAPI *PFNCREATEDCA) (PCTSTR, PCTSTR, PCTSTR, CONST DEVMODE*); typedef HDC (WINAPI *PFNCREATEDCW) (LPCWSTR, LPCWSTR, LPCWSTR, CONST DEVMODE*); で、置き換える関数の中でもアスタリスクを外して HDC nResult = ((PFNCREATEDCA)(PROC) g_CreateDCA)(lpszDriver, lpszDevice, lpzsOutput, lpInitDat); としなければいけません。
お礼
ご指導ありがとうございます 取り敢えずご指摘頂いた箇所を修正してランして見たら、一発OKでした 見事にCreateDCA、CreateDCWの両者をフックすることが出来ました まずはご報告と御礼を申し上げます ・・・・・実のところ、お教え頂いた内容をまだ理解しておりません 後刻ゆっくりと勉強させて頂きます・・・・・ ありがとうございました 今後も宜しくお願い申し上げます
- fresh_homepie
- ベストアンサー率64% (24/37)
もしかしたら、呼び出し規約の不一致のために、呼び出し後にスタックポインタが正しく戻っていないのでは、思うのですが。 元の関数アドレスを格納するポインタや、フックで置き換える関数の呼び出し形式は __stdcall になっていますか? 指定しない場合はデフォルトで __cdecl になるので、明示的に WINAPI または __stdcall を付ける必要があります。
お礼
ご指導ありがとうございます ご指摘いただいたWINAPIは次のようにしております HDC WINAPI Hook_CreateDCA(PCTSTR lpszDriver, PCTSTR lpszDevice, PCTSTR lpzsOutput, CONST DEVMODE *lpInitData) { //ここで私の処理を行ってから(但し現在に所、何もしていない フックがOKになったら追加の予定)オリジナルCreateDCAを呼び出す HDC nResult = ((PFNCREATEDCA)(PROC) g_CreateDCA)(lpszDriver, lpszDevice, lpzsOutput, *lpInitDat); reurn nResult; } 補足】パラメータのPCTSTRを下記のようにLPSTRに変更しても結果は同じでした HDC WINAPI Hook_CreateDCA(LPSTR lpszDriver, LPSTR lpszDevice, LPSTR lpzsOutput, CONST DEVMODE *lpInitDat) //---------------------------------------------------- HDC WINAPI Hook_CreateDCW(LPCWSTR lpszDriver, LPCWSTR lpszDevice, LPCWSTR lpzsOutput, CONST DEVMODE *lpInitData) { //ここで私の処理を行ってから(但し現在に所、何もしていない フックがOKになったら追加の予定)オリジナルCreateDCAを呼び出す HDC nResult = ((PFNCREATEDCW)(PROC) g_CreateDCW)(lpszDriver, lpszDevice, lpzsOutput, *lpInitData); return nResult; } またプログラムの関連する他の部分は次の通りです extern CAPIHook g_CreateDCA; extern CAPIHook g_CreateDCW; typedef HDC (WINAPI *PFNCREATEDCA) (PCTSTR, PCTSTR, PCTSTR, CONST DEVMODE); typedef HDC (WINAPI *PFNCREATEDCW) (LPCWSTR, LPCWSTR, LPCWSTR, CONST DEVMODE); CAPIHook g_CreateDCA ("Gdi32.dll", "CreateDCA", (PROC) Hook_CreateDCA); CAPIHook g_CreateDCW ("Gdi32.dll", "CreateDCW", (PROC) Hook_CreateDCW); お察しのようにジェフリー リッチャー氏の Advanced Windows[単行本] を参考にさせて頂いております 今日も一日悪戦苦闘致しましたが全く前進しませんでした、更に何かヒントを頂戴出来れば大変有難いです なおフックが落ちてしまうのは、このCreateDCA、CreateDCWだけであり下記のAPIは正常にフックしています MessageBoxA MessageBoxW StartDocA StartDocW StartPage EndPage EndDoc TextOutA TextOutW ExtTextOutA ExtTextOutW DrawTextA DrawTextW DrawTextExA DrawTextExW TabbedTextOutA TabbedTextOutW SetTextAlign これらのAPIとCreateDCA、CreateDCWのパラメータの差は CONST DEVMODE があるか否かです でも浅学の私には CONST DEVMODE を理解出来ず、この辺りが怪しいと思っても対応出来ないのです 宜しくお願い申し上げます
お礼
重ね重ねご指導を頂きありがとうございます こちらも修正して確認しておきました 誠にありがとうございました