1

非静的メンバー関数の関数ポイントを静的関数ポインターを期待する関数に渡すための機能を提供するためのチュートリアルのコードライブラリを使用しています。おそらく私が何を訴えているのかを知るのに役立つので、ここにリンクhttp:/があります。 /www.codeproject.com/KB/cpp/thunk32.aspxこのコードは、私がダウンロードしてほぼすべてのものをセットアップしたBoostライブラリを使用しています。

サンクライブラリでは、ヘッダーファイルの1つに次のようなセクションがあります。

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
??=include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

しかし、これは私に膨大な量のエラーを与え、それを次のように変更することで解決できます

#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,THUNK32_MAX_ARGS,"Thunk32_template.h"))
#include BOOST_PP_ITERATE()
#undef BOOST_PP_ITERATION_PARAMS_1

ダウンロードされたこのコードは、2番目のプロジェクトとして私のソリューションに含まれています。このプロジェクトは、正常にコンパイルおよびビルドできます。しかし、このコードを使用している私のプロジェクトにはリンクの問題があり、質問を保存するために、これらのエラーメッセージが表示されます

1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::Thunk32Base(void)" (??0Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??0?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol "protected: __thiscall indev::Thunk32Base::~Thunk32Base(void)" (??1Thunk32Base@indev@@IAE@XZ) referenced in function "public: __thiscall indev::Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>::~Thunk32<class WebCamera,void __cdecl(struct HWND__ *,struct videohdr_tag *)>(void)" (??1?$Thunk32@VWebCamera@@$$A6AXPAUHWND__@@PAUvideohdr_tag@@@Z@indev@@QAE@XZ)
1>WebCamera.obj : error LNK2019: unresolved external symbol _capCreateCaptureWindowA@32 referenced in function "public: bool __thiscall WebCamera::Init(struct HWND__ *)" (?Init@WebCamera@@QAE_NPAUHWND__@@@Z)

これは、コンストラクタとデストラクタが宣言されておらず、私のWebCamera.Init()も台無しになっていると言っていると思います。Thunk32プロジェクトがエクスポートするライブラリが他のプロジェクトに含まれていることを確認しましたが、それでもこれらのエラーが発生します。

??=include変更すべき正しい仮定を行ったかどうかを知りたいのですが、変更した#include場合、何を間違えたのか、または失敗したのかによって、これらのリンカーエラーが発生します。または、関数ポインターを非静的メンバー関数に渡すことができる別の方法を私に提供できれば、それは素晴らしいことです。

ありがとう

4

4 に答える 4

3

??=キャラクターの「三重音字」シーケンスです#。標準によれば、トリグラフは処理の最初のステップの1つとして処理されることになっています(フェーズ1-プリプロセッサがディレクティブを処理する前)。

??=include "whatever"

次と同等である必要があります:

#include "whatever"

だからあなたはその形を使うことができるはずです(なぜトリグラフがそもそもそこに置かれたのだろうか-ある種の邪悪な冗談かもしれませんか?)

ただし、トリグラフは問題と混乱を引き起こします(おそらくそれらが役立つ以上のものです)。そのため、コンパイラーはそれらについて警告したり、デフォルトでそれらを処理しないようになっているようです。VS 2010のコンパイラでは、デフォルトで三重音字処理がオフに/Zc:trigraphsなっています。オンにするには、オプションを使用する必要があります。

C++でのTrigraphシーケンスの目的を参照してください。詳細については。

于 2010-10-13T17:59:34.820 に答える
2

ああ、エイナル、いい男。最近、FlashやSharepointの作業を行っています。ノルウェー人は、三重音字を説明するかもしれません。

とにかく、複雑なことは何もありません。リンカーにいくつかのライブラリを調べるように指示するのを忘れただけです。プロジェクトを右クリックし、[プロジェクトの依存関係]をクリックして、サンクプロジェクトにチェックマークを付けます。これにより、Thunk32.libが確認され、ctorとdtorが解決されます。

もう一度右クリックし、[プロパティ]、[リンカー]、[追加の依存関係]、[winmm.lib]を追加します。これにより、capCreateCaptureWindowシンボルが解決されます。

于 2010-10-13T19:54:58.970 に答える
0

cppファイルで定義するのを忘れたindev::Thunk32Baseクラスで宣言されたコンストラクタとデストラクタがありますか?

于 2010-10-13T17:49:17.477 に答える
0

さて、私は今これを解決することができました。

Michael Burr nicleyによると、これ??=は基本的に入力と同じです#が、ハッシュ記号を持っていない人でも入力できるようになっています。C++でのTrigraphシーケンスの目的を参照してください。

その後、ハンス・パッサントは私が購入するためにボールを転がして、私が物事に完全にリンクしていなかったことを知らせてくれました。メインプロジェクトを右クリックし、[プロジェクトの依存関係]を選択して、thunk32コードを持つ他のプロジェクトを選択する必要がありました。また、メインプロジェクトに、Thunkプロジェクトがlibを保存している場所を確認するように指示する必要がありました。これは、ドキュメント内のフォルダーにあることがわかりました(説明してください)。また、Thunk32d.libを追加する必要がありました(デバッグモードであったため、「d」に注意してください。ハンスは必要winmm.libだと言いましたが、それが判明しました(Vfw32.lib代わりに必要なエラーを発生させていた関数をグーグルで検索したとき)。

みんなありがとう!このように完全に答えることで、同様の問題を抱えている他の人の助けになることを願っています。

于 2010-10-14T14:24:20.230 に答える