CDecl清理代码在显式链接的DLL
CDecl cleanup code in explicitly linked DLL
我在一个非托管的Win32 DLL中有一个函数,它接受可变数量的参数,因此需要是__cdecl
而不是__stdcall
或任何其他调用约定。目前,我明确地链接到DLL(也就是说,我使用LoadLibrary
和GetProcAddress
,而不是链接到DLL的.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:ntMagnitude: %fntDirection (radians): %fnn", retVal.mag, retVal.dir);
如果不包含内联程序集,则在调用addVecs后程序崩溃。
是否有任何方法我可以写EXE或DLL,这样内联汇编指令是不需要的?例如,printf
也是__cdecl
函数,但我不需要编写内联汇编来确保每次调用堆栈后都清理堆栈。
您需要确保addVecs
的调用约定是正确的。这是值得明确的,而不是依赖于你的编译器的默认值。
typedef VECTOR (__cdecl *addVecs_ptr)( VECTOR, VECTOR, VECTOR, VECTOR );
static addVecs_ptr addVecs = NULL;
如果你使用了像这样的类型定义,它会使稍后加载地址时的强制转换变得容易:
addVecs = (addVecs_ptr) GetProcAddress( hSomeDllHandle, "addVecs" );
相关文章:
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 优化链接的 DLL
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 不能使用隐式链接.dll中的类
- 显式链接 DLL 和类方法
- 哪种方法更好获取静态链接DLL的模块句柄(HMODULE) - 使用GetModuleHandleEx()或LoadLibrary()?
- 在QtCreator中链接dll的未定义引用错误
- 如何在qt中链接dll
- 在虚幻4插件中链接DLL
- 我们可以动态链接 DLL 的不同方法是什么
- 如果使用LoadLibrary显式链接dll,则列出从PE文件导入的函数
- 静态链接.dll和cmake/qt创建者?
- 当显式动态链接dll时,使用std::unique_lock会破坏XP的兼容性
- 导出:使用c++链接DLL
- 使用xerces链接DLL会给出未定义的符号
- Visual Studio中的链接dll
- 链接DLL时命令行错误
- 如何链接.dll库与c++ VS项目
- 设置显式链接DLL的内部变量
- LNK 2019试图链接DLL和EXE