2012-01-13 63 views
4

接口,當我想要一個DLL導出中的一類,它是從一個接口派生,並通過導出函數返回該接口是正確的做法?是可以安全使用的DLL從

//exported dll function, which is used in the exe. 
function MyClass_Create: IMyClass; 
begin 
    result := TMyClass.Create; 
end; 

什麼是內存管理?我能否通過輸入/輸出不同的接口和字符串而不用擔心和崩潰?

IMyClass = interface 
    procedure SetString(aMsg: string); 
    function GetString: string; 

    procedure SetClass(aClass: ITestClass); 
    function GetClass: ITestClass; 
end; 

回答

3

這樣使用接口將確保實現該接口的對象將被創建並釋放在同一堆中。

不過,這不會解決動態字符串類型的問題進行分配和釋放不同的堆。有很多可能的解決方案,但在我看來,最好的方法是在整個模塊邊界上使用WideString。

的WideString的類型是圍繞COM BSTR的包裝和在共享堆COM被分配。你只需要爲接口使用WideString。實現類的內部可以使用本地的Delphi字符串。

就像字符串存在動態數組的問題一樣。嘗試跨模塊邊界傳遞動態數組並不安全。 WideString沒有類似於方便的解決方案。你可以使用不同的數組,但與WideString相比,它非常笨重。

5

接口引用與內存管理是正交的。通常你會導出一個從dll返回接口引用的函數,而不關心內存管理。通過引用計數接口,您可以確保實現接口的對象實例也將在dll中被釋放。

字符串是不同的。無論您是導出界面還是導出平面函數 - 均適用相同的限制。

BTW你的問題的標題不正確,也有在Delphi中沒有「接口實例」。

+0

使用的接口循環引用時,請注意潛在的內存泄漏的問題(即,實現類是指共享接口) - 在這種情況下,Delphi的缺乏一個垃圾收集器或「歸零弱指針」的特點。請參閱http://blog.synopse.info/post/2011/12/08/Avoiding-Garbage-Collector%3A-Delphi-and-Apple-on-the-same-side – 2012-01-13 09:15:00

+0

循環引用是引用計數的常見問題。骯髒的技巧'指針(IntRef):= nil'可以幫助修改接口引用而不更改引用計數。 – kludg 2012-01-13 10:26:03

相關問題