問題タブ [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.
android - Android の共有ライブラリを使用した呼び出し規約
Unity3d アプリ用に C++ でいくつかのプラグイン ファイルを作成しました。これまでのところ、アプリは単純なプロトタイプにすぎないため、Windows 用の DLL としてコンパイルされたライブラリを使用してデスクトップでのみテストしました。今日、これらのファイルを Android (arm と x86 の両方) 用の .so(Shared Object) として再コンパイルしたところ、警告メッセージが表示されました。
警告: このターゲットに対して呼び出し規約 '__stdcall' が無視されました [-Wignored-attributes]
1. これは、すべての関数が __cdecl としてコンパイルされることを意味しますか?
2. .so ライブラリで呼び出し規約を指定できませんか?
__stdcall を __cdecl に置き換えましたが、警告メッセージも表示されます。
c++ - 他の関数で使用できるように、コールバックをグローバルにするにはどうすればよいですか?
次のような関数を宣言しました。
progress() コールバックをグローバル変数にして、同じ DLL 内の他の関数で使用するにはどうすればよいですか? 私はC++の初心者です。
c++ - C++ でリバースを学んでいますが、この行は何をするのでしょうか?
私が言ったように、C++ / アセンブリを使用してプログラムをリバース エンジニアリングする方法を学ぼうとしているので、インターネットで見つけたいくつかのオープン ソース プロジェクトを調べています。しかし、誰かがこの行が何をするのか説明できますか? 私は C++ の上級者ではありません。そのため、ソースを調べています。
c++ - 装飾されていない stdcall DLL からのインポート ライブラリの生成を自動化するには?
DLL から LIB を作成する一般的な方法は、.dll ファイルとヘッダー ファイルがある場合に .lib ファイルを作成する方法で説明されていますstdcall
。kernel32.dll
.)、かなり長くて複雑なプロセスを経る必要があります (たとえば、ここで説明されているように)。多くの機能を持つ DLL の場合、このプロセスは非常に時間がかかり、エラーが発生しやすくなります。また、元の DLL が変更された場合 (ベンダーの更新などにより)、自動ビルドの状況でも簡単に失敗します。
それを自動化する効率的な方法はありますか?
c++ - パラメータとして「異なる」呼び出し規約を使用して関数を渡す 64 ビット C++ であいまいなエラーが発生する
__cdecl
私の目標は、呼び出し規約と呼び出し規約の両方を使用して、任意の関数のプロトタイプを簡単に抽出すること__stdcall
です。32ビットで問題なく動作します。変更されている唯一のことは、テンプレート関数パラメーターの呼び出し規約です。
ウィキペディアによると:
Windows コンテキストで x64 アーキテクチャ用にコンパイルする場合 (Microsoft のツールを使用するか、Microsoft 以外のツールを使用するかに関係なく)、呼び出し規約は 1 つだけです。ここで説明するものであるため
stdcall
、thiscall
、cdecl
、fastcall
などはすべて同じものになります。
これにより、64 ビットのコードが壊れます。呼び出し規則は同じですが、関数をパラメーターとして渡すには、正しい命名法を使用する必要があります。IE で関数が として定義されている場合は__stdcall
、それを受け入れるラッパーに渡す必要があります__stdcall
。は同一ですが、を受け入れるラッパーに対して__cdecl
定義された関数を渡す必要があります。__cdecl
__cdecl
32 ビットで動作する例:
私の目標は、たとえば次のように実行できるようにすることでした。
これは 32 ビットでは問題ありません。ただし、 x64 では__stdcall
と__cdecl
は明らかに同一であるため、64 ビットでは機能せず、呼び出しが曖昧であるというエラーが発生します。また、テンプレートが既に定義されていることもわかります。直観的には、コンパイラはそれらを同一と見なすため、関数__cdecl
をこの関数に渡すことができるように思えます。__stdcall
ただし、これは機能しません。
エラー C2995 'WrapperFC<T,Args...> wrap(T (__cdecl *)(Args...))': 関数テンプレートは既に定義されています
それらの 1 つだけを保持する場合、これらの関数の両方を同時にラップすることはできません。
コンパイラがそれらを同じと見なす場合、異なる呼び出し規則を受け入れるために異なるテンプレートを用意する必要があるのはなぜですか? そして、私がそうすると、なぜそれは完全に壊れて、あいまいですでに定義されていると言うのですか?
TL;DR:
64 ビット アーキテクチャの呼び出し規約が同一である場合、ある呼び出し規約を別の呼び出し規約を期待する関数に渡すことができないのはなぜですか? どうすれば修正できますか?
visual-studio - MSDN または VS2015 が __stdcall 規則で IUnknown メソッドを宣言しないのはなぜですか?
この質問が少し焦点が合っていない場合はお詫び申し上げます。私は COM を使用して、Windows 10 の下で Visual Studio 2015 Community を使用していくつかの単純な COM サーバーとオブジェクトを作成しています。すべての COM オブジェクトは IUnknown インターフェイスを実装する必要があります。VS2015 の IDE は、スーパークラスの仮想関数の実装を提供します。したがって、これらの内容で「Example.h」を作成すると:
次に、右クリック メニューから [Quick Actions and Refactorings.../Implement all Pure Virtuals for class 'MyClass'] を選択すると、生成されたコードが .h ファイルに表示されます。
また、VS2015 はスタブ実装も提供してくれます。
それは素晴らしいことですが、コンパイルされません。次のエラー メッセージが表示されます。
エラー C2695: 'CFactory3::QueryInterface': 仮想関数のオーバーライドは、呼び出し規約のみが 'IUnknown::QueryInterface' と異なります
3 つの方法すべてでそのエラー メッセージが表示されます。__stdcall
これらの各メソッドの実際の宣言は呼び出し規約を指定するため、これは理にかなっています。MyClass
これで、次のように の宣言に追加できます。
それはうまくコンパイルされます。
まず、"Peek Definition" を使用すると、次のように表示されるため、使用する呼び出し規約がわかっています。
もう 1 レベル掘り下げると、それSTDMETHODCALLTYPE
は単純に として定義されたマクロであることがわかり__stdcall
ます。第二に、私が持っているチュートリアル資料のほとんどは、IUnknown メソッドをSTDMETHODIMP
マクロで実装することを推奨しています (これは に展開されHRESULT STDMETHODCALLTYPE
ます)。
ただし、 IUnknown メソッドに関するMSDN ページを見ると、特定の呼び出し規約が必要であるとは言及されていません。
したがって__stdcall
、IUnknown メソッドの MSDN ページで規則が言及されていない理由と、VS2015 IDE がサブクラスの IUnknown のスタブ実装にそれを含めなかった理由を疑問に思っています。
一般に、COM または Windows の他の部分によって呼び出されるメソッドまたは関数に必要な呼び出し規約を調べるにはどうすればよいでしょうか。
attributes - __attribute__ 文字列で _stdcall を囲む g++ を回避できますか
MinGW の g++ を使用して、次の機能を持つファイルを前処理します。
前処理の出力は次のとおりです。
出力の 2 行目を変更しないようにする g++ オプションはありますか? ファイルにアクセスできないと仮定して、g++ オプションを探しています。