問題タブ [cdecl]

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 投票する
3 に答える
466 参照

c# - C#/.NET ジェネリックと Cdecl Varargs のバグ?

なぜFoo()成功するのにBar()スローするのBadImageFormatExceptionですか?

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

c# - PInvoking C++ DLL 時の AccessViolationException (cdecl 呼び出し規約の問題?)

私はこれを調査するために一日中費やしましたが、私は賢明ではありません:

C++ DLL のメソッドを PInvokes する C# DLL があります。デバッグ モードでコンパイルするときは問題ありませんでしたが、リリース モードでコンパイルすると AccessViolationException が発生します。この問題をグーグルで検索すると、おそらく非準拠の呼び出し規約の問題であることがわかります。コードは C# では次のようになります。

および C++ の場合:

VS2010 で __cdecl 呼び出し規約を使用してコンパイルするように C++ プロジェクトを設定しましたが、それでも AccessViolationException が発生し、さらに何ができるかわかりません。私の C++ DLL はサードパーティの DLL を使用していることに注意してください。サードパーティの DLL が使用する呼び出し規約がわかりません。

どんな助けでも大歓迎です!

ああ、私の開発マシンでは例外が発生せず、ターゲット システムでのみ発生します。

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

c++ - __cdecl アンダースコア付きプレフィックスを強制する

私の会社は、アプリケーションに接続するために使用できる API 関数をサードパーティに提供する DLL をサードパーティに提供しています。DLL は VC9 で作成され、API 関数は VC の既定の呼び出し規約 (__cdecl) を使用しました。サードパーティは、このインターフェイスを中心にアプリケーションを構築しました。

私は今、更新されたバージョンの DLL を作成する任務を負っています。DLL には、古いものとまったく同じインターフェイスを持たせて、互換的に使用できるようにしたいと考えています。残念ながら、現在の開発環境は CodeGear RAD Studio 2007 であるため、それを使用して DLL を作成する必要があります。

最善の解決策は、古い DLL と新しい DLL の両方が関数を __stdcall としてエクスポートするようにすることです。その後、サードパーティ アプリケーションを再リンクして __stdcall 関数を期待することができ、誰もが満足するでしょう。残念ながら、さまざまな理由から、これは起こりそうにありません。

または、DLL で関数を __cdecl として宣言することもできます。サードパーティは __cdecl 関数を期待しているので、これは良い解決策のようです。残念ながら、CodeGear は __cdecl 関数の名前にアンダースコア ('_') を追加することを主張しています。これは、サードパーティ アプリケーションが、使用する DLL に応じて、条件付きでMyApiFunction(...)またはを呼び出す必要があることを意味します。_MyApiFunction(...)

私の質問は、API 関数を新しい DLL からエクスポートして、それらが __cdecl であり、アンダースコア ('_') のプレフィックスが付いていない方法を教えてください。

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

gcc - gcc cdecl 呼び出し規約

cdecl 呼び出し規則をテストしますが、これについては少し混乱しています: 元の C コード:

cdecl 規則では、呼び出し関数の後に esp 8 または他の同様の命令を追加するなどの命令を追加しません。これはなぜですか?ありがとうございました。

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

windows - ESPの値が適切に保存されていませんでした....およびC/C++の呼び出し規約

私は、OpenCVライブラリ、Boostライブラリ、およびこのLINKからダウンロードした一連のコードを使用してアプリケーションを作成しています。Thunk32と同じソリューションでプロジェクトを作成しましたが、次のファイルがあります。

MainProject.cpp

Window.h

およびWindow.cpp

これを実行すると、ウィンドウ内でマウスを動かさなくても問題なく、コールバックがcvSetMouseCallback関数に正常に渡されます。cvSetMouseCallback関数には、1。ウィンドウの名前、2。CvMouseCallback、およびNULL文字の3つのパラメーターがあります。CvMouseCallbackは次のように定義されます

CV_CDECLは、_cdecl呼び出し規約の単なる再定義です。

これで、私のmouseHandler関数はクラスメンバー関数になりました。これは_thiscall呼び出し規約に準拠していると思います。

私の質問は、マウスをウィンドウに置いたときに、少なくとも1回はメソッドに入ることができたのに、なぜ次のエラーが発生するのかということです。マウスが窓の中で動いた瞬間に変化があると思います。誰か助けてくれませんか?

これが私がしていることの画像です:

エラーと結果のある画像

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

c++ - cdecl エラー: 前にイニシャライザが必要です

cdecl 呼び出し規約に問題があります。

コンパイラに cdecl 呼び出し規約を認識させるにはどうすればよいですか?

ありがとう!

プラットフォーム: Windows 7; MinGW; GCC 4.6.1


これらの関数は、ファイル FRAMEWRK.H の「Microsoft Excel Developer's Kit、バージョン 14」の一部であるため、変更できません。

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

c - C と x86 アセンブリを組み合わせる場合の呼び出し規約の想定

C 関数によって呼び出され、C 関数から引数を取るアセンブリ ルーチンがいくつかあります。現時点では、これらの引数が cdecl の順序でスタックに渡されると想定しています。それは公正な仮定ですか?

コンパイラ (GCC) はこれを検出し、引数が正しく渡されていることを確認しますか、それとも手動で cdecl を宣言する必要がありますか? その場合、より高い最適化レベルを指定しても、その属性は保持されますか?

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

assembly - _cdecl呼び出し規約

_cdecl呼び出し規約に関する記事で、ライターは次のように述べています。

ローカルストレージの解放関数がローカルの一時スペースを割り当てるとき、スタックポイントから必要なスペースの量をデクリメントすることによって割り当てます。このプロセスを逆にして、そのスペースを再利用する必要があります。これは通常、スタックポインターに、以前に減算されたのと同じ量を追加することによって行われますが、一連のPOP命令で同じことを実現できます。

私の質問は、「差し引かれたのと同じ量をスタックポインタに追加する」または「一連のPOP命令」ではなく、ESPを現在のEBP値に単純に設定できるかどうかです。

好き:

後でこの関数のローカル変数の数を変更した場合、後で値を増やす必要がないため、私にとってはより良い方法のように思えます。

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

c - 可変個引数関数にcdeclを強制する方法

g ++を使用して64ビットオペレーティングシステムを作成していますが、次のような可変個引数関数があります。

これはprintfのように動作します。ここでの問題は、g++がSystemV ABIに従うため、RDI、RSI、RDX、RCX、R8、R9の最初の引数を渡し、残り(存在する場合)をスタックにプッシュすることです。

古いstdarg.hマクロva_start、va_argなどをcdeclで使用することは、va_argがスタック上の次の要素を取得するだけなので、すべて非常に簡単でした。しかし、これらのマクロは7番目の引数までまったく機能しません。

考えられる唯一の解決策は(IMHO)です。

  • g++にcdecl関数を作成させる。__属性__((cdecl))が意図的かつ明確に無視されているように強調表示されているため、これは不可能のようです。
  • 引数を渡す新しい方法で機能する新しいマクロのセットを用意します。

(私は実際にWinに取り組んでいるので、それらの実装をチェックするためのglibcヘッダーがありません)。

解決策を持っている人はいますか?前もって感謝します。

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

c++ - C++および完全に動的な関数

迂回路に問題があります。ご存知のように、迂回路は5バイトのスペース間でのみ移動できます(つまり、「jmp」呼び出しと4バイトのアドレス)。このため、クラス(メソッド)に「hook」関数を含めることはできません。スペースが不足しているため、「this」ポインタを指定できません(問題について詳しく説明します)。ですから、私は一日中解決策についてブレインストーミングを行ってきました。そして今、私はこのテーマについてあなたの考えを求めているので、それが可能かどうかわからないまま3〜5日間のプロジェクトを開始しません。

最初は3つの目標がありました。「フック」関数をクラスメソッドにし、アプローチ全体をオブジェクト指向(静的関数やグローバルオブジェクトなし)にし、最悪/最も難しい部分を完全に動的にしました。これは私の(理論上)解決策です。アセンブリを使用すると、実行時に関数を変更できます(完璧な例は迂回方法です)。では、関数を動的に変更できるので、それらを動的に作成することもできないのでしょうか。例えば; たとえば、最大30バイト(malloc / newを介して)にメモリを割り当てます。すべてのバイトを異なるアセンブリ演算子(0xE9は'jmp'など)に対応する2進数に置き換えてから、アドレスを直接呼び出すことはできませんか(関数が含まれているため)。

注:戻り値と、迂回したいすべての関数へのすべての引数を事前に知っています。GCCを使用しているため、thiscall規約は実質的に_cdeclのものと同じです。

これが私の考え/間もなく実装されるものです。'Function'クラスを作成します。このコンストラクターは、可変個引数を取ります(ターゲット関数の戻り値を記述する最初の引数を除く)。

各引数は、フックが受け取る引数の説明です(サイズ、およびポインターであるかどうか)。それで、のFunctionクラスを作成したいとしましょうint * RandomClass::IntCheckNum(short arg1);。次に、私はこのようにする必要があります:Function func(Type(4, true), Type(4, true), Type(2, false));。ここで、「タイプ」はとして定義されType(uint size, bool pointer)ます。次に、アセンブリを介して、引数の数と合計サイズを計算できるため、関数を動的に作成できます(注:これはすべて_cdecl呼び出し規約を使用します)。

編集:この例でType(4, true)は、は戻り値(int *)であり、scondType(4, true)はRandomClass'this'ポインターでありType(2, false)、最初の引数(short arg1)を記述します。

この実装では、クラスメソッドをコールバックとして簡単に使用できますが、大量のアセンブリコードが必要になります(これは特に経験がありません)。結局、動的ではないのは、コールバッククラスのメソッドだけです(これには、コールバックの前後も必要です)。

だから私は知りたかった。これは可能ですか?それにはどれくらいの作業が必要でしょうか、そして私はここで頭を悩ませていますか?

編集:私がすべてを少し曖昧に提示した場合は申し訳ありませんが、もっと徹底的に説明したいことがあれば、尋ねてください!

EDIT2:すべてのアセンブリ演算子の16進値をどこかで見つけることができるかどうかも知りたいですか?リストは1トンに役立ちます!および/またはasm( "");を何らかの方法で「保存」できる場合。メモリアドレスのコード(私は非常に疑わしい)。