十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一般VB.NET调用DLL可以通过Declare 语句在模块级用于声明对动态链接库 (DLL) 中的外部过程的引用。
成都创新互联公司长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为唐山企业提供专业的网站建设、网站制作,唐山网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET创建的DLL是个类库,不能生成标准的 DLL 文件,不能采用declare ()的方式。应该在解决方案资源管理器下的需要引用的项目的引用栏点击鼠标右键--添加对这个类库[mylib.dll]的引用即可。
以下为VB.NET调用DLL代码示例:
DllImport("kcomm.dll", CharSetCharSet:
=CharSet.Ansi, SetlastError:=True)
Private Shared Function gettxt(ByVal
port As Integer, ByVal wait As
Integer, ByVal _date As Long,
ByVal _time As Long, ByVal
filename As String) As Integer
End Function
根据实际情况更改你的DLL名称、函数名、参数名和类型。
VB.NET调用DLL的只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。
VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句:
Sub Main
If MsgBox("哈哈",
vbOKCancel) = vbOK Then
Shell "link2.exe "
Command$
End If
End Sub
然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。
然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
End Function
编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是:
Link2.exe "e:\\vbdll\\Class1.obj"
"e:\\vbdll\\Module1.obj"
"e:\\vbdll\\Project1.obj"
"E:\\Program Files\\Microsoft
Visual Studio\\VB98\\VBAEXE6.LIB"
/ENTRY:__vbaS /EXPORT:mathadd /OUT:
"e:\\vbdll\\ProjectOK.dll"
/BASE:0x11000000 /SUBSYSTEM:
WINDOWS,4.0 /VERS
注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要:
Private Declare Function mathadd
Lib "e:\\vbdll\\ProjectOK.dll"
(ByVal a As Long, ByVal b As
Long) As Long
先杀进程再删除文件
Visual Basic code
//杀进程代码
Private Sub KillProcess(ByVal processName As String)
Dim myproc As System.Diagnostics.Process = New System.Diagnostics.Process
Try
For Each thisproc As Process In Process.GetProcessesByName(processName)
If (Not thisproc.CloseMainWindow()) Then
thisproc.Kill()
End If
Next
Catch
End Try
End Sub
要声明一个DLL过程,首先需要在代码窗口的"通用(General)"部分增加一个Declare语句。如果该过程返回一个值,应将其声明为
Function:
Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type
如果过程没有返回值,可将其声明为Sub:
Declare Sub publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]
缺省情况下,在标准模块中声明的DLL过程,可以在应用程序的任何地方调用它。在其它类型的模块中定义的DLL过程则是模块私有的,必须在它们前面声明Private关键字,以示区分。下面分别介绍声明语句的各个组成部分。
(一)、指定动态库:
Declare语句中的Lib子句用来告诉Visual Basic如何找到包含过程的.dll文件。 如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),则可以不包含文件扩展名,如:
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
对于其它动态连接库,可以在Lib子句指定文件的路径:
Declare Function lzCopy Lib "c:/windows/lzexpand.dll" _
(ByVal S As Integer, ByVal D As Integer) As Long
如果未指定libname的路径,Visual Basic将按照下列顺序查找该文件:
①.exe文件所在的目录
②当前目录
③Windows系统目录
④Windows目录
⑤Path环境变量中的目录
下表中列出了常用的操作系统环境库文件。
动态链接库描述
Advapi32.dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)
Comdlg32.dll通用对话框API库
Gdi32.dll图形设备接口API库
Kernel32.dllWindows32位核心的API支持
Lz32.dll32位压缩例程
Mpr.dll多接口路由器库
Netapi32.dll32位网络API库
Shell32.dll32位ShellAPI库
User32.dll用户接口例程库
Version.dll版本库
Winmm.dllWindows多媒体库
Winspool.drv后台打印接口,包含后台打印API调用。
对于Windows的系统API函数,可以利用VB提供的工具API Viewer查找某一函数及其相 关数据结构和常数的声明,并复制到自己的程序中。
由于你要求的是能够动态的加载与卸载,所以这里选用了appdomain的load方法来加载一个程序集(同样的,卸载的时候调用appdomain的静态方法Unload即可).
另外由于,在appdomain.load的时候remoting会试图将程序集序列化到defaultdomain中去,这会产生问题,通常以一个"FileNotFoundException"结束,因此采用了一种折中的办法.
思路如下:
1.建立一个新的程序集,里面包含一个轻量的类型,这个类型只包含一个用来加载程序集的公共方法;
2.在你的主程序里面,用appdomain.load来加载上一步的程序集,接着实例化上一步的轻量的类型;
3.而后就可以像操作通常的对象一样,调用它上面的方法来加载你想要的程序集了;
源代码已经打包发给你了,
你看看吧~
如果有问题,再找我哈
方法有很多
1.拖动移开一些控件 把下边的控件显示出来 选择 del删除
2.通过属性窗口调出该控件属性,这时该控件的边框会被标记,然后点击该控件边缘的控制点(作用是给他控制焦点),然后按del
3.打开代码窗口, 打开窗口设计代码, 删除你不需要的控件的定义和初始化语句(一般先删除定义语句,然后所有有关的定义语句都会标记语法错误,然后就可以方便的看出来 ,最后就是把标记了错误的相关语句删除就ok了.)
Private Sub btnRemovePath_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRemovePath.Click
Try
' 先建立目录以便用于后续的删除示范。
If Not Directory.Exists("D:\网易") Then
Directory.CreateDirectory(" D:\网易 \Test1")
Directory.CreateDirectory(" D:\网易 \Test2")
Directory.CreateDirectory(" D:\网易 \Test3")
End If
' 删除子目录 Test1。
Directory.Delete(" D:\网易 \Test1", True)
' 删除子目录 Test2。
Dim myDirectoryInfo As New DirectoryInfo(" D:\网易 \Test2")
myDirectoryInfo.Delete(True)
' 将目录 C:\AlexDirDemo 及其以下的文件和子目录全数删除。
Directory.Delete(" D:\网易 ", True)
Catch ex As Exception
MessageBox.Show(ex.Message)
Exit Sub
End Try
' 启动 Windows 资源管理器。
Process.Start("explorer.exe", "D:\")
End Sub