0

アンマネージ Win32 DLL に可変数の引数を取る関数があるため、他の呼び出し規約__cdeclではなく、その必要があります。__stdcall現時点では、DLL に明示的にリンクしています (つまり、DLL のファイルにリンクするのではなく、LoadLibraryandを使用しています)。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関数ですが、呼び出すたびにスタックが確実にクリーンアップされるようにインライン アセンブリを記述する必要はありません。

4

1 に答える 1

1

の呼び出し規約が正しいことを確認する必要がaddVecsあります。コンパイラのデフォルトに依存せず、これについて明示することには価値があります。

typedef VECTOR (__cdecl *addVecs_ptr)( VECTOR, VECTOR, VECTOR, VECTOR );

static addVecs_ptr addVecs = NULL;

このような typedef を使用した場合は、後でアドレスをロードするときにキャストが簡単になります。

addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );
于 2015-05-28T03:55:37.657 に答える