Calling conventions
Directive | Parameter order | Clean-up | Passes parameters in registers? |
register | Left-to-right | Routine | Yes |
pascal | Left-to-right | Routine | No |
cdecl | Right-to-left | Caller | No |
stdcall | Right-to-left | Routine | No |
safecall | Right-to-left | Routine | No |
使用 stdcall 方式是一种比较好的选择。
Delphi
引入
procedure Foo(...); stdcall; external 'foo.dll';
引出
procedure Foo(...); export; stdcall;
在 dpr 文件的“ {$R *.res} ”和“ begin end. ”之间加上
exports
Foo;
C++
引入
typedef void (_stdcall *FOO)(...);
FOO Foo;
HMODULE hDll = LoadLibrary("foo.dll");
Foo = (FOO)GetProcAddress(hDll, "Foo");
...;
FreeLibrary(hDll);
引出
void _stdcall Foo(...);
在 def 文件中导出符号。详见“ DLL 专题 .txt ”。
例如:
lib.def
LIBRARY LIB EXPORTS add @ 1 |
lib.h
int _stdcall add(int x,int y); |
lib.cpp
BOOL APIENTRY DllMain(...)
{
...
}
int _stdcall add(int x,int y)
{
return x + y;
}