65.9K
CodeProject 正在变化。 阅读更多。
Home

调用 VB 和 C++ 中的 DLL

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.21/5 (17投票s)

2002年3月21日

2分钟阅读

viewsIcon

246604

对 VB 和 C++ 中使用 __stdcall 和 __cdecl 的简要描述。

DLL 调用约定

DLL 函数有几种调用约定,其中最常见的两种是 __cdecl__stdcall。 大多数 Windows API 函数都是用 __stdcall 声明编写的,并且是 DLL 中最常用的。 这两种声明非常不同,虽然可以在 C++ 的调用例程中互换使用,但这样做会破坏程序,造成严重的内存泄漏! 这些调用约定之间的实际差异并不重要,重要的是不要混淆它们。 一点要记住:在使用一种语言编写的 DLL,并在另一种语言中使用时,__stdcall 调用约定通常是最合适的。

在 VB 中动态调用 DLL

在 VB 中,加载 DLL 需要使用 __stdcall 调用约定 DLL 函数。

在 C++ 中动态调用 DLL

在 C++ 中,可以使用两种调用约定 __stdcall__cdecl(但不能互换!)。 在原型化 DLL 函数时,假定 __cdecl,无需显式地将其键入 typedef 语句中。 但是,在动态调用 __stdcall DLL 函数时,必须将其显式地写入 typedef 语句中。 这方面存在一些混淆,因为静态加载的 Windows API 函数在调用 DLL 函数时不需要在任何地方使用它。 但是,这是因为 typedef 已经存在于编译器的系统级文件中。

如果有人对此有疑问,请随时提问。 尽管这看起来很简单,但我绞尽脑汁才弄清楚为什么,当我动态调用 DLL 函数(这些函数为 VB 可移植性编写为 __stdcall,并在 C++ 中声明为默认值,因此为 __cdecl)时,程序运行良好,直到 DLL 调用之后的一段时间。 之后,一切都失控了,没有任何警告。 当我使用 __cdecl 调用约定重新编译 DLL 时,一切都很好。 现在我知道了,我想拯救大家在将来遇到这种情况时的一些麻烦。

© . All rights reserved.