重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
一般VB.NET調(diào)用DLL可以通過Declare 語句在模塊級用于聲明對動態(tài)鏈接庫 (DLL) 中的外部過程的引用。
成都創(chuàng)新互聯(lián)公司長期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為唐山企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站制作,唐山網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
Private Declare Sub
myFunc1 Lib "mylib.dll"
(ByVal strName As String)
但是,VB.NET,C#.NET創(chuàng)建的DLL是個類庫,不能生成標準的 DLL 文件,不能采用declare ()的方式。應(yīng)該在解決方案資源管理器下的需要引用的項目的引用欄點擊鼠標右鍵--添加對這個類庫[mylib.dll]的引用即可。
以下為VB.NET調(diào)用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
根據(jù)實際情況更改你的DLL名稱、函數(shù)名、參數(shù)名和類型。
VB.NET調(diào)用DLL的只是COM組件,無法作為輸出函數(shù)的DLL,其實這只是個錯誤的說法。其實MS非常狡猾,如果你是個VB瘋狂發(fā)燒友的話,應(yīng)該早就狂試出這種可以創(chuàng)建輸出函數(shù)的DLL的方法。
VB編譯文件實際上采取了兩次編譯的方法,首先是調(diào)用C2.exe產(chǎn)生*.OBJ文件,然后調(diào)用Link.EXE連接。如果在LINK的時候添加EXPORT選項,實際上是可以輸出函數(shù)的。但是,在VB的工程選項中將這些屏蔽了。而且過分的是:VB在Build完成后會將OBJ文件刪除,這樣就無法手動通過Link來創(chuàng)建我們需要的DLL了。不過我找到一個比較齷鹺的變通的方法,就是先創(chuàng)建一個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調(diào)用Link.EXE時會彈出對話框,處理就會中斷。這時就可以有機會將OBJ文件拷貝出來了。
然后我創(chuàng)建了一個ActiveX DLL工程,在這個工程里面添加一個Module并創(chuàng)建一個Public函數(shù)mathadd:
Public Function mathadd
(ByVal a As Long, ByVal
b As Long) As Long
mathadd = a + b
End Function
編譯這個工程,在Link的時候就會中斷。然后把創(chuàng)建的Class1.obj、Module1.obj、Project1.obj備份出來。然后就可以調(diào)用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開關(guān),/EXPORT開關(guān)聲明了輸出函數(shù)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語句。如果該過程返回一個值,應(yīng)將其聲明為
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過程,可以在應(yīng)用程序的任何地方調(diào)用它。在其它類型的模塊中定義的DLL過程則是模塊私有的,必須在它們前面聲明Private關(guān)鍵字,以示區(qū)分。下面分別介紹聲明語句的各個組成部分。
(一)、指定動態(tài)庫:
Declare語句中的Lib子句用來告訴Visual Basic如何找到包含過程的.dll文件。 如果引用的過程屬于Windows核心庫(User32、Kernel32或GDI32),則可以不包含文件擴展名,如:
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
對于其它動態(tài)連接庫,可以在Lib子句指定文件的路徑:
Declare Function lzCopy Lib "c:/windows/lzexpand.dll" _
(ByVal S As Integer, ByVal D As Integer) As Long
如果未指定libname的路徑,Visual Basic將按照下列順序查找該文件:
①.exe文件所在的目錄
②當前目錄
③Windows系統(tǒng)目錄
④Windows目錄
⑤Path環(huán)境變量中的目錄
下表中列出了常用的操作系統(tǒng)環(huán)境庫文件。
動態(tài)鏈接庫描述
Advapi32.dll高級API服務(wù),支持大量的API(其中包括許多安全與注冊方面的調(diào)用)
Comdlg32.dll通用對話框API庫
Gdi32.dll圖形設(shè)備接口API庫
Kernel32.dllWindows32位核心的API支持
Lz32.dll32位壓縮例程
Mpr.dll多接口路由器庫
Netapi32.dll32位網(wǎng)絡(luò)API庫
Shell32.dll32位ShellAPI庫
User32.dll用戶接口例程庫
Version.dll版本庫
Winmm.dllWindows多媒體庫
Winspool.drv后臺打印接口,包含后臺打印API調(diào)用。
對于Windows的系統(tǒng)API函數(shù),可以利用VB提供的工具API Viewer查找某一函數(shù)及其相 關(guān)數(shù)據(jù)結(jié)構(gòu)和常數(shù)的聲明,并復(fù)制到自己的程序中。
由于你要求的是能夠動態(tài)的加載與卸載,所以這里選用了appdomain的load方法來加載一個程序集(同樣的,卸載的時候調(diào)用appdomain的靜態(tài)方法Unload即可).
另外由于,在appdomain.load的時候remoting會試圖將程序集序列化到defaultdomain中去,這會產(chǎn)生問題,通常以一個"FileNotFoundException"結(jié)束,因此采用了一種折中的辦法.
思路如下:
1.建立一個新的程序集,里面包含一個輕量的類型,這個類型只包含一個用來加載程序集的公共方法;
2.在你的主程序里面,用appdomain.load來加載上一步的程序集,接著實例化上一步的輕量的類型;
3.而后就可以像操作通常的對象一樣,調(diào)用它上面的方法來加載你想要的程序集了;
源代碼已經(jīng)打包發(fā)給你了,
你看看吧~
如果有問題,再找我哈
方法有很多
1.拖動移開一些控件 把下邊的控件顯示出來 選擇 del刪除
2.通過屬性窗口調(diào)出該控件屬性,這時該控件的邊框會被標記,然后點擊該控件邊緣的控制點(作用是給他控制焦點),然后按del
3.打開代碼窗口, 打開窗口設(shè)計代碼, 刪除你不需要的控件的定義和初始化語句(一般先刪除定義語句,然后所有有關(guān)的定義語句都會標記語法錯誤,然后就可以方便的看出來 ,最后就是把標記了錯誤的相關(guān)語句刪除就ok了.)
Private?Sub?btnRemovePath_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?btnRemovePath.Click
Try
'?先建立目錄以便用于后續(xù)的刪除示范。
If?Not?Directory.Exists("D:\網(wǎng)易")?Then
Directory.CreateDirectory("?D:\網(wǎng)易?\Test1")
Directory.CreateDirectory("?D:\網(wǎng)易?\Test2")
Directory.CreateDirectory("?D:\網(wǎng)易?\Test3")
End?If
'?刪除子目錄?Test1。
Directory.Delete("?D:\網(wǎng)易?\Test1",?True)
'?刪除子目錄?Test2。
Dim?myDirectoryInfo?As?New?DirectoryInfo("?D:\網(wǎng)易?\Test2")
myDirectoryInfo.Delete(True)
'?將目錄?C:\AlexDirDemo?及其以下的文件和子目錄全數(shù)刪除。
Directory.Delete("?D:\網(wǎng)易?",?True)
Catch?ex?As?Exception
MessageBox.Show(ex.Message)
Exit?Sub
End?Try
'?啟動?Windows?資源管理器。
Process.Start("explorer.exe",?"D:\")
End?Sub