2009-10-13 30 views
3

我正在使用Windows XP/Delphi 7.我需要在正在運行的程序中添加一些程序(或函數),並且在完成後我不想再次重新編譯它。如何在運行時程序(Delphi/Windows)中添加代碼?

我只有一個具有5個函數的主機應用程序來發送不同類型的警報,但也有其他新的警報類型,所以我必須做新的函數來發送這些警報,但我不應該重新構建主機應用程序。我有一個名爲TAlarmManager的類,調用它來調用這些函數。

也許是一個插件?好的,但我怎樣才能「插入」新功能?教程,手冊,書籍等,瞭解這一點,或者有關如何做到這一點的任何建議?

我學習過插件(我對這個主題完全陌生),但沒有人會談到將函數添加到主機應用程序。在我看來,插件添加了自身的功能,我的意思是,它們是用自編碼開發來做的,而不是將代碼「添加」到主機應用程序中......我該怎麼做?

回答

4

技術方面:Delphi IDE如何做到這一點?那將是我首先看的地方。

要理解插件,您必須瞭解您無法添加新功能。你可以但是因爲舊的代碼不知道如何調用它,它們不會被調用。

所以你要做的是爲你的插件添加一個「註冊」或「啓動」功能。該啓動函數獲取一個數據結構作爲它可以檢查或擴展的參數。在你的情況下,這將是警報列表。警報總是工作相同(我的猜測),所以它可以添加額外的警報。

然後,主代碼將在註冊所有插件後,遍歷報警列表並調用每個報警的標準報警功能。它不再關心每個警報的來源以及它的真實含義。

關鍵在於:您需要定義雙方訂閱的接口。主代碼調用接口函數,您的插件代碼實現它們。

+0

非常感謝我的朋友,非常有用! – Yulien 2009-10-14 13:02:39

3

可用的另一個選項是在項目中使用腳本組件。一個工作得很好的是PascalScript。這將允許您在事實之後加載外部腳本,然後根據需要運行它們以與應用程序交互。正如Aaron所建議的,您還需要爲您的腳本提供某種接口來與應用程序進行交互。

0

我不太清楚「警報」是什麼意思,所以我做了一些假設。

1)如果你不需要額外的警報代碼,我會盡量讓它們數據驅動。將不同類型的警報保存在數據庫或配置文件中,這樣可以輕鬆更新現場的應用程序而無需重新編譯或重新安裝。 2)如果你需要每個鬧鐘的特殊代碼,你可以使用運行時包作爲應用程序的插件。搜索Delphi運行時軟件包以獲取一些想法和教程。這裏有幾個鏈接,我發現:

http://delphi.wikia.com/wiki/Creating_Packages

http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm

3)腳本,如skamradt已經提到。如果它對您的應用程序有意義,這也可以讓您的客戶編寫自己的附加功能,而無需您重新編譯。

0

你幾乎肯定想使用Pascalscript,正如skamradt所暗示的那樣。你應該從這裏開始,並認真考慮這個選項。能夠將實時代碼作爲文本進行序列化有很多可能性。唯一的缺點是執行速度可能很快,但這對您的應用程序域可能無關緊要。我會有upvoted skamradt,但我沒有足夠的聲望upvote :)

0

前段時間我正在尋找一種類似於你所描述的情況。

我的答案是.DLLs。我將變量代碼放入一個動態加載的.DLL中,該名稱在配置文件中指定。我通過了一個記錄,包含了我所知道的有關情況的一切。

在我的情況下,只有成功/失敗的回報,沒有屏幕輸出,這工作得很好。 (這是指揮一部機器。)

0

這聽起來像一個腳本語言或「域特定語言」可能有意義的地方。有幾種方法來這樣:

  • 實現在VBScript是通過COM API訪問你的Delphi代碼報警功能(寫在記事本.vbs文件)。使用COM API可以訪問大量用於編寫函數的編程工具,包括Delphi。這是最笨拙的解決方案,但最容易做到。這對您的銷售過程也可能是有益的,想想如何銷售東西總是很好的。

  • 在Delphi中實現您自己的函數語言。通過這種方式,您可以輕鬆實現,讓您的最終用戶可以編寫自己的報警功能。如果您將其作爲表達式求值程序來執行,則可以將警報寫爲2 * T1> T2。有幾個表達評估者,如果他們不符合你的需求,你也可以自己寫。

  • 使用預定義的編程語言,你的Delphi應用程序中,例如,「Pascal腳本」,看到http://www.remobjects.com/ps.aspx

0

你應該PaxCompiler看一看,像PascalScript它允許加載腳本,但你甚至可以預先編譯它們以獲得更多性能。查看演示部分了解您的問題。

作爲一個方面說明,網頁看起來確實很糟糕,但是這個包真的很強大和穩定。

相關問題