Visual C++调用Delphi编写的DLL函数应采用何种调用约定?
Delphi stdcall函数的VC++调用指针定义问题
两种写法都是正确的,核心原因如下:
1. __stdcall的直接匹配
你在Delphi中声明的CheckLicense用了stdcall调用约定,这和Visual C++里的__stdcall是完全对应的调用规则——包括参数入栈顺序、栈清理责任、名字修饰方式,直接使用__stdcall定义函数指针,能精准匹配Delphi导出的函数,避免调用错误。
2. CALLBACK的本质等价性
在Visual C++的Windows头文件中,CALLBACK是预定义宏,它的底层实现就是__stdcall(x86平台下;x64平台因调用约定统一,该宏会被忽略,但不影响兼容性)。所以用CALLBACK定义函数指针,和直接写__stdcall的效果完全一致,只是写法上更贴近Windows API的惯用风格。
额外注意点
- 你代码中的
extern "C"块是必须的:Delphi导出的函数是C风格命名(无C名字修饰),这个块能阻止C编译器对函数指针类型进行名字修饰,保证符号匹配正确。 - 参数类型匹配:
LPCTSTR和Delphi的PChar是匹配的——XE3默认Unicode环境下PChar是PWideChar,对应VC++ Unicode模式下的LPCTSTR(即const wchar_t*),只要两边编译模式一致,参数传递就不会有问题。
内容的提问来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

