問題タブ [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 - C - アンマネージ DLL から stdcall 関数を適切にインポートする
使用する関数を指定する .def ファイルを作成して、アンマネージ DLL から C プロジェクトに関数をインポートしようとしています。MessageBoxA
からWinAPI 関数の練習をしていますuser32.dll
。これは、他の WinAPI 関数と同様に stdcall 関数です。.def ファイルを作成する方法は次のとおりです。
次に、次のように .lib を作成しlib /def:"C:\Path\to\def\user32.def" /
out:"C:\path\to\project\user32-mb.lib"
ます。次に、私の C プロジェクトでは、次のことを行います。user32-mb.lib
user32-mb.exp
ただし、リンクすると、次のエラーが発生します。
error LNK2019: unresolved external symbol _MessageBoxA@16 referenced in function _main
ただし、.def の宣言を次のように変更すると:
そして、Cコードの関数プロトタイプを次cdecl
の代わりに変更しstdcall
ます。
EXTERNC __declspec(dllexport) int __cdecl MessageBoxA(void *hWnd, char *lpText, char *lpCaption, int uType);
メッセージ ボックスは実際に表示されますが、閉じるとすぐにエラーがスローされます。
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
cdecl
これは、結局必要なので、
で呼び出すことも悪い考えであることを示していますstdcall
。
stdcall
問題は、両方のエラーを回避し、関数を適切にインポートして呼び出すために、.def ファイルまたはプロジェクトで何を変更する必要があるかということです。
c++ - 関数ポインターに __stdcall を使用する理由
ここで言及されているようなコードを見ていました: winapi 関数の関数ポインター (stdcall/cdecl)、関数ポインターと呼び出し規約など。
関数ポインタの呼び出し型を として宣言する必要性、利点は何__stdcall
ですか?
関数ポインタの呼び出し型を宣言するのはなぜですか?
c++ - C++ DLL で VB6 ブール変数を stdcall 関数に渡す
VB6 ブール変数を関数 (C++、stdcall で記述) に渡すための最も安全な方法を探しています。
C++ 関数は、この VB6 変数を使用して構造体の「bool」変数を設定します。
C++ で次のように宣言してみました。
stSetParameter は次のように宣言されています。
DLL_sSetting は次のように宣言されます。
しかし、私はそれを機能させることができません。
私はVB6でそれを呼び出します
しかし、期待どおりに動作しません.VB6ブール値がどこかで失われたか、間違って変換されていると思います.
現在、VB6 Boolean、C++ BOOL、および C++ bool を使用しています。それがあまり良くないことはわかっていますが、他に方法がありません。
誰かが私のコードに何か問題を見つけましたか?
c++ - void(__cdecl MyClass::*)() を void * に変換中にエラーが発生しました
QT アプリケーションで外部ライブラリにリンクしようとしています。外部ライブラリには、呼び出しようとしている次の関連コードを含むヘッダー ファイルがあります。
提供されているデモ C++ プログラムでは、コンパイルに問題はありません。次の関連コードは次のとおりです。
このコードを QT アプリケーションに組み込もうとしていますが、問題が発生しています。私のmainwindow.cppファイルで:
私が得ているエラーは次のとおりです。
私は何をする必要がありますか?ありがとう。
assembly - x86のwinapi __stdcallで、2番目のパラメータはどのレジスタにありますか?
x86 の winapi __stdcall で、2 番目のパラメーターはどのレジスタに格納されますか? (ECX?) - また、これに関するドキュメントをどこで見つけることができますか?
c# - DllExport がエントリ ポイントを作成しない
Robert Giesecke の " UnmanagedExports " nuget パッケージを使用して C# アンマネージ DLL を作成しようとしていますが、エントリ ポイントが作成されていないようです。
完全なコードはこちら:
私は何を間違っていますか?
説明:
これは、署名付きの「 」という名前のエントリ ポイントを必要とするArma 3 用の拡張 DLL です。_RVExtension@12
編集:プロジェクト設定でターゲットプラットフォームをx86として指定しましたが、うまくいきませんでした。
gnu - コールバック関数に stdcall を追加すると、引数の不一致が発生する [GNU]
GNU コンパイル済み DLL に stdcall 呼び出し規約を追加しようとしています。
これが私のコードです:
この関数によって呼び出されています:
どこ:
問題は、このメモが表示されることです。
注: 「CTMCashAcceptCallback」が予期されますが、引数の型は「void (*)(const struct CTMEventInfo, const struct CTMAcceptEvent)」です
__stdcall を削除するか、代わりに __cdecl に置き換えると、その情報が得られません。GNU でコンパイルするときに stdcall を使用することはできませんか、それとも正しく行っていないのでしょうか?