0

コールバック関数を渡す必要がある API を使用していますが、オブジェクト ポインターを渡すためのユーザー定義パラメーターをサポートしていません。

static / extern "C" コールバック関数からオブジェクトを回復するオプションは何ですか?

SetAbortProc()HDC を受け取り、コールバックに渡す を使用していAbortProc()ます。残念ながら、それ以上のデータを HDC に関連付ける方法はありません。

私が考えることができる解決策:

  • グローバル Cls *my_abort_object を使用し
    ます。一度にアクティブにできる印刷ジョブは 1 つだけなので、機能するはずです。少しずさんなように見えますが、それは私だけでしょうか?
  • グローバルな std::map<HDC, Cls*> を使用
    してください。アクティブにできる印刷ジョブは 1 つだけなので、おそらく役に立たないでしょう。この場合、グローバル ポインター ソリューションの方が簡単で、欠点はありません。
  • 中止するもの全体をカプセル化するシングルトンを使用してください
    。おそらく、あまり手間をかけない最も健全なアプローチです。
  • ATL スタイルのサンクを使用
    します (これは基本的real_callback(HARDCODED_OBJ_PTR, cb_arg1, cb_arg2, ...);に、コールバック関数として渡されたコードを呼び出すランタイム生成コードです)。
    非常に素晴らしいですが、自分で行うのは難しく、データ実行の防止などに問題があります。フレームワークでできることを簡単にエミュレートすることはできません。

私は現在、オーバーヘッドがあまりない最もクリーンなシングルトン ソリューションに傾倒しています。提案をいただければ幸いです。

追加情報: MSVC Espress 2010 を使用した C++ Win32 プログラミング

4

3 に答える 3

1

やや堅牢なソリューションが必要な場合は、シングルトン風mapHDC->class*関係をラップする名前空間レベルの API に飛びつきます。その後、複数の HDC コンテキストで機能が必要になった場合でも問題ありません。パブリック API は に非常に似ていると思いますがSetAbortProc()、HDC ごとに対応するハンドラー オブジェクトも作成してマップします。

必要な HDC は 1 つだけなので、2 番目に近いのは、グローバル ポインターを使用して (何らかのアサーション/constness を使用して変更できないようにする)、中止コールバックを取得したときに設定されていることに依存することです。

于 2013-01-23T17:06:55.797 に答える
0

Microsoft は IME であり、ユーザーデータ パラメーターを与えるのが非常に得意なので、私は驚きました。しかし、それができない場合、最適な解決策は LLVM を使用することです。それらは、JIT サンクにシンプルで簡単な機能を提供します。

于 2013-01-23T17:10:17.087 に答える
-1

他のユーザーに常に制限されているユーザーデータを許可しないコールバックを備えた API を見るのは悲しいことです。個人的には、シングルトン型の使用に傾倒します。

おそらく、これを API の開発者に報告する必要があります。また、コールバック内の API からオブジェクトにアクセスできる場合、ポインタ/データを突き刺すことができるアーキテクチャの他の部分がある場合があることもわかります。私の意見では、これについて開発者に助けを求めることが最善の策です。自分自身を助けながら、彼らを助けることさえできます。

于 2013-01-23T16:57:21.790 に答える