/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
No such interface supported?
Fra : adam


Dato : 04-10-01 08:45

Hej

Jeg har lavet et COM object i Delphi som virker fint når jeg tester det
under VB, men når jeg prøver at teste det inde fra en delphi application
får jeg fejlen "No such interface supported", hvad gør jeg galt?

************************************
unit Test;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, StdCtrls, ComObj;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var a: olevariant;
begin
a := CreateOLEObject('EtServices.Services'); <<--- Her kommer
fejlen.
showmessage (a.getname);}
a := Unassigned;
end;

end.

******************************************
Håber i har et svar til mig.

Mvh Adam


--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


 
 
Thomas Rose (04-10-2001)
Kommentar
Fra : Thomas Rose


Dato : 04-10-01 10:36

Hej Adam,

"adam" <adam.news@kandu.dk> wrote in message
news:nnUu7.1467$uQ.214283@news010.worldonline.dk...
> Jeg har lavet et COM object i Delphi som virker fint når jeg tester det
> under VB, men når jeg prøver at teste det inde fra en delphi application
> får jeg fejlen "No such interface supported", hvad gør jeg galt?

Mit første bud ville være, at du ikke har registreret .dll'en... men hvis du
kan teste det fra VB, men ikke fra Delphi, kunne det tyde på at du _har_
registeret komponenten... så jeg ledes derfor til at spørge:

Hvad er det for en type komponent du har udviklet? Et der et desideret
COM-objekt, Automation, eller hvad (der er forskel på COM og Automation)?

Hvis du har lavet et COM-objekt, kan objektet ikke benyttes fra script-sprog
(f.eks. ASP og VBScript), og generelt set understøtter objektet ikke "late
binding", som er netop hvad du forsøger i din Delphi test... derimod burde
du kunne importere .dll'en og få en Delphi type-library source fil for den
pågældende dll. Type librariet giver en definition af de interfaces, der
findes i dll'en...

Her er et eksempel på "early binding", der anvender et "tænkt" type-library
for din dll:

uses
EtServices_TLB;

var
Serv : IServices; // Skulle svare til din EtServices.Services prog-id
begin
Serv := CoServices.Create; // Opret et objekt der understøtter IServices
interfacet

ShowMessage(Serv.GetName);

Hvis du ikke kan undvære "late binding", eller skal objektet anvendes i
script-sprog, bliver du nødt til at skrive din komponent om, og ændre typen
til et Automation objekt...

Cheers,
Thomas



adam (04-10-2001)
Kommentar
Fra : adam


Dato : 04-10-01 11:11

Tak Thomas

Jeg skal lave et ganske almindelig COM object, som skal kunne kaldes fra
alle COM kompatible programmeringssprog.
Jeg lavede et nyt projekt "Activex Library", hvorefter jeg inkluderede
et "COM object" til mit projekt. Så lavede jeg ganske simpelt en
funktion via type library, og derefter registrerede jeg mit Activex
Server via menuen "Run".

Er der andre måder at gøre dette på? Jeg har lavet mange COM objekter i
VB og C++, nu skal jeg prøve i Delphi, men uden held.

Hvad gør jeg galt?

Adam

"Thomas Rose" skrev d. 04-10-01 10:36 dette indlæg :
> Hej Adam,
>
> "adam" <adam.news@kandu.dk> wrote in message
> news:nnUu7.1467$uQ.214283@news010.worldonline.dk...
> > Jeg har lavet et COM object i Delphi som virker fint når jeg tester
det
> > under VB, men når jeg prøver at teste det inde fra en delphi
application
> > får jeg fejlen "No such interface supported", hvad gør jeg galt?
>
> Mit første bud ville være, at du ikke har registreret .dll'en... men
hvis du
> kan teste det fra VB, men ikke fra Delphi, kunne det tyde på at du
_har_
> registeret komponenten... så jeg ledes derfor til at spørge:
>
> Hvad er det for en type komponent du har udviklet? Et der et desideret
> COM-objekt, Automation, eller hvad (der er forskel på COM og
Automation)?
>
> Hvis du har lavet et COM-objekt, kan objektet ikke benyttes fra
script-sprog
> (f.eks. ASP og VBScript), og generelt set understøtter objektet ikke
"late
> binding", som er netop hvad du forsøger i din Delphi test... derimod
burde
> du kunne importere .dll'en og få en Delphi type-library source fil for
den
> pågældende dll. Type librariet giver en definition af de interfaces,
der
> findes i dll'en...
>
> Her er et eksempel på "early binding", der anvender et "tænkt"
type-library
> for din dll:
>
> uses
> EtServices_TLB;
>
> var
> Serv : IServices; // Skulle svare til din EtServices.Services
prog-id
> begin
> Serv := CoServices.Create; // Opret et objekt der understøtter
IServices
> interfacet
>
> ShowMessage(Serv.GetName);
>
> Hvis du ikke kan undvære "late binding", eller skal objektet anvendes
i
> script-sprog, bliver du nødt til at skrive din komponent om, og ændre
typen
> til et Automation objekt...
>
> Cheers,
> Thomas
>
>

--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"


Thomas Rose (04-10-2001)
Kommentar
Fra : Thomas Rose


Dato : 04-10-01 11:54

Hej Adam,

"adam" <adam.news@kandu.dk> wrote in message
news:iwWu7.1496$uQ.220601@news010.worldonline.dk...
> Jeg skal lave et ganske almindelig COM object, som skal kunne kaldes fra
> alle COM kompatible programmeringssprog.
> Jeg lavede et nyt projekt "Activex Library", hvorefter jeg inkluderede
> et "COM object" til mit projekt. Så lavede jeg ganske simpelt en
> funktion via type library, og derefter registrerede jeg mit Activex
> Server via menuen "Run".

Dette er måden at gøre det på... man behøver ikke registrere komponenten fra
Delphi, men det er oftest det nemmeste.

> Er der andre måder at gøre dette på? Jeg har lavet mange COM objekter i
> VB og C++, nu skal jeg prøve i Delphi, men uden held.

Hvad er det, du vil gøre "på en anden måde"? Mener du at udvikle komponenter
i Delphi, eller teste vha. Delphi? Dit problem fra forrige post er din test
af komponenten, hvor du forsøger med late binding (dvs. tildele resultatet
af CreateOLEObject til en variant)... du skal derimod inkludere din xxx_TLB
i din "uses"-sætning (eller importere din dll, hvorefter Delphi laver et
type-library til dig)... herved får du adgang til de interfaces der ligger i
det pågældende type-library... har du f.eks. et interface kaldt IService,
kan du bruge følgende:

var
Service : IService;
begin
Service := CoService.Create;

denne CoXXX.Create er en slags constructor for din co-klasse, som automatisk
tilføjes i type-library'et af Delphi... tag et kig sidst i _TLB-filen.

Cheers,
Thomas



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste