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?

È stato utile?

Soluzione 3

Ho fatto una DLL con COM da zero e

  1. Io lo uso DllRegisterServer - mi ha dato la possibilità di registrazione server di controllo (oltre TComObjectFactory.RegisterClassObject nel mio primo tentativo)
  2. tolgo dalla mia QueryInterface TestComImpl
  3. supporti Com4j solo STA (Appartamento) modello di threading (presumo usi RegisterClassObject MTA)
  4. 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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top