問題タブ [thunk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
2246 参照

c++ - v-table サンクを使用してプロシージャ コールを連鎖させる

Vtable サンクに関するネット上の記事を読んでいましたが、サンクを使用して /chain プロシージャ呼び出しをフックできることをどこかで読みました。

それは達成可能ですか?

それがどのように機能するか知っている人はいますか? また、サンクを説明する適切なリソースを見つけることができません。そのための提案はありますか?

0 投票する
3 に答える
5369 参照

macos - Macgcc非仮想サンクエラー

これらの非仮想サンクエラーは、アプリのDeploymentビルドでのみ発生します。Lgiと呼ばれるプライベートフレームワークを使用します。XCode 3.1.4を使用した10.5.8でのビルド(leopardの最新ですか?)エラーは次のようになります。

とにかく、開発ビルドで実際にリンクして正常に実行されるため、これらを未定義のままにしないことを知っています。問題をグーグルで調べた後、最初に試すことは最適化設定を変更することです。これは私が行ったものです...そしてサイコロはありません。いくつかのリンクエラー。

したがって、これらの仮想関数は最初にGDragDropTargetで定義され、GWindowの継承は次のようになります。

(LgiClassはwin32での__declspecエクスポート/インポート用です)

次に何を試すべきかについてのアイデアはありますか?

ところで、これはフレームワークのフラグの例です。

そして、これはアプリケーションのコンパイル/リンクフラグです。

何が関係しているのかわからないので、全部投稿しました。

0 投票する
12 に答える
37614 参照

c++ - 「サンク」とは何ですか?

私はそれがプログラミング(特にC ++ドメイン)で使用されているのを見てきましたが、それが何であるかわかりません。デザインパターンかもしれませんが、間違っているかもしれません。誰かがサンクの良い例をあげることができますか?

0 投票する
1 に答える
2263 参照

c++ - サンクとATLサンク?

誰かがサンクとは何かを説明できますか?

とATLサンク?

サンクは vtbl とコードの実行に関係しており、適切な関数ポインターを見つけることができます。私は正しいですか?

0 投票する
1 に答える
4358 参照

dll - インポートアドレステーブルのサンクテーブル?

外部 DLL で使用される関数をインポートするために EXE ファイルで使用されるインポート アドレス テーブルに関連するサンク テーブルとは何ですか?

このサンク テーブルは、他の関数への「サンク」を含む単なるテーブルですか?

0 投票する
2 に答える
1378 参照

c++ - DLL によってエクスポートされたクラスの不適切な vtable レイアウト: ヘッダーと vtable の構築に関する明確化の要求

当面の問題は解決されましたが、クラスの vtable を構築するためにどのデータが使用され、vtable のレイアウトがどこに保存されるかについて、少し混乱しています。誰かが説明を提供してくれたり、私の好奇心を満たしてくれる情報を教えてくれたりできれば、とてもありがたいです。

バックグラウンド

  1. 2 つの個別の VC6.0 プロジェクト: 1 つは exe 用、もう 1 つは dll 用です。
  2. アプリケーションには、dll プロジェクト リリースの .lib、.dll、および .h ファイルが含まれています。
  3. 新しいリリースの準備が整うと、.lib、.dll、および .h ファイルがdll プロジェクトから exe プロジェクトにコピーされます。
  4. この仕組みを受け継いでいます。

問題:

最近、DLL に変更を加え、.lib と .dll をコピーしましたが、ヘッダー ファイルをコピーするのを忘れていました。いくつかの階層の変更があり、その結果、1 つの特定のクラス ( と呼びますInternalClass) の vtable が変更されました。

exe は のメソッドを直接呼び出しませんInternalClass。代わりに、オブジェクトInterfaceClassへのポインターをカプセル化し、そのポインターに対してさまざまなメソッドを呼び出す別のクラスのインスタンスを作成します (それを呼び出します) 。InternalClass

実行時に、メソッド内からInterfaceClassメソッドへInternalClassの呼び出しが、実際には間違ったメソッドを呼び出していました(つまり、InterfaceClass呼び出しInternalClass::AInternalClass::B実際に実行されていました)。asmを見ると、フィックスアップまたはサンク (専門用語が間違っていたらすみません!) がvtable への正しいオフセットを使用していたことがわかります。ただし、vtable 自体には、古いヘッダー ファイルから期待されるポインタのリストが含まれていました。

実際の質問:

私は自分の間違いに気づき、ヘッダー ファイルをコピーして再コンパイルしましたが、すべて問題ありませんでした。ただし、1 つのしつこい質問が残っています。

vtables のレイアウトはいつ決定され、実行時にこれらのクラスの vtable を構築するためにどのような情報が使用されますか? つまり、dll がコンパイルされたときに適切なvtable がアセンブルされている必要があり、オフセットなどを からInterfaceClassへの呼び出しに使用できるように思われInternalClassます。では、なぜ実行時に古い vtable が使用されたのでしょうか? exeが持っているヘッダーを使用してコンパイルされたときに、レイアウトも個別に決定されますか?

これがまったく明確かどうかはわかりません。私が求めていることが複雑すぎる場合はお知らせください。ありがとう!

0 投票する
1 に答える
123 参照

c - なぜ出力は「fooではa=7」なのですか?

6上記のコードのどこで?がインクリメントされるかは誰でも知っています1か?

0 投票する
4 に答える
381 参照

c++ - MSVS2010リンカーエラーの悲しみ-何が悪いのか完全にはわからない

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

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

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

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

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

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

ありがとう

0 投票する
1 に答える
155 参照

atl - ATL Windowing Thunking での esp Register の使い方についての質問

ATL がサンクによってウィンドウをその wndproc にフックすることはよく知られています。これは、実際に hwnd をこのポインターに置き換えて、wndproc にジャンプし、wndproc(hwnd, ...) への呼び出しが実際には wndproc(this, .. .) .

以下は、サンクが構築するアセンブリ コードです。

私の質問は、このサンクは1 回しか実行されないため、[esp+0x4] が別のプロシージャを呼び出すために CPU によって上書きされないことをどのように確認できますか。次に wndproc(...) が呼び出されると、hwnd が再び渡されます。 ? 私の理解では、 [esp+0x4] は、任意のプロシージャの最初のパラメーターを格納するための再利用可能な汎用レジスタです。

ここで何が間違っていますか?hwndの変更が永続的であることがどのように保証されていますか?

ありがとう。

0 投票する
2 に答える
1790 参照

c++ - 「非仮想サンクの欠落」と継承順序

C++ の大きなコード ベースがあり、小さなリファクタリング (1 つのクラスが追加され、関連するメソッドがいくつか書き直された) の後、GCC 3 & 4 でリンカー エラーが発生し始めました。大規模な SDK のクラスをサブクラス化した小さなサンプル プログラム。

Web を検索しても、解決されたように見えるいくつかの古い GCC バグ以外の多くのヒントは得られませんでした。

問題の属性は次のようです。

  • GCC 3.4.6 & 4.3.3 の最適化-O2
  • 時折の仮想継承を含む多重継承。
  • たとえば、サンクが欠落しているクラスで継承順序を変更すると、問題が「修正」
    class Foo: public A, public B {} されます。
    class Foo: public B, public A {}

仮想継承は、参照カウントのために非常に一般的に使用される単一の基本クラスにのみ表示されます。私は、このクラスのすべての使用が実際に仮想パブリックであることを確認しました。偶然のパブリック継承ではありません。

明らかに、継承順序をいじっても問題は解決しません。他に何がありますか?