2010-04-23 63 views
2

首先,我在Delphi和COM中很新,但我應該在Delphi中構建COM應用程序。我在互聯網上閱讀了很多文章和筆記,但Delphi的COM和COM仍然不清楚。訪問衝突在Delphi中的GetInterface/QueryInterface之後

我的消息來源 - http://www.everfall.com/paste/id.php?wisdn8hyhzkt(約80行)。

我試着做一個COM接口和Impl類 - 它工作,如果我從Delphi調用接口方法(我通過TestClient.Create創建一個impl對象),但如果我嘗試從外部世界(從Java中,通過com4j)我的應用程序崩潰與以下情況除外:

Project Kernel.exe raised exception class $C0000005 with 
message 'access violation at 0x00000002: read of address 0x00000002'. 

如果我設置的QueryInterface斷點 - 它打破了,但是當我從功能出來 - 所有崩潰。

我在做什麼錯了?我還缺少什麼?我可以/應該閱讀關於COM(在Delphi中)以避免這種愚蠢的問題?

+0

如果我取消註釋的QueryInterface代碼 - 沒有訪問衝突,但com4j說,不支持的接口。 – W55tKQbuRu28Q4xv 2010-04-23 11:44:04

+0

你能給我們一個Java端的代碼清單嗎? – 2010-04-23 14:52:23

+0

對不起,現在不行。我在家裏沒有項目。 它大多由com2j自動生成,僅由CoCreateInstance(CLSID)組成。 – W55tKQbuRu28Q4xv 2010-04-23 15:24:11

回答

0

我做了一個DLL與從頭COM和

  1. 我用的DllRegisterServer - 它給了我一個可能性,以控制服務器註冊(在 TComObjectFactory.RegisterClassObject在我第一次嘗試)
  2. 我從刪除的QueryInterface我TestComImpl
  3. Com4j僅支持STA(公寓)線程模型(我假設RegisterClassObject使用 MTA)
  4. 所以,如果註冊爲公寓(STA)類或兩者 - com4j可以創建實例。

謝謝大家的幫助!

0

如果崩潰是的QueryInterface返回後發生的事情,我會做的就是把一個斷點在Java應用程序時,它調用QueryInterface,看看它試圖下一步該怎麼做。這會讓你知道去哪裏看。

您的評論似乎承認這一點。它調用QueryInterface,返回一個結果,說這個接口是好的,並試圖用它來立即中斷。但是,如果將註釋告訴它接口良好的代碼註釋掉,它最終不會嘗試使用該接口,並且沒有任何中斷。

如果你不熟悉德爾福,訪問衝突通常意味着一個空指針引用。在這裏,它表示你的指令指針位於內存地址0x000002。這可能意味着你以某種方式嘗試對尚未構建的對象調用虛擬方法(或接口方法)。

希望有幫助!

+0

感謝您的回覆,我會嘗試跟蹤'java'端,但地址0x02看起來像GetInterface損壞堆棧,但我認爲這是不可能的。 – W55tKQbuRu28Q4xv 2010-04-23 13:35:35

2

沒有必要實施IUnkown.QueryInterface你的自我。從TestComImpl中移除該方法並讓TComObject處理它。另外一定要給ITestCom接口一個GUID。

+0

如果我刪除IUnknown.QueryInterface - com4j說不支持接口(ITestCom)。 – W55tKQbuRu28Q4xv 2010-04-23 13:34:15

+0

如果是這樣的話,你的對象是從哪裏下來的? – 2010-04-24 01:18:46

+0

您確定該接口具有這樣的IID(GUID): ITestCom = interface(IUnknown) ['{0D57624C-CDDE-458B-A36C-436AE465B477}'] procdure YourMethods; 結束; – 2010-04-24 08:40:28