Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 00:37

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: COM Anbindung
BeitragVerfasst: Di Apr 11, 2006 20:38 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Hi,

hat jemand von euch Erfahrung mit COM+ Programmierung unter Delphi32?
Ich muss eine laufende und beständige Instanz von einem COM-Objekt (bzw dessen Interface) erzeugen.
Wäre für ein sehr einfaches Beispiel mit z.B Excel oder Word in dieser Richtung dankbar.

Einer späteren Umsetzung in eine DLL zur Benutzung in anderen Sprachen (speziell C++) steht dadurch nichts im wege oder?

gruß

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 12, 2006 09:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Aus C++ kannst du auch Problemlos auf COM zugreifen. Du müsstest das nicht extra erst kappseln. Aber eigentlich sollte es gehen. So tief habe ich da aber bisher nie drinne gesteckt.

Um auf COM zuzugreifen hast du 2 Möglichkeiten. Und das war es das mit einfach schon wieder...

1. In Delphi ab 6 oder 7 gibt es einen Reiter "Server". Darauf hast du ein paar Server mit denen du arbeiten kannst. Die Ziehst du auf deine Formular und im Code verbindest du dich mit ihnen. Der Vorteil bei dieser Methode ist der, dass du alle Methoden siehst. Der Nachteil ist aber, dass du leider alle Parameter auch angeben musst. Das kann einem schon ziemlich viele Nerven kosten. Aber zum nachschlagen was es alles wie wo an Methoden und Propertys gibt ist es Goldwert.

Im übrigen habe ich bis heute nicht gefinden wie ich so in Excel den Inhalt einer Zelle setzen kann.
Code:
  1.   ExcelApplication1.ConnectKind := ckRunningOrNew;
  2.   ExcelApplication1.Connect;
  3.   ExcelApplication1.Application.Workbooks.Add (null, 0);
  4. //  ExcelApplication1.Application.Cells[1, 1].Value := 'Blah'; // Keine Ahnung wies geht
  5.   ExcelApplication1.Application.Show;
  6.   ExcelApplication1.Application.Quit;
  7.  


2. Die andere Methode geht über Varianten. Dabei hast du unter anderem den Vorteil nicht alle Parameter angeben zu müssen. Aber den Nachteil, dass das was du schreibst erst zur Laufzeit ausgewertet wird.

Code:
  1. var
  2.   Excel: Variant;
  3. begin
  4.   Excel := CreateOleObject('Excel.Application');
  5.   Excel.Workbooks.Add;
  6.   Excel.Cells[1, 1].Value := 'Blah';
  7.   Excel.Visible := True;
  8.   Excel.Quit;


Das ist beides zwar vermeindlich das selbe. Nur mit dem Unterschied, dass laut Variante 1 die Property Visible ReadOnly ist und Laut Variante 2 die Methdode Show nicht unterstützt wird. Also obwohl dabei beide male ein und das selbe Objekt benutzt werden kommen 2 völlig unterschiedliche Codes zu tage. Ich muss nicht erwähnen, dass Cells[1, 1] im obrigen Beispiel alleine schon vom Compiler angemault werden.

Für Office würde ich dir verschlagen, dass du es mit Variants machst und in den oberen Objekten immer mal wieder nachschaust. Achja. Du wirst mehr rumprobieren was mit welchen Parametern aufgerufen werden muss als das du tatsächlich programmierst. Abgesehen davon ist Namensgebung nicht immer die Beste. Aber das wirst du ja selber noch feststellen. :twisted:

DX ist auch nur COM und da kann man auch sinnvoll mit den Objekten arbeiten. Keine Ahnung warum das bei Office so äußerst seltsam ist. Office ist da bei weitem nicht so der ausschlaggebende Faktor.

Achja. Bevor ich das vergesse. Der Name "Excel.Application" ist wie du merkst ohne Versionsangabe. Ich weiß jetzt nicht genau wie das gehandhabt wird. Also ob er immer die neuste Version nimmt oder das eine einheitliche Schnittstelle ist. Normal dürfen sich einmal veröffentliche Schnittstelle (Verbunden mit der GUID) nicht mehr ändern. In diesem Falle hat man aber einen Namen. Allerdings macht es kaum Sinn zu sagen ich unterstütze nur Version 9.

PS: Hoffe es war nicht zu verwirrend. Mein Kaffee wirkt noch nicht so richtig. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 12, 2006 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei den Variants bekommt man nicht direkt das Interface sondern nur eine Instanz von IDispatch mit dessen Methoden (Invoke,...) die Delphi-Variant Typen dann die Aufrufe durchführen. Man kann eine Methode per Name direkt als Strings oder Nummer aufrufen. So funktioniert das auch in VBA und im alten VB. Mit Delphi kann man über das Schlüsselwort dispinterface auch selber ohne großen Aufwand eine IDispatch Schnittstelle definieren.

Code:
  1.   IDispatch = interface(IUnknown)
  2.     ['{00020400-0000-0000-C000-000000000046}']
  3.     function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
  4.     function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
  5.     function GetIDsOfNames(const IID: TGUID; Names: Pointer;
  6.       NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
  7.     function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  8.       Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
  9.   end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 12, 2006 21:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Danke, das mit den Variants hat mir super geholfen (benutze "nur" delphi 7 home dafür, von daher keine klassen dafür).
war nur etwas arbeit bis ich rausgefunden hatte, in welcher unit die routine steht ^^

in der delphi 7 hilfe hab ichs (auf anhieb) net gefunden, von daher für die dies nicht wissen und dies auch interessiert: es steht in ComObj.

werde mich dann mal in die schlacht begeben*gg*

edit:
und gleich das nächste problem ^^
wie genau benutzt man die Methode DispatchInvoke? (ich hoffe das is dann vorerst erstmal die letzte frage, getprop funktioniert schonmal)

gruß

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]