Violazione di accesso dopo GetInterface / QueryInterface in Delphi
-
01-10-2019 - |
Domanda
Per prima cosa, io sono molto nuovo in Delphi e COM, ma dovrebbe basarsi applicazione COM in Delphi. Ho letto un sacco di articoli e note sulle internet, ma COM e COM in Delphi sono ancora non chiaro per me.
Le mie fonti - http://www.everfall.com/paste/id. php? wisdn8hyhzkt (circa 80 righe).
Io cerco di fare una classe COM Interfaccia e Impl - funziona se chiamo un metodo di interfaccia da Delphi (creo un oggetto impl via TestClient.Create), ma se cerco di creare un oggetto dal mondo esterno (da Java , via com4j) la mia domanda è schiantato con la seguente eccezione:
Project Kernel.exe raised exception class $C0000005 with
message 'access violation at 0x00000002: read of address 0x00000002'.
Se ho impostato un punto di interruzione in QueryInterface - si rompe, ma quando esco dalla funzione -. Tutti gli arresti
Quello che sto facendo di sbagliato? Quello che mi manca ancora? Cosa posso / devo leggere su COM (in Delphi) per evitare domande stupide come questa?
Soluzione 3
Ho fatto una DLL con COM da zero e
- Io lo uso DllRegisterServer - mi ha dato la possibilità di registrazione server di controllo (oltre TComObjectFactory.RegisterClassObject nel mio primo tentativo)
- tolgo dalla mia QueryInterface TestComImpl
- supporti Com4j solo STA (Appartamento) modello di threading (presumo usi RegisterClassObject MTA)
- Quindi, se di classe registrato come Apartment (STA) o Entrambi -. Com4j possono creare istanze
Grazie a tutti per l'aiuto!
Altri suggerimenti
Non v'è alcuna necessità di attuare IUnkown.QueryInterface la vostra auto. Rimuovere quel metodo da TestComImpl e lasciare TComObject gestirlo. Anche essere sicuri di dare il ITestCom interfaccia di un GUID.
Se l'incidente avviene dopo ritorna QueryInterface, quello che vorrei fare è mettere un punto di interruzione in app Java quando chiama QueryInterface e vedere che cosa cerca di fare il prossimo. Che ti do un'idea di dove andare a cercare.
Il tuo commento sembra confermarlo. Si chiama QueryInterface, tornando un risultato che dice che questa interfaccia è buono, e cercando di usarlo per qualcosa che immediatamente si rompe. Ma se si commento il codice che dice che l'interfaccia è buona, finisce per non cercando di utilizzare l'interfaccia, e si rompe nulla.
Se non hai familiarità con Delphi, una violazione di accesso di solito significa un dereference puntatore nullo. Qui, si dice che il puntatore di istruzioni è in posizione di memoria 0x000002. Questo probabilmente significa che in qualche modo si è tentato di chiamare un metodo virtuale (o un metodo di interfaccia) su un oggetto che non è ancora stato costruito.
Speranza che aiuta!