【實例】java調(diào)用dll的文檔搜了不少,發(fā)現(xiàn)都不完整,或者說的不夠詳細(xì),這里通過自己的實際操作,并將過程做了整理,通過實例說明java如何用jacob調(diào)用dll里的函數(shù)。
由于某系統(tǒng)加密需要,需要實現(xiàn)從dll里實現(xiàn)某些功能(比如獲取當(dāng)前CPU序列號),并在Java中調(diào)用該函數(shù)。
(一)準(zhǔn)備工作:需要用到文件有:jacob.dll和jacob.jar分別放到j(luò)dk/bin下和class_path下。文件下載地址:
(二)建立一個VB的Activex Dll 工程,命名為名為getCPU,自動生成Class1文件(工程名字和類名建議用英文名,以防調(diào)用時編碼出問題),并添加代碼如下:
Private Type OSVERSIONINFO

dwOSVersionInfoSize As Long

dwMajorVersion As Long

dwMinorVersion As Long

dwBuildNumber As Long

dwPlatformId As Long

szCSDVersion As String * 128 ' Maintenance string for PSS usage

End Type

Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long


Public Function GetCPUid(para As String) As String


On Error GoTo doError


Dim len5 As Long, aa As Long

Dim cmprName As String

Dim Computer As String

Dim CPUs As Object, MyCpu As Object

Dim osver As OSVERSIONINFO

Dim SerialNo As String


'取得Computer Name

cmprName = String(255, 0)

len5 = 256

aa = GetComputerName(cmprName, len5)

cmprName = Left(cmprName, InStr(1, cmprName, Chr(0)) - 1)

Computer = cmprName '取得CPU端口號

Set CPUs = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2").ExecQuery("select * from Win32_Processor")

For Each MyCpu In CPUs

SerialNo = MyCpu.ProcessorId

Exit For

Next

GetCPUid = SerialNo

Exit Function

doError:

GetCPUid = ""

End Function


保存后編譯為getCPU.dll 并復(fù)制到Windows/System32下。
(三)將dll導(dǎo)入為com組件
運行命令:regsvr32 C:\windows\system32\getCPU.dll 顯示成功導(dǎo)入。
(四)建立測試Java文件,內(nèi)容如下:
package test;

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.*;


public class CallDll
{


public static void main(String args[])
{

ActiveXComponent app = new ActiveXComponent("getCPU.Class1");

Dispatch mycom = (Dispatch) app.getObject();


if(mycom!=null)
{


Variant result = Dispatch.callN(mycom, "GetCPUid", new String[]
{""});

System.out.print(result);

}

}

}
