質問

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

それらの内部機能(エクスポートされていない)もstdcall条約ですか?

役に立ちましたか?

解決

これは、32ビットコードのPascal Calling Conventionへの適応でした。 Pascalは、OS/2やWindows 3などの16ビットオペレーティングシステムの呼び出しコンベンションでした。パスカルが選ばれた理由は少し推測されます。当時は小さな子犬でしたが、少し効率的です。 640 kbがあなたと一緒に仕事をしなければならなかったとき、それは重要でした。

ほとんどのWin32関数は、リンカーに提示される前にエクスポートされた関数がどのように装飾されているかを規定するため、真のstdcallではありません。 void mumble(int arg)のように、_マンブル@4になります。 @の後の数は、アクティベーションフレームサイズを説明します。しかし、ほとんどのWin32関数は装飾なしでエクスポートされます。おそらく、プログラマーにGetProcAddress()を機能させるための戦闘機会を与えるためです。この装飾は、リンカーが宣言されたAPI関数の署名と実際の署名の間の不一致を検出するのに役立つことを目的としていると思います。通過した議論の数に不一致があることは、カリーがスタックから多かれ少なかれ議論をポップするので、自動カブームです。診断も困難です。 STDCALLの弱点であるCDECLコンベンションには、この問題はありません。

内部呼び出しは、stdcall、cdecl、thiscallの間の混合バッグです。シングルステッピングWindowsコードは私が楽しんでいることではありませんが、パターンを検出したとは言えません。

他のヒント

STDCALLでコンパイルされたコードは、CDECL(代替)でコンパイルされたコードよりも大幅に小さくなっています。決定が下された時点で、コードが小さいコードが高速でした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top