我需要將Delphi中製作的DLL中的對象返回到Delphi中製作的應用程序中。目標是做一個可以在未來修改主應用程序的子系統。所以,我想象開發一個DLL中的子系統是個好主意......我在Windows XP,Delphi 7中進行編程。我確實讀過DLL只返回基本數據類型,但必須有一種方法可以做那...如何將對象傳遞給DLL或從中傳回對象?
此致敬禮。
我需要將Delphi中製作的DLL中的對象返回到Delphi中製作的應用程序中。目標是做一個可以在未來修改主應用程序的子系統。所以,我想象開發一個DLL中的子系統是個好主意......我在Windows XP,Delphi 7中進行編程。我確實讀過DLL只返回基本數據類型,但必須有一種方法可以做那...如何將對象傳遞給DLL或從中傳回對象?
此致敬禮。
我更喜歡將COM應用於這樣的模型,該模型允許您創建外部「對象」,然後您可以從應用程序中直接引用該對象。在Delphi中創建COM對象非常簡單,使用ActiveX創建方法創建一個ActiveX庫,然後創建COM對象。然後,在主應用程序中使用接口單元,並且在CoCreate對象實例時加載相應的DLL。這個唯一棘手的部分是你的com對象必須在系統上註冊才能正常運行......在Win7/Vista環境中需要高級訪問...儘管這樣做完成後,它就是無縫的。
BEST方法是使用skamradt建議的COM包裝器。
這是可能的,但not a good idea傳遞對象引用作爲DLL的指針。特別提到彼得哈斯的評論。
如果你通過從德爾福DLL的目的是Delphi應用程序,你將有以下的問題:
您必須使用Delphi的相同版本的應用程序和DLL。
應用程序和DLL都必須具有相同的對象實現 - 或者至少具有類中所有字段的相同佈局 - 確定是否使用標準對象,如TStringList。
你應該使用共享內存或運行時軟件包,否則你會得到奇怪的訪問衝突。
我不得不在維護代碼的地方完成這個任務 - 這很噩夢,因爲如果沒有很多重新編譯的話就無法更改類。
您可以使用接口和大部分問題,編譯器/ RTL版本甚至其他語言都會消失。 德爾福的接口始終與IUnknown兼容,這使它們與Windows上支持OO的大多數語言兼容。
有一點要記住,不過:不要使用AnyString,堅持WideString,這是COM使用的Stringtype。
獨立於平臺和語言的方式可能是交換序列化對象。
它具有性能影響,但它也有優勢:DLL不需要修改其他語言和平臺,如.Net或Java(通過JNA Java Native Access)),它不依賴操作系統的任何特殊功能,因此它可以也可以在Linux或MacOS的使用,如果你Free Pascal編譯庫。
對於序列化,你可以使用JSON或XML。有開放源碼庫德爾福,例如SuperObject和OmniXML。
如何使用delphi將序列化對象從/傳遞到application/dll。你有沒有關於它的例子(用SuperObject)? – Martin 2012-12-20 09:04:28
這有已經在StackOverflow上討論了幾次*。搜索標有[delphi]和[dll]或[bpl]的問題。可以說沒什麼新鮮的話題可以說... – mghie 2009-11-04 21:09:30
哦!偉大的答案男人!以及如何在數百個答案中找到一個良好的答覆? – DelphiProgrammer 2009-11-04 22:17:12
看看http://stackoverflow.com/questions/1596704/how-to-return-an-instance-from-a-dll – 2009-11-04 22:50:07