C 调用

可以使用 ccall@ccall 调用 C 导出的(或形如 C 接口的)库(如 .dll 等)

Note

调用时常常使用 C 开头的类型名称,也会用到引用相关知识

ccall

原型是 ccall((function_name, library), returntype, (argtype1, ...), argvalue1, ...)ccall(function_name, returntype, (argtype1, ...), argvalue1, ...)ccall(function_pointer, returntype, (argtype1, ...), argvalue1, ...),其中 library 是库的路径;每个 argvalue 会通过 unsafe_convert(argtype, cconvert(argtype, argvalue)) 转化为 argtype 类型实例。

调用 C 标准库的示例(需注意,这些函数大多在 Libc 模块中已有,无需自己 ccall)

julia> ccall(:srand, Cvoid, (Cint,), 0)

julia> ccall(:rand, Cint, ())
38

一个调用 windows api 获取鼠标指针位置的示例:

mutable struct Point
	x::Clong
	y::Clong
end

julia> pt=Point(0,0)
Point(0, 0)

julia> ccall((:GetCursorPos,"User32.dll"),stdcall,Cint,(Ptr{Cvoid},),Ref(pt))
1

julia> pt
Point(681, 404)

@ccall

原型是 @ccall library.function_name(argvalue1::argtype1, ...)::returntype@ccall function_name(argvalue1::argtype1, ...)::returntype@ccall $function_pointer(argvalue1::argtype1, ...)::returntype

julia> @ccall srand(0::Cint)::Cvoid

julia> @ccall rand()::Cint
38

参阅