• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CreateDCA、CreateDCWのパラメータ)

CreateDCA、CreateDCWのパラメータ指定法とエラーの原因

このQ&Aのポイント
  • CreateDCA、CreateDCWのパラメータ指定法について説明します。具体的には、Unicode版とANSI版が実装されており、それぞれの呼び出し方が異なることに注意が必要です。
  • また、CreateDCではなくCreateDCAとCreateDCWを直接呼び出す理由として、APIフックでCreateDCを引っ掛けたいからです。しかし、正しい呼び出し方ができずにエラーが発生しています。
  • 現在、CreateDCA、CreateDCWのパラメータ指定法に関する資料は見当たらないため、解決策が見つかっていません。資料を探し続けるか、他の方法を検討する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

さらに1つ補足しておくと、1~3番目の引数の型の LPCTSTR は ANSI版では LPCSTR となり(「T」が不要)、Unicode版では LPCWSTR となります。また、DEVMODE も同様にANSI版とUnicode版があり、それぞれ DEVMODEA と DEVMODEW がありますのでご注意ください。

sato-may
質問者

お礼

重ね重ねご指導を頂きありがとうございます こちらも修正して確認しておきました 誠にありがとうございました

その他の回答 (2)

回答No.2

> 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); としなければいけません。

sato-may
質問者

お礼

ご指導ありがとうございます 取り敢えずご指摘頂いた箇所を修正してランして見たら、一発OKでした 見事にCreateDCA、CreateDCWの両者をフックすることが出来ました まずはご報告と御礼を申し上げます ・・・・・実のところ、お教え頂いた内容をまだ理解しておりません 後刻ゆっくりと勉強させて頂きます・・・・・ ありがとうございました 今後も宜しくお願い申し上げます

回答No.1

もしかしたら、呼び出し規約の不一致のために、呼び出し後にスタックポインタが正しく戻っていないのでは、思うのですが。 元の関数アドレスを格納するポインタや、フックで置き換える関数の呼び出し形式は __stdcall になっていますか? 指定しない場合はデフォルトで __cdecl になるので、明示的に WINAPI または __stdcall を付ける必要があります。

sato-may
質問者

お礼

ご指導ありがとうございます ご指摘いただいた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 を理解出来ず、この辺りが怪しいと思っても対応出来ないのです 宜しくお願い申し上げます

関連するQ&A