召集会议
调用函数有几种约定,指定谁(调用者或被调用者)从堆栈中弹出参数,如何传递参数以及按什么顺序传递参数。C++默认使用 Cdecl
调用约定,但 C#需要 StdCall
,它通常由 Windows API 使用。你需要改变一个或另一个:
-
在 C++中将调用约定更改为
StdCall
:extern "C" __declspec(dllexport) int __stdcall add(int a, int b)
[DllImport("myDLL.dll")]
-
或者,在 C#中将调用约定更改为
Cdecl
:extern "C" __declspec(dllexport) int /*__cdecl*/ add(int a, int b)
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl)]
如果你想使用 Cdecl
调用约定和一个错位名称的函数,你的代码将如下所示:
__declspec(dllexport) int add(int a, int b)
[DllImport("myDLL.dll", CallingConvention = CallingConvention.Cdecl,
EntryPoint = "?add@@YAHHH@Z")]
-
thiscall ( __ thishisall )主要用于作为类成员的函数。
-
当函数使用 thiscall ( __ thishisall )时,指向该类的指针将作为第一个参数传递。