調用函數的時候內部的工作原理。
創(chuàng)新互聯建站專業(yè)為企業(yè)提供內黃網站建設、內黃做網站、內黃網站設計、內黃網站制作等企業(yè)網站建設、網頁設計與制作、內黃企業(yè)網站模板建站服務,十多年內黃做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。
不加的話默認是__cdecl,加的話變成__stdcall,
雖然沒有硬性規(guī)定,不過DLL導出方法比較習慣會是后一種。
它涉及到調用函數的時候如何傳遞參數。
函數調用的時候參數是通過運行時棧來傳遞的,將參數放入棧中,然后進入函數代碼執(zhí)行
在執(zhí)行完函數代碼之后,要將棧中的參數清理掉。此時應該由哪一邊來清理,是__cdecl和__stdcall最大的不同。
前者的原則是誰放進棧的誰清理,后者的原則是誰用完誰清理。
只要保證調用的一方的聲明和被調用的一方的聲明一致,就沒有問題
否則會出現兩邊都不清理參數或者參數被重復清理的問題,都會造成棧的不平衡,然后大多數情況下這個時候程序崩潰
啥?寫上WINAPI報錯是不是沒有引入必要的頭文件啊比如windows.h……
直接寫 __stdcall 來代替WINAPI也可以,如果沒有引入頭文件的話……
不能,只能生成.NET類庫
VB.NET相對簡單,上手快
VS是集合VB.NET C# VC.Net....等的編程語言平臺IDE,可以選擇安裝
和VB6.0差別很大
可以到網上查查.
一、帶窗體的dll創(chuàng)建
1、先新建 類庫(testdll),在項目中添加兩個窗體form1(主窗體)、form2,為了與后面的調用區(qū)分分別命名為fm1,fm2;并在fm1窗體中添加一個按鈕用來調用fm2如下圖
2、在fm1窗體代碼中先引用fm2, ? ?按鈕代碼調用fm2.如圖
3、生成dll,(class1.vb中不需要寫任何代碼)
二、調用dll
1、新建 一個windows應用程序并添加一個按鈕用來調用dll中的窗體,選 擇 “項目”-“添加引用”,選擇剛才創(chuàng)建的testdll
2、窗體代碼中先引用testdll,再定義一個testdll中的fm1對象,最后執(zhí)行對象的show方法
3、運行結果如下:
DLL(動態(tài)鏈接庫)是一個很有用的東西,在開發(fā)大項目的時候顯得非常重要,因為多人合作開發(fā)時,可以給每個人分配一個任務,用DLL完成,最后組合起來,就不會出現互相沖突的問題。這里給出最簡單的DLL編寫與調用的示例
首先,我們打開VB.NET,選擇類庫,名稱改為test
然后輸入以下代碼
Public?Class?test
Public?Function?test(ByVal?a?As?Long,?ByVal?b?As?Long)?As?Long
Return?a?+?b
End?Function
End?Class
保存后,生成DLL文件。
這就是最簡單的一個DLL,下面是調用該DLL的示例
新建一個工程,單擊“項目” -- 添加引用
找到剛才生成的DLL,雙擊它
添加引用以后,似乎什么也沒發(fā)生,這時我們輸入以下代碼:
Imports test.test
這樣,就包含了該DLL的類。
然后我們定義一個類
Dim test As New test.test
這樣,就可以使用里面的函數了,下面是程序示例
Imports?test.test
Public?Class?Form1
Private?Sub?Form1_Load(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?MyBase.Load
Dim?test?As?New?test.test
MsgBox(test.test(1,?2))
End?Sub
End?Class
運行該程序,可以看到,調用了DLL內的函數。
這就是最簡單的DLL示例,可以將一些復雜的代碼集成到DLL里,以后升級或重用都比較方便。
新建---類庫---把你的函數放在新建的類庫中-----生成ClassLibrary1
在net程序中---引用----對應目錄下的ClassLibrary1.dll
對應的代碼定義如: Dim mydll As New ClassLibrary1.Class1
最后就可以用mydll調用你的函數MyFunction了: mydll .MyFunction(1, 2)
注意:vb.net編寫的DLL不能用API函數的方式通過Declare宣告,只能引用的方式使用
vb.net要編寫的DLL能被vb6.0引用,需要先在編譯屬性中選擇“為COM互操作注冊”打勾
然后在Visual Studio 2008 命令提示中運用RegAsm命令加/tlb命令生成tlb文件
例如:c:\ReleaseRegAsm ClassLibrary1.dll /tlb回車就會在當前目錄生成ClassLibrary1.tlb文件
vb6.0中引用ClassLibrary1.tlb即可。
VB.net語言
1、創(chuàng)建組件定義
新建一個Probject,在代碼中寫入:
Public Interface IDemo
Function Test() As String
End Interface
2、實現組件定義
新建一個Probject,添加對上述Probject的引用后,在代碼中寫入
Public Class Demo
Implements IDemo.IDemo
Public Function Test() As String Implements IDemo.IDemo.Test
Test = "Hello World!"
End Function
End Class
3、編譯出Demo.dll組件
4、使用.net的工具 Visual Studio .Net 2003 Command Prompt,輸入以下命令
Regasm Demo.dll /tlb:Demo.tlb
把Demo.dll注冊為一個com對象(這個com對象不等同于普通的用VB編寫的Com對象),并導出類型庫Demo.tlb
5、新建一個VB工程,添加對Demo.tlb和IDemo.tlb的引用
6、定義兩個全局變量
Dim vbDemo As Demo.Demo
Dim vbIDemo as IDemo.IDemo
7、在Form_Load事件中初始化
'初始化實體類
Set vbDemo = New Demo.Demo
'將實體類引用到抽象類
Set vbIDemo = vbDemo
8、然后,我們就可以用 vbIDemo.Test 這樣的方法了