一、Pro/Toolkit應用程序的運行機制
Pro/Toolkit程序集成到ProE程序中的標准方式是使用動態鏈接庫。當你編譯你的Pro/Toolkit C代碼並且和Pro/Toolkit庫建立鏈接,就會產生二進制的庫文件(dll),當ProE啟動時,它將被集成到ProE中。這種方式被稱為Dll模式。
Pro/Toolkit還支持另外一種集成方式:多進程模式或稱衍生模式。這種模式下,Pro/Toolkit程序被編譯鏈接成一個獨立的可執行文件。它衍生於ProE程序,作為ProE的子進程而運行。在Dll模式下,Pro/Toolkit程序與ProE程序之間的信息交換是通過直接的函數調用實現。而在多進程模式下,這兩個進程之間的函數調用需要傳遞必要的信息,以識別調用的是哪個函數以及函數的參數值。這樣就模擬出了和Dll模式中相同的效果。
多進程模式相對於Dll模式而言,其通信成本更大(備注:通信時間以及信息量),特別是當Pro/Toolkit程序頻繁地調用Pro/Toolkit庫函數時尤其明顯,因為進程之間函數調用的實現更為復雜。然而,它也有以下優點:可以讓你使用源代碼調試器調試程序而勿需將整個ProE可執行文件加載到調試器中。
在不改變Pro/Toolkit C源碼的情況下,你可將程序編譯鏈接成Dll模式或多進程模式。你也可以在同一個ProE進程中運行多個Pro/Toolkit程序,而且這些程序可以混合使用不同的模式。
如果你在編寫Pro/Toolkit程序時,為了方便調試采用了多進程模式,那么在給最終用戶安裝使用時,應當切換至Dll模式,因為在Dll模式下,程序會運行的更好。在切換至Dll模式后,請小心徹底的測試你的Toolkit程式再發布。因為在不同的模式下,ProE和Pro/Toolkit中任何導致內存損壞的編程錯誤都很可能有不同的表現。所以在切換至Dll模式后,可能會出現新的Bug。
雖然多進程模式可以觸發ProE與Pro/Toolkit程式並行運行,但本質上它們並非真正的並行運行。另外一種集成Pro/Toolkit程序的模式可以實現這個功能,我們稱之為異步模式。相對而言,我們把Dll模式及多進程模式稱之為同步模式。異步模式的Pro/Toolkit程序與同步模式程序在程序架構上是完全不同的,所以在編寫代碼之前,必須從這兩者中選擇一種。一般情況下,應默認選擇同步模式,除非有不可抗拒的原因,因為異步模式比同步模式更復雜。
二、利用VC 開發Pro/Toolkit應用程序
具體環境配置及步驟請參閱相關文章。
三、注冊Pro/Toolkit程序
注冊文件用於向ProE提供組成Pro/Toolkit程序的基本信息。ProE會通過注冊文件提供的信息來加載Pro/Toolkit程序。
ProE將會從下述位置順序搜索注冊文件:
(1)ProE配置文件(config文件)中以PROTKDAT、PRODEVDAT、TOOLKIT_REGISTRY_FILE指定的絕對路徑。
(2)當前目錄下的protk.dat或prodev.dat文件。
(3) <Pro/ENGINEER>/<MACHINE>/text目錄下的protk.dat或prodev.dat文件。
(4)<Pro/ENGINEER>/text目錄下的protk.dat或prodev.dat文件。
其中:
<Pro/ENGINEER>指ProE的安裝路徑
<MACHINE>指以計算機平台名稱指定的子目錄,如i486_nt子目錄。
如果在路徑(2)(3)(4)下存在多個名字相同的注冊文件protk.dat或prodev.dat,則ProE會以第一個同名的注冊文件為准,而忽略掉后續的同名注冊文件。例如:如果在當前目錄和<Pro/ENGINEER>/text目錄下均存在protk.dat注冊文件,則ProE會忽略掉<Pro/ENGINEER>/text目錄下的protk.dat文件,當然如果此時你將后者的名稱改為prodev.dat,則由於名字不同,兩個注冊文件都會讀取。
注意:(1)中指定絕對路徑的注冊文件名和(2)(3)(4)中沖突時則沒有影響。
例如在config.pro文件中指定
PROTKDAT D:\WangYao\iStudy\ProE\ProToolKit\TestTK\TEST_2\protk.dat
PROTKDAT D:\WangYao\iStudy\ProE\ProToolKit\TestTK\TEST_3\protk.dat
並且在當前目錄下有protk.dat,則這3個注冊文件都會讀取。
我們在開發Pro/Toolkit程序時,一般將注冊文件protk.dat置於特定的目錄下,這樣只有在該目錄下啟動ProE才會加載Pro/Toolkit。而在給用戶最終安裝使用Pro/Toolkit時,一般會將protk.dat注冊文件置於<Pro/ENGINEER>/text目錄下,這樣能保證無論從什么目錄啟動ProE,都可以讀取該注冊文件從而加載Pro/Toolkit程序。
注冊文件是一個簡單的文本文件,其中每一行均包含某個預定義的關鍵字,后接具體的值。
在Dll模式下,一個注冊文件的標准形式如下:
name ToolkitTest
startup dll
exec_file D:\Toolkit\Dll\TestTK.dll
text_dir D:\Toolkit\Dll
revision Wildfire
allow_stop TRUE
end
具體含義如下:
name --- 為Pro/Toolkt程序指定的名字ID,該名字必須具有唯一性。
startup --- 指定ProE與Pro/Toolkit程序的通信方式,本例指定為Dll模式。
exec_file --- 指定要加載的Pro/Toolkit程序的完整路徑
text_dir --- 指定包含Pro/Toolkit程序菜單與消息文件的目錄。
revision --- 指定創建應用程序所使用的Pro/Toolkit版本。為ProE3.0、4.0開發的程序請指定值為Wildfire。
end --- 結束標志
如果希望在多進程模式下運行,那么就必須對注冊文件做以下修改。
(1)修改startup語句為startup spawn
(2)修改exec_file的值以指向Pro/Toolkit的可執行文件。
四、啟動和停止Pro/Toolkit應用程序
Pro/Toolkit支持在一個ProE工作任務中停止和重啟一個同步應用程序的功能,這在開發Pro/Toolkit程序時很有用,因為它可以讓你不用重啟ProE,就可以修改程式源碼,編譯之后重新加載測試。
在ProE中,使用輔助應用程序對話框就可以停止和重啟Pro/Toolkit應用程序。如下圖所示
但有一個前提,你必須在注冊文件中加入以下語句:
allow_stop TRUE
若沒有加該語句或語句為allow_stop FALSE,則不能手動重啟與停止,並且在輔助應用程序對話框中將不會顯示該程式,除非點Info按鈕才會列出。
在ProE中通過點擊Tools菜單下的Auxiliary Applications子菜單項會彈出輔助應用程序對話框。在對話框中,將顯示以注冊文件中name語句指定的Pro/Toolkit 程序名列表,以及程序的當前狀態。
輔助應用程序對話框中:
Start用於啟動Pro/Toolkit應用程序。
Stop用於終止Pro/Toolkit應用程序。
Register用於加載Pro/Toolkit應用程序。
Delete用於從卸載Pro/Toolkit應用程序。
Info用於列出所有當前Pro/Toolkit應用程序的基本信息。
如果你想在啟動ProE不想立即運行所加載的Pro/Toolkit應用程序,應在注冊文件中加入以下語句:
delay_start TRUE
你可以通過輔助應用程序對話框中的Start按鈕啟動運行。
五、解鎖Pro/Toolkit應用程序
在你向最終用戶發布你的Pro/Toolkit應用程序之前,必須將其解鎖。這將確保用戶在沒有安裝Pro/Toolkit的情況下,仍然可以運行你的Pro/Toolkit應用程序。
要解鎖Pro/Toolkit應用程序,請在CMD窗口中輸入以下命令:
<Pro/ENGINEER Loadpoint>/bin/protk_unlock.bat Pro/Toolkit程序的完整路徑
Tips: 將protk_unlock.bat文件和Pro/Toolkit程序拖動到cmd窗口中即可,不用手動輸入那么麻煩。
解鎖成功顯示的信息如下:
解鎖Pro/Toolkit應用程序需要用到Pro/Toolkit License。每解鎖成功一個Pro/Toolkit應用程序會占用用到的Pro/Toolkit License 15分鍾,即該Pro/Toolkit License在這15分鍾內都無法使用了。所以,如果你只有一個Pro/Toolkit License,那么在解鎖成功一個Pro/Toolkit應用程序后的15分鍾內,你將無法再解鎖其他Pro/Toolkit應用程序了,因為該Pro/Toolkit License會被占用15分鍾,之后就又可以使用了。
六、Pro/Toolkit應用程序的結構
在每個Pro/Toolkit應用程序的源文件中,都必須包含頭文件:ProToolkit.h,而且必須為第一個包含的頭文件。因為它定義了寬字符wchar_t,而該類型被許多其他的Pro/Toolkit頭文件使用。Pro/Toolkit.h同時還包含下述這些標准頭文件:
stdio.h
string.h
stddef.h
stdlib.h。
同步模式的Pro/Toolkit應用程序必須包含user_initialize()和user_terminate()函數,它們由Pro/Toolkit應用程序開發者編寫,在啟動和結束Pro/Toolkit應用程序時由ProE分別調用。
注意:(1) Pro/Toolkit應用程序代碼中必須至少包含一個Pro/Toolkit函數的調用,否則ProE加載該Pro/Toolkit應用程序會出錯。
(2) 如果是用C++編寫Pro/Toolkit程序,請在user_initialize()和user_terminate()函數之前加上extern “C”。
user_initialize()函數必須返回0,以表示Pro/Toolkit應用程序已經成功地初始化,其他的返回值均會被認為是錯誤的,且系統會通知ProE用戶:Pro/Toolkit應用程序初始化失敗。
每個新Pro/Toolkit同步模式應用程序的開始處都必須要有如下代碼:
#include "ProToolkit.h"
int user_initialize()
{
return (0);
}
void user_terminate()
{
}
七、在Pro/Toolkit應用程序中使用多線程
Pro/Toolkit應用程序也支持多線程,但是,你必須只能在一個線程中調用Pro/Toolkit函數,否則會導致程序出錯。
在同步模式下的Dll模式中,若要使用多線程,請在user_initialize()函數中調用ProEngineerMultithreadModeEnable()函數,該函數會通知ProE以使其運行在支持多線程的模式下。但運行在該模式下的程序其性能會降低,所以,當確實要在Pro/Toolkit程序中使用多線程時,才調用此函數。
八、Pro/Toolkit與ProE的版本兼容性
在很多情況下,你沒法保證你的Pro/Toolkit程序的使用者使用的ProE和你編譯和鏈接Pro/Toolkit程式時使用的ProE是一個版本的。ProE與Pro/Toolkit混合使用時,其兼容性的規則如下:(Release版本即正式版本指ProE升級產品的版本號,如Wildfire3.0,Wildfire4.0。Bulid版本即創建版本,指同一正式版本下不同日期的升級版,如F000,M230。)
1、ProE Release版本比Pro/Toolkit Release版本舊。
這種情況下不支持。
2、ProE Release版本比Pro/Toolkit Release版本新。
這在多數情況下可以正常工作,但不是全部。Pro/Toolkit與ProE的通信方式在所有Release版本之間都完全兼容。然而,個別情況下對ProE內核的修改,可能需要改變Pro/Toolkit應用程序的源碼,以使程序正常工作。是否需要修改取決於你的Pro/Toolkit程序中使用了什么功能以及該功能是否在ProE和Pro/Toolkit中有所改變。PTC會盡量使可能產生的影響降至最小。Pro/Toolkit的正式版本信息已詳細說明了對於哪個版本所有可能需要的轉變工作。
3、Release版本相同,ProE Build版本比Pro/Toolkit Build版本舊。
在Pro/Toolkit Release 20和Pro/Toolkit Release 2000i中,這不支持。從Release 2000i2開始,就基本可以了,除非你的Pro/Toolkit程序調用了新Build版本中新增或修改了的Pro/Toolkit函數。從Release 2000i2開始,PTC公司會避免修改之前的Pro/Toolkit函數的定義並盡量使新增的函數數量最小。
4、Release版本相同,ProE Build版本比Pro/Toolkit Build版本新。
總是支持的。
九、Pro/Toolkit與ProE的跨平台性
在有些情況下,你沒法保證運行你Pro/Toolkit應用程序的計算機和你創建Pro/Toolkit程序使用的計算機,擁有相同的操作系統和系統架構。一個可能的情況是:你的Pro/Toolkit程序中使用了第三方的庫,而該庫只能在32位計算機系統上使用,但你的Pro/Toolkit程序卻必須運行在擁有相同操作系統的64位計算機上。Pro/Toolkit對運行在這種情況下的異步以及多進程模式程序,提供有限的兼容性。對於Dll模式下的Pro/Toolkit應用程序而言,必須總是要確保創建該應用程序所使用的計算機和運行該程序所使用的計算機,擁有相同的操作系統和系統架構。
其兼容性的規則如下:
1、創建Pro/Toolkit應用程序的計算機和最終運行Pro/Toolkit應用程序的計算機,擁有相同的操作系統和系統架構。
這種情況總是支持的。
2、創建Pro/Toolkit應用程序的計算機比最終運行Pro/Toolkit應用程序的計算機的數據位數小。例如,在Windows 32位系統上創建的Pro/Toolkit程序需要運行在Windows 64位的ProE上。
這種情況下僅僅支持異步模式與多進程模式。
3、創建Pro/Toolkit應用程序的計算機比最終運行Pro/Toolkit應用程序的計算機的數據位數大。例如,在Windows 64位系統上創建的Pro/Toolkit程序需要運行在Windows 32系統的ProE上。
不支持這種情況。