アンマネージ Win32 DLL に可変数の引数を取る関数があるため、他の呼び出し規約__cdecl
ではなく、その必要があります。__stdcall
現時点では、DLL に明示的にリンクしています (つまり、DLL のファイルにリンクするのではなく、LoadLibrary
andを使用しています)。GetProcAddress
.lib
関数を問題なく呼び出すことができますが、cdecl
各呼び出しの後に次のインライン アセンブリ命令を追加する必要があるためです。
retVal = addVecs(v1, v2, v3, v4);
__asm add esp, 64 ;Sizeof VECTOR struct is 16 bytes
printf("The sum of all these vectors is:\n\tMagnitude: %f\n\tDirection (radians): %f\n\n", retVal.mag, retVal.dir);
インライン アセンブリを含めないと、addVecs の呼び出し後にプログラムがクラッシュします。
インライン アセンブリ命令が不要になるように EXE または DLL を作成する方法はありますか? たとえば、printf
も__cdecl
関数ですが、呼び出すたびにスタックが確実にクリーンアップされるようにインライン アセンブリを記述する必要はありません。