問題タブ [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.
c - __stdcallとは何ですか?
私はWin32プログラミングについて学んでおり、WinMain
プロトタイプは次のようになります。
WINAPI
私はこの識別子が何のためにあるのか混乱し、見つけました:
これは何をしますか?これがリターンタイプの後に何かを持っていることに私は混乱しています。何__stdcall
のために?戻り型と関数名の間に何かがあるとはどういう意味ですか?
c++ - __stdcallと破損したスタック(C ++)を使った思考実験
今日、私の心は関数ポインターのトピックについてさまよっていました。そして、頭の中で次のシナリオを思いつきました。
このコードはスタックを破壊するので、このコードを実行した場合、どのような種類の問題が発生する可能性がありますか?
私は自分自身を調査してこれを行いますが、開発マシンから1週間離れています。
編集:ちょっと待ってください、私はもう少し考えていました。コメントで観察されているように、このコードの目的は、すべてが言われ終わったときにスタックにパラメーターを残すことでした(呼び出し元はスタックに2つのパラメーターを置き、呼び出し先は1つのパラメーターのみを期待します)は1つだけをポップします)。しかし、私のキャストは呼び出し規約について言及していないので、少なくとも発信者の観点からは、stdcallをキャストしていませんか?int function(int)は引き続きパラメーターをスタックからポップしますが、呼び出し元はキャストのために関数が__cdecl(デフォルト)であると考えるように戻りますか?(つまり、合計3つのパラメーターがポップされましたか?)
EDIT2:ロブによって確認されたように、その2番目の質問に対する答えはイエスです。スタックにパラメータを残したい場合は、__stdcallを言い換える必要があります。
visual-studio-2008 - Visual Studio でカスタム プロローグおよびエピローグ コードを使用してネイキッド関数を作成する
私が制御できないホストによって呼び出される dll に、いくつかのプラグイン コードを書いています。
ホストは、プラグインが __stdcall 関数としてエクスポートされると想定します。ホストは、関数の名前と、それが期待する引数の詳細を通知され、LoadLibrary、GetProcAddress を介して動的に呼び出しを作成し、手動で引数をスタックにプッシュします。
通常、プラグイン dll は一定のインターフェイスを公開します。私のプラグインは、dll の読み込み時に設定されるインターフェイスを公開します。これを実現するために、私のプラグインは、dll のコンパイル時に定義された一連の標準エントリ ポイントを公開し、公開されている内部機能に必要に応じてそれらを割り当てます。
内部関数はそれぞれ異なる引数を取る場合がありますが、これは物理エントリポイント名とともにホストに伝えられます。私の物理的な dll エントリポイントはすべて単一の void * ポインターを取るように定義されており、最初の引数からのオフセットと、ホストに伝達された既知の引数リストを使用して、スタックから後続のパラメーターを自分でマーシャリングします。
ホストは正しい引数を使用してプラグインの関数を正常に呼び出すことができ、すべて正常に動作します...ただし、a) 私の関数は、定義されているはずのようにスタックをクリーンアップしていません。 __stdcall 関数は 4 バイトのポインターを受け取るため、呼び出し元がさらに多くの引数をスタックにプッシュした場合でも、常に最後に 'ret 4' を実行します。b) 戻り時に ret 4 が 4 バイトをスタックからあまりにも多くポップするため、引数を取らない関数を処理できません。
私のプラグインからホストの呼び出しコードまでたどってみると、実際には a) はそれほど大したことではないことがわかります。ホストは、ディスパッチ呼び出しから戻るまでスタックスペースをいくらか失います。その時点で、スタックフレームがクリーンアップされ、ゴミがクリーンアップされます。でも...
b) は __cdecl に切り替えて、まったくクリーンアップしないことで解決できます。a) ネイキッド関数に切り替えて、独自のジェネリック引数クリーンアップ コードを記述することで、a) を解決できると思います。
呼び出されたばかりの関数が使用する引数スペースの量を知っているので、次のように単純になることを望んでいました。
しかし、 ret にはコンパイル時定数が必要なため、それは機能しません...何か提案はありますか?
更新しました:
ロブ・ケネディの提案のおかげで、うまくいくようです...
これは正しく見えますか?
c# - stdcallを使用してDelphiアプリにインポートできるC#DLLを作成する-可能ですか?
できればC#でDLLを作成する必要のあるプログラムがあります。プログラムはDelphiで記述されており、コーディングするインターフェイスファイルがあります。インターフェイスはstdcall呼び出し規約を使用します。
インターフェイスに準拠し、Delphiアプリケーションで使用できるC#DLLを作成することは可能ですか?
C#DLLをstdcallインターフェイスメソッドにコーディングする方法を示すサンプルコードはありますか?
c++ - 「構文エラー: _stdcall」をデバッグするには?
このコードを使用して、カード リーダーとの通信に必要な API を定義しようとしています。以下は、ヘッダー ファイル (完全) です。[AtUsbHid.h]
いくつかのエラーがスローされていますが、構文の問題が解決されれば、残りはうまくいくと思います。
__export が __declspec に置き換えられたことを確認しました。これはもともと VC++6 でコンパイルされたものであり、VS2005 を使用しているため、何か不足している可能性があります。
エラー C2059: 構文エラー: '__stdcall'
dll - stdcallを使用するDLLからMSVCインポートライブラリを作成する
エクスポートするdllがあります
dllのダンプは示しています
私は次のdefファイルから始めました:
これにより、次のエクスポートを含むlibファイルが作成されました。
このライブラリにリンクすると、msvcリンカーが_Foo@0が見つからないと文句を言います。この問題を修正するために、defファイルにエイリアスを追加しました。
これにより、エクスポートを含むlibファイルが作成されます
これで、プロジェクトは問題なくリンクされます。しかし、実行しようとすると、メッセージが表示されます
プロシージャエントリポイントFoo@0がダイナミックリンクライブラリsimple.dllに見つかりませんでした。」
したがって、lib.exeにFoo @ 0はFooのエイリアスであると伝えたとしても、名前で「Foo@0」を読み込もうとするインポートライブラリが作成されるようです。
「Foo@0」を要求したときに、インポートライブラリに「Foo」をロードさせる方法はありますか?
ありがとう、
デビッド
c++ - GCCは装飾された関数名をdllからのみエクスポートします
私はdllを持っています、それは関数をエクスポートします...
これを Code::Blocks GCC コンパイラ (V3.4.5) でコンパイルします。問題: 結果の dll エクスポートは、装飾された関数名を...
これはロードに失敗します。普通の古いはずです...
私はこれを約4時間調査しました。--add-stdcall-alias はこれを修正するオプションだと思います。My Code::Blocks ログが表示されます...
mingw32-g++.exe -shared -Wl,--out-implib=bin\Debug\libGainGCC.a -Wl,--dll obj\Debug\se_sdk3\mp_sdk_audio.o obj\Debug\se_sdk3\mp_sdk_common.o obj\Debug \Gain\Gain.o obj\Debug\Gain\gain.res -o bin\Debug\GainGCC.sem --add-stdcall-alias -luser32
..だから、それが正しい選択肢だと思いますか?しかし、運がありません。Dependancy Walker は、エクスポートされている装飾された名前のみを表示します。__stdcall の代わりに __cdecl を使用してちょっとした作業を行いました。その後、名前は正常にエクスポートされますが、関数が呼び出されるとスタックが破損します (呼び出し元が他の呼び出し規則を予期していたため)。
c++ - C++ では、可変個引数関数 (パラメーター リストの最後に ... があるもの) は、必ず __cdecl 呼び出し規約に従いますか?
__stdcall 関数に省略記号を使用できないことはわかっていますが、__cdecl または __stdcall 以外の規則を呼び出すための stdarg.h 関数をサポートするプラットフォームがないことを確認したいと思います。
visual-studio-2010 - __cdecl 呼び出し規約を使用して boost をコンパイルするにはどうすればよいですか?
__cdecl
呼び出し規約 (msvc2010) を使用してコンパイルされたプロジェクトがあり、デフォルト設定を使用して同じコンパイラを使用してブーストをコンパイルしました。
プロジェクトはブーストにリンクされていましたが、実行時に次のようなアサート メッセージが表示されました: ファイル: ...\boost\boost\program_options\detail\parsers.hpp 行: 79
実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
次の質問があります。
- Windows (msvc2010) でデフォルトでビルドをブーストする呼び出し規約
- __cdecl 呼び出し規約でブーストをコンパイルする方法
- なぜブーストは異なる呼び出し規約を持つコードとのリンクを防ぐことができなかったのですか? ブーストには本当にスマートなライブラリ自動インクルージョン コードがあることを理解しました。
更新 #1
ブーストは適切な呼び出し規約でコンパイルおよびリンクしているように見えますが、実行時に上記の問題が発生します。同じコードを使用してサンプル アプリケーションを実行しましたが、動作しますが、私のアプリケーションでは失敗します。唯一の違いは、プロジェクト構成または includes/stdafx.h によるものです。
c++ - Linux に STDCALL はありますか?
Windows アプリを Linux に移植しようとしています。このアプリケーションは、一部の関数を属性でマークし__stdcall
ます。stdcall
ただし、 Windows でのみ使用され、Linux では意味がない (ただし、Windows GCC には存在する)友人から言われました。
Google で検索 - 一部の結果stdcall
では、Linux に IS があると述べています。
stdcall
Linuxにはありますか?
さらに、GCC は次のことを示します:
__attribute__((__stdcall__))
and __attribute__((stdcall))
(stdcall の近くにアンダースコアなし)。
どちらが優先されますか (Linux に適用される場合)?