明确链接的DLL

时间:2015-05-28 03:01:43

标签: c++ c dll calling-convention cdecl

我在非托管Win32 DLL中有一个函数,它接受可变数量的参数,因此需要__cdecl而不是__stdcall或任何其他调用约定。目前,我明确链接到DLL(也就是说,我使用LoadLibraryGetProcAddress而不是链接到DLL {{1} }文件)。

我可以很好地调用该函数,但是因为它.lib我需要在每次调用后添加以下内联汇编指令:

cdecl

如果我不包含内联汇编,则在调用addVecs后程序崩溃。

有没有办法可以编写EXE或DLL,以便不需要内联汇编指令?例如,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); 也是一个printf函数,但我不需要编写内联汇编来确保在每次调用后清理堆栈。

1 个答案:

答案 0 :(得分:1)

您需要确保addVecs的调用约定正确无误。明确这一点是值得的,而不是依赖于编译器的默认值。

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

static addVecs_ptr addVecs = NULL;

如果你使用了类似这样的typedef,那么当你重新加载地址时,它会让播放变得容易:

addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );