2011-03-14 59 views
0

我正在研究這個項目,我們沒有大型項目的源代碼,但我們有.DLL文件和一些信息。 DLL文件中存在一個錯誤。我能夠創建一個類的子類,並在其中存在缺陷,我想倒下已經存在於我有權訪問它的點上的對象。問題是,在任何時候我都可以訪問這個對象,它被轉換爲Variant類型。我試過以下(編輯刪除上下文):將OleVariant轉換爲Delphi中的對象

tempSubclass := Subclass(ParentClass(Integer(oleVariantCast))); 

,但我得到了以下錯誤:

Could not convert variant of type (Dispatch) into type (Integer) 

是否有任何其他方式得到的指針對象了OleVariant的和/或做類型轉換?

謝謝。

編輯:是的,父類實現IDispatch。 更正:父類實現從IDispatch繼承的接口。

+1

是你的代碼與dll中的代碼一樣使用相同版本的delphi編譯? –

+0

據我所知,全部都在Delphi 6中。 – mnuzzo

+0

你要確定是否試圖跨模塊邊界消耗對象。一旦你提取了這個對象引用,我仍然不能完全遵循你正在嘗試做的事情。 –

回答

1

嘗試類型轉換爲IUnknown的第一。

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast)))); 
+0

這只是尖叫「它編譯,但它真的工作」在我身上。 –

+0

@Warren P我試圖在這裏描述如何從OleVariant通過IUnknown去接口http://stackoverflow.com/questions/4938601/getting-an-istream-from-an-olevariant/4938818#4938818。如果它在這種情況下工作或不,我不知道。 –

1

Dispatch Variant是一個非常通用的接口,而不是一個類(這就是爲什麼它不能被類型化爲Delphi對象 - 它不是一個,也沒有用於該類的VMT試圖把它變成)。

如果DLL包含一個類型庫,可以將其導入到Delphi中,然後直接使用它包含的接口,而不先嚐試將它們轉換爲其他任何東西。

如果您有關於DLL中實際接口實現的文檔,您可以編寫一個使用該接口的Delphi類。你可以通過定義來表示接口類型轉換,然後使用as訪問它:

type 
    TYourInterface=interface(IDispatch) 
    // the interface definition here 
    end; 

var 
    Intf: TYourInterface; 
begin 
    Intf := YuorOleVariant as TYourInterface; 
    // work with interface from DLL using Intf. 
    Intf := nil; 
end; 
+0

我試過你似乎在暗示的是:「tempSubclass:= oleVariantCast as Subclass」,它給出了一個錯誤,說「操作符不適用於這個操作數類型」。 – mnuzzo

+0

我誤解了你在說什麼,但是當我用接口嘗試時遇到同樣的錯誤。 – mnuzzo