中国最大的web开发资源网站及技术社区,
我们可以使用declare语句调用外部dll中的过程。但vb.net给我们提供了另外一种更加先进的----- dllimport特性。
如:
imports system.runtime.interopservices
<dllimport("user32")> _
function findwindow(byval lpclassname as string, byval lpwindowname as string) as integer
end function
<dllimport("user32")> _
function movewindow(byval hwnd as string, byval x as integer, byval y as integer, byval nwidth as integer, byval nheight as integer, byval brepaint as integer) as integer
end function
sub test()
dim hwnd as integer = findwindow(nothing, "untitled-nodepad")
if hwnd <> 0 then movewindow(hwnd, 0, 0, 600, 300, 1)
end sub
这样就可以不任何代码实现便可以调用外部的dll,即使我们改变方法名为findwindowa,也可以顺利的实现调用,因为使用dllimport特性编译器可以自动追踪实际的过程以及方法!
另外,dllimport特性海支持几种可选的参数,来精确定义调用外部过程的方式,以及外部过程的返回值方式.
charset 参数:用于说明字符串传递给外部过程的方式,可以是charset.ansi(默认),charset.unicode.charset.auto.
exactspelling参数:用于指定方法名是否和dll中的名称完全一致,默认值为true.
entrypoint参数:用于指定dll中的实际函数名称.
callingconvention参数:为入口点指定调用的约定,值有winapi(默认 值),cdecl,fastcallstdcall和thiscall.
setlasterror参数:判断被调用函数是否设置了最近一次win32错误代码,如果设置为true 则可以通过err.lastdllerror方法或marshal.getlastwin32error方法 读取这些代码.
preservesig参数:为一个boolean值,如果为true ,则将告诉编译器,方法不应被转换为一 个返回hresult值函数.
下面使用dllimport特性来调用myfunction.dll中的名为friend(friend为vb保留名称)的方法.dllimport特性带有unicode字符串,并影响win32错误代码:
<dllimport("myfunction.dll", entrypoint:="friend", charset:=charset.unicode, setlasterror:=true)> _
function makefriends(byval sl as string, byval s2 as string) as integer
end function