/ Forside/ Teknologi / Udvikling / Delphi/Pascal / Spørgsmål
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
Vist : 469 gange
200 point
Dato : 04-10-01 09: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


 
 
Kommentar
Fra : Nyhedsbruger


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



Kommentar
Fra : adam


Dato : 04-10-01 12: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
>
>

Kommentar
Fra : Nyhedsbruger


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



Kommentar
Fra : adam


Dato : 04-10-01 23:50

Hej Thomas

Jeg vil meget gerne udvikle mine komponenter i Delphi, men de bliver åbentbart ikke lavet korrekt for jeg kan ikke kalde dem via CreateOLEObject (som du kalder late binding), og det kan jeg sagtens med alle andre COM objecter i systemet, også dem jeg har lavet i C++.
Hvordan laver jeg et "Late binding" COM object?

Mvh Adam

Kommentar
Fra : PARKENSS


Dato : 19-11-01 08:37

Hej
Du kan ikke definere et com object til at skulle være et late binding object, dog skal objectet implementere IDispatch. Det der er afgørende er, hvordan du kontrollerer objejtet på klient-siden. Late binding begrebet eksisterer primært for at primitive programmeringssprog som ikke kender til interfaces (VMT) skal kunne udnytte com teknologien. Du kan dog også lave det fra delphi, selv om det ikke kan anbefales, da denne måde er væsentligt langsommere end erly binding, da man bruger varianter.

IA = interface
procedure B: WideString;
end;

late binding:

var
A: Variant;
begin
A := CreateOleObject('Servernavn.A');
ShowMessage(A.B);
end;

erly binding;

var
A: IA;
begin
A := CoA.Create;
ShowMessage(A.B);
end;

Mvh
Parkenss

Du har følgende muligheder
Dette spørgsmål er blevet annulleret, det er derfor ikke muligt for at tilføje flere kommentarer.
Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407950
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste