2009年7月15日 星期三

PDM/PLM (SmarTeam) 二次開發 - Lesson Three - 使用 Script 呼叫 .Net 的 Client 端程式

上一篇有介紹用 Script 來開發 SmarTeam 的客製程式
本篇就介紹如何透過 Script 來呼叫 .Net 開發的客戶端程式
使用的開發工具為 Visual Studio 2005,基本上 2008 也行滴

要在 Visual Studio 中開發 SmarTeam 的應用程式,必須透過 SmarTeam 開放的 API
所以要把使用到的 SmarTeam DLL 加入參考
由於 SmarTeam 將程式安裝於 GAC,在系統中是無法找到相對應的 DLL 及 API 來使用
故首先必須把 GAC 中的檔案還原成 DLL,步驟如下##CONTINUE##
  1. 建立 C:\Program Files\SMARTEAM\Bin\Assembly 來存放萃取出的 DLL 檔
    在命令提示字元中輸入
    if not exist "C:\Program Files\SMARTEAM\Bin\Assembly" md "C:\Program Files\SMARTEAM\Bin\Assembly"
  2. 使用迴圈將 C:\WINDOWS\assembly 中屬於 SmarTeam 的 dll copy 至剛剛開的目錄
    在命令提示字元中輸入
    for /R C:\WINDOWS\assembly %f in (SmarTeam.*.dll) do copy %f "C:\Program Files\SMARTEAM\Bin\Assembly"
  3. 將目錄資訊註冊於登錄檔在命令提示字元中輸入
    call regedit /s RegisterSmarTeamAssemblies.reg
    登錄檔 RegisterSmarTeamAssemblies.reg 內容如下

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders]
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\SMARTEAM]@=
    "C:\\Program Files\\SMARTEAM\\Bin\\Assembly"
開發步驟如下
  1. 取得 SmarTeam 的 DLL 後,當然就是開啟 Visual Studio 專案,加入參考
    開啟一個 Visual Basic 的類別庫專案,命名為 MySmarTeamTest


















  2. 加入下列參考,dll 檔剛剛才拿出來過,應該沒忘記放哪吧
    SmarTeam.Std.Interop.SmarTeam.SmApplic.dll
    SmarTeam.Std.Interop.SmarTeam.SmRecList.dll

















  3. 新增一類別,命名為 SmToolTest.vb
    本範例共有兩個 Function
    HelloWorld1 是從 Script 抓取 User ID 傳入 String 型態參數
    HelloWorld2 是將 Script 抓到的重要參數(如 Session)傳給 SmToolTest 來處理,由.Net 程式來抓取 User ID,這樣的好處是在 Visual Studio 開發較方便,有 IntelliSense 可以查 Function,還可以使用 .Net 的 Run-time Debug Tool 來除蟲
    內容如下,

    '別忘了 Import
    Imports SmarTeam.Std.Interop.SmarTeam.SmApplic
    Imports SmarTeam.Std.Interop.SmarTeam.SmRecList

    Public NotInheritable Class SmToolTest
     Function HelloWorld1(ByVal sName As String)
       MsgBox("Hi: " & sName)

       Return ""
     End Function

     Function HelloWorld2(ByVal SmSession As SmSession, ByVal Operation As ISmOperation, ByVal FirstPar As SmRecordList, ByVal SecondPar As SmRecordList, ByVal ThirdPar As SmRecordList) As String

       MsgBox("Hi: " & SmSession.UserMetaInfo.UserLogin)
       Return ""
     End Function
    End Class

    ' IntelliSense









  4. 完成後進行編譯,在專案目錄下會產生 MySmarTeamTest.dll
    但 SmarTeam 是透過底層的 COM 來呼叫,故需把 MySmarTeamTest.dll 註冊成 COM
    在 MySmarTeamTest.dll 同層目錄中新增一文字檔,命名為 regCOM.bat
    檔案內容如下

    c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u MySmarTeamTest.dll
    c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /tlb /codebase MySmarTeamTest.dll

    完成後執行 regCOM.bat 來註冊
  5. 撰寫與 SmarTeam Hook 的 Script 檔
    於 SmarTeam\script 資料夾中新增一文字檔,命名為 Helloworld.ebs
    內容為
    Function HelloWorld(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer

     Dim MyDll As Object
     Dim sRet As String
     Dim SmSession As SmApplic.SmSession
     Set SmSession = SCREXT_ObjectForInterface(ApplHndl)

     '呼叫剛剛註冊於 COM 的物件
     Set MyDll = CreateObject("MySmarTeamTest.SmToolTest")
     '呼叫 HelloWorld1,傳入 USer ID
     sRet = MyDll.HelloWorld1( SmSession.UserMetaInfo.UserLogin )

     '把 Session 取出來傳給 HelloWorld2
     Dim RecListIn1 As Object
     Dim RecListIn2 As Object
     Dim RecListOut As Object

     Dim SmOp As SmApplic.ISmOperation
     Dim ObjectStore As ISmObjectStore
     Dim RecordListIn As SmRecordList

     On Error GoTo ErrorDetected
     Set ObjectStore = smSession.ObjectStore

     CONV_RecListToComRecordList FirstPar, RecListIn1
     CONV_RecListToComRecordList SecondPar, RecListIn2
     CONV_RecListToComRecordList ThirdPar, RecListOut

     '呼叫 HelloWorld2
     sRet = MyDll.HelloWorld2(SmSession, SmOp, RecListIn1, RecListIn2, RecListOut)

     Set MyDll = Nothing
     HelloWorld = ERR_None
    Exit Function
  6. 掛上 SmarTeam Hook 點,掛在 On Login 後(會管理 SmarTeam 應該都會開啟 Scrip Maintainance 管理工具吧?)















  7. 登入 SmarTeam 就會看到兩次歡迎視窗,大功告成

2 則留言: