【Nim】调用DLL

作为一个系统级的编程语言,总是会和底层API打交道的,看看在Nim中怎么调用DLL函数

我这就用Delphi来制作DLL了,名称为MyDLL.dll

一、简单调用

导出一个简单的除法函数

function Division(x, y: Integer): Integer; stdcall;
begin
  Result := x div y;
end;

在Nim中可以这样用

# 定义DLL导出函数
proc Division(x, y: cint): cint {.stdcall, dynlib: "MyDLL", importc.}

echo Division(10, 5) # 2

重点在后面的编译指令,stdcall是函数调用约定,都懂的。

dynlib是动态库的文件名,可以不用写后缀。

importc表示从DLL中导入和定义名称相匹配的函数,当然,函数名字也可以随便取,但要把导出名称写在importc中

# 定义DLL导出函数
proc Foo(x, y: cint): cint {.stdcall, dynlib: "MyDLL", importc:"Division".}

echo Foo(10, 5) # 2

效果是一样的。

值得一提的是,dynlib如其名,是在程序运行时动态load的,并没有在编译时将函数信息写入PE文件导入表。

二、带回调的接口

Delphi定义如下

type
  TCallback = function(x, y: Integer): Integer; stdcall;

function TestCB(cb: TCallback): Integer; stdcall;
begin
  Result := cb(5, 10);
end;

Nim中

type
    # 定义回调函数类型
    TCallback = proc (x, y: int): int {.stdcall.}

# 回调函数
proc callback(x, y: int): int {.stdcall.} = 
    result = x + y

# 定义DLL导出函数
proc TestCB(cb: TCallback): cint {.stdcall, dynlib: "MyDLL", importc.}

echo TestCB(callback) # 15

 

你可能感兴趣的:(Nim)