1. 程式人生 > >asp呼叫DLL或com元件的簡述及網上摘例

asp呼叫DLL或com元件的簡述及網上摘例

動態聯接庫(DLL)是加快應用程式關鍵部分的執行速度的重要方法 asp呼叫DLL或com元件的方法:

步驟一:

<!--METADATA TYPE="typelib" FILE="Path/XX.dll" -->
''裝載 METADATA 標籤中指定的型別庫。 Path是mydll.dll在機器上存放的路徑

或者

(1)傳統的ActiveX DLL

要想讓COM能夠“看到”你的元件,必須先將元件註冊到登錄檔中:
regsvr32 XX.dll

(2)
在ASP中呼叫基於.Net開發的 DLL
關於元件註冊,一種方法是自動註冊,在vs.net2003或2005的IDE環境中可以實現COM元件的自動註冊,設定如下:專案名稱->右鍵"屬性"->配置屬性->生成->選中"為Com Interop註冊",編譯即可。
另一種方法是手動註冊:
regasm mydll.dll /tlb:mydll.tlb /CodeBase
注意CodeBase的使用,如果你要註冊的.NET程式集沒有強名稱的話,那麼在使用regasm註冊的時候就要加上/CodeBase。

步驟二:

建立相應物件:

<%

...

Set dice1=Server.Createobject("XXX")

...

%>

網上摘例:

例一:

首先,必須得有DLL檔案,本例是通過VB5.0建立ActiveX DLL檔案,這個檔案模擬了一個擲色子的過程。
在VB5.0的環境下,新建一個工程,並雙擊新建工程視窗中ActiveX DLL圖示,VB將自動為專案新增一個類模組,並將該專案型別設定為ActiveX DLL。在屬性視窗將類模組的名稱屬性改為clsDice。從工程選單中,選擇工程屬性,將工程名稱改為MyDLL。從檔案選單中,選擇儲存clsDice,將類模組儲存為myDice.cls。新增以下程式碼:
Option Explicit
Private Max, Point As Integer
Public Property Get Result() As Integer
Result = Point
End Property
Public Property Get Maxpoint() As Integer
Maxpoint = Max
End Property
Public Property Let Maxpoint(num As Integer)
Max = num
End Property
Public Sub Throw()
Randomize
Point = Int(Rnd * Max) + 1
End Sub
Private Sub Class_Initialize()
Max = 6
End Sub
  這個類模組定義了clsDice物件的兩個屬性和一個方法,這些屬性和方法模擬了擲色子的過程。其中Maxpoint屬性表示色子的面數,加入Property Let語句將使客戶能修改色子的面數;Result屬性表示最後擲出色子的點數;Throw方法代表擲色子的動作;Private Sub Class_Initialize語句將色子的面數預設的設定為6面。
  從檔案選單中,選擇生成MYDLL.DLL並將它儲存到適當的地方。至此,我們就建立了一個自己的DLL檔案。
  第二步要做的就是要在ASP檔案中引用類clsDice。
  ASP(活動伺服器頁面Active Server Pages)的所有程式碼都是在伺服器上執行的,客戶只能檢視以HTML形式傳回的結果。它使用“<%”和“%>”標記來標識指令碼程式碼,並不傳回客戶端,在程式碼外部,使用HTML標記來標識內容。在下面Dice.asp的程式碼中使用了CreateObject函式建立了一個clsDice物件例項,該物件來自於上面建立的ActiveX.DLL--MYDLL.DLL檔案,下面的例子使用了VBScript指令碼語言。

<!--METADATA TYPE="typelib" FILE="Path/mydll.dll" -->
''裝載 METADATA 標籤中指定的型別庫。 Path是mydll.dll在機器上存放的路徑
<html>
<head><title>在ASP檔案使用DLL</title></head>
<body>
<%
On Error Resume Next ‘當程式出現意外錯誤時能繼續執行
If Request.Form("T1")="" then
Session("point") = 6
Else
Session("point")=Request.Form("T1")
End If
''用Session("point")來存放色子的面數
Set dice1=Server.Createobject("MyDLL.clsDice")
''使用set語句建立dice1物件,其中MyDLL是上面建立dll檔案時的工程名稱(注意:不是檔案的名稱),clsDice為類模組的名稱。至此我們就可以用Maxpoint,Result和Throw屬性(方法)來對dice1物件進行操作。
If Request.ServerVariables("Request_Method")="POST" then
dice1.Maxpoint = Session("point") ‘設定色子的面數
dice1.Throw ’擲色子
%>
<form method="POST" action="dice.asp">
<p>當色子的面數為<input type="text" name="T1" size="5" value=<% = session("point") %>>時</p>
<p><input type="submit" value="擲色子" name="B1"></p>
</form>
<p>結果為:<% = dice1.Result %>點 </p> ‘返回結果
<%
Else
dice1.Maxpoint = Session("point")
%>
<form method="POST" action="dice.asp">
<p>當色子的面數為<input type="text" name="T1" size="5" value=<% = session("point") %>>時</p>
<p><input type="submit" value="擲色子" name="B1"></p>
</form>
<%
End If
%>
</body>
  在瀏覽器中瀏覽

http://localhoat/dice.asp,結果如附圖。注意:只有在WINDOWS NT+IIS3.0以上或WINDOWS9X+PWB的環境下才能正確瀏覽。

摘例二:

net的dll已經不是嚴格意義上的動態連線庫了,而是一個類或者類庫。它是不能直接在ASP、VB等其它的應用
環境中使用的。   我們可以通過COM包裝器(COM callable wrapper (CCW))來將.net的dll再次包裝,通過這個中間介質來實現相應的功能。

以下是一個小例子,供大家參考。
1. 在.net Visual Studio 中新建一個Class專案。
2. 在專案中新新增一個類,程式碼如下:

using System;

namespace ClassLibrary1
{


   //定義介面,這點很重要 (此介面中的方法與COM元件中的方法一致)
   public interface iClass1
   {

   string   test()   ;

   }


public class Class1 : iClass1
{
  
   private string t = "";
   //實現介面中的方法
   public string   test()
   {
  
   return "ok";
   }
}
}

3.在.NET命令列視窗中,建立金鑰對。
   可以用.net 自帶的工具:sn.exe 來建立金鑰對。
   如:SN –k testDll.Keys
4. 建立強命名程式集(Strong Name Assembly)
   在AssemblyInfo.cs檔案中,新增[assembly: AssemblyKeyFile(@"c:/test.keys")]屬性
  
5. 編譯整個專案,生成ClassLibrary1.dll (此DLL可在 /bin/Debug 路徑下找到。)
6. 在.NET命令列視窗中,生成型別庫
   tlbexp ClassLibrary1.dll /out:ClassLibrary1.tlb

7. 在.NET命令列視窗中,註冊裝配件
   regasm /tlb:ClassLibrary1.tlb ClassLibrary1.dll

8. 在.NET命令列視窗中,將.NET裝配件安裝到全域性裝配件快取(GAC)中
   gacutil /i ClassLibrary1.dll
  
9. 在asp中測試
   <%
   SET s = CreateObject("ClassLibrary1.Class1")
   Response.Write(s.test())
   %>
-----------------------------------------------




動態聯接庫(DLL)可以加快應用程式關鍵部分的執行速度,同時通過統一的COM介面呼叫,對DLL的使用也可以最大限度地發揮元件的重用性。使用者不必關心DLL採用什麼語言編寫,只需關注其提供了哪些功能及介面引數,便可以為我所用。
目 前,基於.Net技術編寫的DLL元件越來越多,而傳統的ASP中如果也可以應用這些元件提供的功能,可以避免很多程式設計師無謂的勞動。最近本人在工作中需 要在ASP中呼叫.Net環境下生成的DLL,做過一些研究,特將自己的經驗共享出來。其實都是很簡單的東西,高手儘管嘲笑,呵呵~

1、在ASP中呼叫傳統的ActiveX DLL
要想讓COM能夠“看到”你的元件,必須先將元件註冊到登錄檔中:
regsvr32 mydll.dll
然後在ASP中建立物件:
set mydll= server.createobject("mydll.method")
mydll.method
這樣就可以使用元件中的屬性和方法了。

2、在ASP中呼叫基於.Net開發的 DLL
關於元件註冊,一種方法是自動註冊,在vs.net2003或2005的IDE環境中可以實現COM元件的自動註冊,設定如下:專案名稱->右鍵"屬性"->配置屬性->生成->選中"為Com Interop註冊",編譯即可。
另一種方法是手動註冊:
regasm mydll.dll /tlb:mydll.tlb /CodeBase
注意CodeBase的使用,如果你要註冊的.NET程式集沒有強名稱的話,那麼在使用regasm註冊的時候就要加上/CodeBase。
註冊完畢,建立物件及使用方法與上面相同:
set mydll= server.createobject("mydll.method")
mydll.method

其實,不只是ASP,其他的COM程式(包括VBA、擴充套件儲存過程等等)呼叫DLL的方法都是一樣的。