問題タブ [stdcall]

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 に答える
1180 参照

c++ - 呼び出し規約が混在しているとコンパイル エラーが発生する

いくつかの API 関数を持つライブラリ (C++) があります。そのうちの 1 つは __cdecl として宣言されていますが、__stdcall から関数ポインターを取得します。何かのようなもの:

次に、このライブラリを使用する C++ 実行可能プロジェクトがありますが、上記の API を呼び出さないか、Func型を使用しません。

の呼び出し規約を に変更した後Func__stdcall次のコンパイル エラーが発生します。

エラー C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))': 関数テンプレートは既に定義されています c:\program files\ Microsoft Visual Studio 8\vc\include\functional

それは何でしょうか?

前もって感謝します!!

0 投票する
9 に答える
115889 参照

c++ - stdcall と cdecl

stdcallcdeclという 2 種類の呼び出し規則があります。それらについていくつか質問があります。

  1. cdecl 関数が呼び出されたとき、呼び出し元はスタックを解放する必要があるかどうかをどのように判断しますか? 呼び出しサイトで、呼び出し元は、呼び出されている関数が cdecl 関数か stdcall 関数かを認識していますか? それはどのように機能しますか?呼び出し元は、スタックを解放する必要があるかどうかをどのように判断しますか? それともリンカーの責任ですか?
  2. stdcall として宣言されている関数が関数 (cdecl として呼び出し規則を持つ) を呼び出す場合、またはその逆の場合、これは不適切でしょうか?
  3. 一般的に、 cdecl と stdcall のどちらの呼び出しの方が速いと言えますか?
0 投票する
2 に答える
103 参照

c++ - スレッド用の関数を通常どおり呼び出す

私はプロトタイプで関数を持っています

これは、スレッド化されたアプリの CreateThread で使用することを意図していました。

問題なく CreateThread で呼び出します。しかし、コードの別の場所では、blah(NULL) だけで通常どおり呼び出します。この部分になるとクラッシュします。これは、WINAPI の部分が __stdcall になり、そのような __stdcall 関数を呼び出すことができないためですか?

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

windows - Microsoft が API 規則として stdcall を選択したのはなぜですか?

正当な理由はありますか?

それらの内部関数 (エクスポートされていない) も stdcall 規則ですか?

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

windows - stdcall は可変引数を持つことができますか?

私の知る限り、可変引数を使用できるのは caller-clean-stack 規則だけです。
ちなみに、WinApi StringCchPrintfW はこのように宣言されています。 (SAL は削除しました)

__inline HRESULT __stdcall
StringCchPrintfW(
STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat, ...
);

stdcall にも可変引数を指定できますか?

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

c++ - リンカ エラー LNK2019 が __stdcall にトレース バックされる 正しいライブラリを取得したと思います - これを解決するにはどうすればよいですか?

LabCVI プロジェクトを MSVS 2010 C++ Express に移植しようとしました。次のようなコード行があります。

リンカー エラーが発生します: LNK2019 "_InitCVIRTEEx@12" - すべての関連するヘッダーには既に cpp ステートメントが含まれています。

私はあなたのために組み合わせたこれらのスニペットにエラーをさかのぼります:

これを要約すると:

この呼び出しは cvirt.lib で定義する必要があります - ライブラリパス (CVI2009\extlib\msvc) に追加されます。リンカー エラーが引き続き発生し、理由がわかりません。

ライブラリを別の方法で追加する必要がありますか? これが本当に正しいライブラリであることを確認するにはどうすればよいですか? エラーはまったく別のものを意味しますか?

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

winapi - NASM で LONGLONG RtlLargeIntegerDivide(LONGLONG, LONGLONG, LONGLONG*) を呼び出す (stdcall)

次の関数を呼び出そうとしています:

アセンブリ コード (NASM) で。stdcall 呼び出し規約を使用し、商を返します。仕様は次のとおりです。

入力: [EDX,EAX] (被除数)、[ECX,EBX] (除数)

出力: [EDX,EAX] (商)、[ECX,EBX] (剰余)

どうすればこれを行うことができますか?(私の主な問題は、EBP と ESP を正確に理解しているわけではなく、それらがローカル変数とどのように関係しているかということです。)

(いいえ、これは宿題ではありません。ラッパー C ランタイム ライブラリを実装しようとしています。)

ありがとうございました!

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

c++ - __stdcall typedefg++の問題

このコードは(私が期待するように)コンパイルされます:

しかし、これは:

あまり役に立たないエラーメッセージで失敗します:

Vistaでg++3.4.2を使用しています(古いですが、現在、他の環境にアクセスできません)。明らかに、私はここで何かが欠けています。どんな助けでもいただければ幸いです。

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

c++ - extern c および dllexport とモジュール定義 (msvc++) を使用した stdcall 名マングリング

呼び出し規約を次のように指定するアプリケーション (fyi: mIRC) で動作するように、dll の簡単なテスト関数をエクスポートしようとしていました。

アプリケーションからこれを呼び出すには、test_funcを使用しますが、名前マングリングのために、思ったほど単純ではないことに気付きました。

ここでの同様のトピックを通じて、extern "C"を__declspec(dllexport)と組み合わせて使用​​することは、モジュール定義 (.def) へのマングリングを削除する同等の (ある程度) 方法であることがわかりました。ただし、extern/dllexport メソッドを使用する場合、私の関数 (例として) は常に_test_func@numbers ですが、.def は、エクスポートする必要のあるアプリケーションで使用するために必要なすべてのマングリングを削除しました。

誰かがこれがなぜなのか説明してもらえますか? 私は2つの方法に興味があります。ありがとう!

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

.net - (.NET 3.5 で) 呼び出し規則に違反した場合に PInvoke がクラッシュしないのはなぜですか?

私のソリューションには、関数をエクスポートするアンマネージド C++ DLL と、この関数を PInvoke するマネージド アプリケーションがあります。

ソリューションを .NET 3.5 から .NET 4.0 に変換したところ、この PInvokeStackImbalance "A call to PInvoke function [...] has unbalanced the stack"例外が発生しました。結局のところ、__stdcall だったので、__cdecl された関数を呼び出していました。

C++ 部分 (呼び出し先):

C# 部分 (呼び出し元):

それで、私はバグを修正しましたが、これが .NET 3.5 でどのように機能したのかに興味がありますか? (何度も繰り返される) 誰も (呼び出し先も呼び出し元も) スタックをクリーンアップせず、スタック オーバーフローやその他の不正行為を引き起こさず、正常に機能したのはなぜですか? Raymond Chen の記事で言及されているように、PInvoke には何らかのチェックがありますか? また興味深いのは、反対のタイプの規約違反 (__stdcall 呼び出し先を __cdecl のように PInvoked にする) がまったく機能せず、単に EntryPointNotFoundException が発生する理由です。