問題タブ [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 投票する
3 に答える
3814 参照

c++ - DLL 内の関数の関数ポインターを宣言するための構文に "WINAPI*" を使用する必要がある理由

C++ コンソール アプリケーションと DLL があります。C++ アプリケーションでは、次のスニペットが表示されます::

大まかに言えば、a.DLL "function_1()" 内の関数への関数ポインタを取得していることを理解しています。

しかし、上記のスニペットの最初の 2 行を理解したい::

2 つの質問 :: 1) 「functABC」という名前は単なるランダムな関数ポインタ名ですか?
2) この 2 行で技術的に何をしているのか。関数ポインタを宣言しています。
3) 1 行目の関数ポインタ宣言で WINAPI* を使用する必要があるのはなぜですか。

前もって感謝します。

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

c - dllからエクスポートされていない関数の呼び出し規約に注意する必要がありますか?

私は現在、C顧客に出荷されるいくつかの DLL ライブラリの作成を含むプロジェクトに取り組んでいます。DLL はいくつかの関数をエクスポートし、エクスポートされたすべての関数は__stdcall呼び出し規約を使用します。ライブラリには、エクスポートされていないが、エクスポートされた関数によって使用されるいくつかの関数も含まれています。これらのローカル関数の呼び出し規約を気にする必要はありますか? ローカル関数の呼び出し規約をデフォルトのままにできますか?

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

c# - Windows サービスと通信するアンマネージ DLL (C++) を作成していますか?

パスワードの変更をキャプチャする dll ファイル (C++ を使用) を作成しました。ここで、WCF サービスを使用する Windows サービス (C# を使用して作成) に送信する必要があります。サービスと通信する方法は?

(dll はプリミティブであり、クラスがなく、Windows OS によって呼び出される必要があるため、_stdcall を使用します)

または、それを行う他の方法はありますか?dll 自体を C# で記述できますか? (アンマネージ)

0 投票する
0 に答える
65 参照

g++ - リンカは g++ からのオプションを無視します

g ++で@-suffixなしでオブジェクトファイルを作成しようとしています:

g++ -Wl,--add-stdcall-alias -c test.cpp

また

g++ -Wl,--kill-at -c test.cpp

しかし、どのオプションも機能しません。

使用: MinGW32 と g++ v4.4、ld v2.19.1

ありがとう!

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

c - stdcall関数のこのasmは、スタックから引数をどのように消去しますか?

私は簡単なコードを持っています。StdCallです。__stdcall_ CdeclCall___cdecl

StdCall の main() の Disassabmbly の一部 (MainはStdCall のスタックをクリアしません)

CdeclCall の main() の Disassabmbly の一部 (MainCdeclCall のスタックをクリアします)


現在、スタックから引数を削除するのは StdCall の責任ですが、逆アセンブルでは ags をポップしてスタックをクリア/クリーンするコードは表示されません。

StdCall の逆アセンブル

クリア スタック コードを生成するのはランタイム アクティビティですか、__stdcallそれとも概念が間違っていますか?

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

gcc - GCC は呼び出し規則属性を無視します

なぜこれがうまくいかないのか誰か知っていますか?

C++11 方言でコンパイルしようとすると、次のように表示されます。

「警告: 'stdcall' 属性ディレクティブは無視されました [-Wattributes]」

何故ですか?stdcall 呼び出し規約が本当に必要な関数があります。GCC のデフォルトの呼び出し規約は cdecl です。助言がありますか?

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

c++ - エクスポートされた関数を __stdcall に入れ、名前をマングル解除することは可能ですか?

オフライン テスト用のダミー DLL を生成するプロジェクトに取り組んでいます。互換性がないように見えますが、実際の DLL とそのヘッダー ファイルがあります。DLL 内の名前はマングルされていませんが、関数の前方宣言宣言は次のように呼び出されます__stdcall

たとえば .h

Dependency Walker の example.dll:

私が読んだ限りでは、__stdcall規約で関数をエクスポートできる場合、その名前は依存関係ウォーカーで次のように読み取られる必要があります。

これは、ヘッダー ファイルがコンパイルされた DLL に対応していないことを意味しますか、それとも何か不足していますか?

最終的に、ダミー関数のエクスポートを作成して、エミュレートしている実際の DLL と同じように動作させるにはどうすればよいでしょうか?

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

gcc - 引数を指定して Win32 関数を呼び出すと、GCC がフレーム ポインタを使用するのはなぜですか?

GCC と -fomit-frame-pointer オプションを使用して 32 ビット C コードをコンパイルすると、関数が stdcall と少なくとも 1 つのパラメーターを使用して Windows API 関数を呼び出さない限り、フレーム ポインター (ebp) は使用されません。

たとえば、パラメーター/引数を持たない Windows API から GetCommandLine() のみを使用すると、GCC はフレーム ポインターを省略し、他の処理に ebp を使用して、コードを高速化し、無駄なプロローグをなくします。

しかし、少なくとも 1 つの引数を受け入れる stdcall Win32 関数を呼び出した瞬間、GCC は -fomit-frame-pointer を完全に無視し、とにかくフレーム ポインターを使用します。汎用目的で ebp を使用できないため、コードの検査が悪化します。もの。言うまでもなく、フレームポインターはまったく無意味です。つまり、リリースおよび配布用にコンパイルしたいのですが、なぜデバッグを気にする必要があるのでしょうか? (デバッグしたい場合は、バグを再現した後、代わりにデバッグ ビルドを使用します)

私のスタックには、alloca のような動的割り当てが含まれていません。それで、スタックには定義された構造がありますが、GCCは私のオプションにもかかわらずダムメソッドを選択しますか? フレームポインターを使用しないようにするために欠けているものはありますか?

私が持っている2番目のグリップは、Win32関数に「プッシュ」命令を使用することを拒否することです. 私が試した他のすべてのコンパイラは、プッシュ命令を使用してスタックにプッシュしたため、よりコンパクトなコードになりました。言うまでもなく、stdcall の引数をプッシュする最も自然な方法です。しかし、GCC は頑固に "mov" 命令を使用して、スタック ポインターを完全に静的に保つ必要があるため、esp に対するオフセットで各スポットを手動で移動します。stdcall は呼び出し元にとって簡単になるように作られていますが、GCC は stdcall とのインターフェース時にこのくだらないコードを生成するため、stdcall の要点を完全に見逃しています。さらに悪いことに、スタック ポインターは静的なので、まだフレーム ポインターを使用しているのでしょうか。どうして?

-mpush-args を試しましたが、何もしません。

また、スタックをページ (4096 バイト) を超えるのに十分な大きさにすると、GCC は、4096 バイトごとに「ビット単位または」スタックをゼロにする (何もしない) 関数を含むプロローグを追加することにも気付きました。 . スタックが予約されている場合、スタックに触れてページフォールトでメモリを自動的にコミットするためだと思いますか?残念ながら、スタックの最初のコミット (予約ではありません) をスタックを保持するのに十分な高さに設定したとしても、これは行われます。最高の冗長コード。

これらのバグは GCC にありますか? または、オプションに欠けているものはありますか?他のものを使用する必要がありますか?いくつかのオプションが不足している場合は教えてください。

stdcall関数を呼び出してプッシュ命令を使用するためだけにインラインasmマクロを作成する必要がないことを真剣に願っています(これにより、フレームポインターも回避​​されると思います)。今日のコンパイラにあるはずの非常に基本的なものにとって、それは本当にやり過ぎに思えます。はい、私はGCC 4.8.1を使用しているため、古いバージョンではありません。

追加の質問として、GCC が関数プロローグでスタックにレジスタを保存しないようにすることは可能ですか? -nostartfiles 引数を指定して独自の直接エントリ ポイントを使用します。これは純粋な Windows アプリケーションであり、標準の lib スタートアップがなくても問題なく動作するためです。属性((noreturn))を使用すると、レジスタを復元するエピローグが破棄されますが、プロローグでスタックにプッシュされます。このエントリ ポイントのレジスタを保存しないように強制する方法があるかどうかはわかりません関数。いずれにせよ、少なくとも大したことではなく、より完全に感じられると思います. ありがとう!