CLisp 15:调用操作系统API例如kernel32.dll

本文介绍了如何在LISP中调用C语言编写的Windows DLL函数,通过新建useapi.lisp文件并利用FFI(Foreign Function Interface)封装系统API。演示了如何调用`GetCommandLineA`函数获取当前进程的命令行参数,并解释了LISP程序与C语言函数之间的交互原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面介绍了如何在LISP中调用C语言编写的函数,而Windows操作系统的DLL也是C/C++语言编写的,其API使用C语言的命名规范,那么用同样的方法也能调用系统API。
新建一个useapi.lisp文件,其内容如下
(defpackage test-api
  (:use common-lisp ffi)
  (:export :cmd-line))
(in-package test-api)
(default-foreign-language :stdc)
(def-call-out cmd-line
  (:name "GetCommandLineA")
  (:return-type c-string)
  (:library "kernel32.dll"))

 

在LISP执行(load "useapi.lisp")
再执行(test-api:cmd-line)
返回了当前进程的命令行参数 ".\\full\\lisp.exe -M lispinit2.mem -q"

 

其实,CLisp里面已经封装好了kernel32.dll、user32.dll、advapi32.dll、shell32.dll。
在full模式下可用,例如(win32:GetCommandLineA)和上面例子达到相同的效果,特别注意函数名是区分大小写的,和其它LISP函数不一样。
要想了解有哪些函数可用,可以查看clisp\bindings\win32\win32.lisp文件。

 

为什么LISP中可以调用C语言写的函数?
其实很简单,就是动态加载DLL技术,再根据函数名获取函数地址,很多地方有介绍。LISP程序本身也是C语

言写的,加载DLL更方便。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值