Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi OleVariant Aufruf (https://www.delphipraxis.net/123606-olevariant-aufruf.html)

gibb 5. Nov 2008 10:43


OleVariant Aufruf
 
Hallo zusammen ...

Ich ruffe über ein OleVariant objekt eine Funktion auf dieser führt dazu das die Applikation gestartet wird nach dem aufruf gebe ich die OleVariant Variable mit frei. Das geht auch noch ohne Probleme. Also der Code Funktioniert soweit einwandfrei. Jetzt ist die Frage... was für einen Grund gibt es das die von mir Gestartete Applikation abstürzt sobald ich diese mit der Maus beende? Wenn ich die Applikation normal (übers startmenu) starte und wieder mit dem Schliessen Button (Oben rechts kreuz) beende Passiert das nicht. Das Passiert nur wenn ich diese mit dem OleObject Starte.

Abstürzen bedeutet: Es kommt nach dem schliessen der Applikation die Fehlermeldung vom System das eine anwendung nicht beendet werden konnte und ob ich diese sofort beenden möchte. Das klingt für mich fast so das aus irgend einem Grund da noch was drannhängt.

Variable:

Delphi-Quellcode:
Var
  eFilm: OleVariant;
Objekt erstellen:
Delphi-Quellcode:
 eFilm:= CreateOleObject('EFilm.Document')
;

Aufruf:
Delphi-Quellcode:
      //Ausführen des Aufrufes
      if eFilm.oleOpenStudy3(Patientnr, AccessionNr, StudyInstanceUID, CloseCurWindow,
        AddToWindow, SeriesRows, SeriesCols, ImageRows, ImageCols, AutoSeriesFormat,
        AutoImageFormat, ImageSource)
Freigabe:
Delphi-Quellcode:
     eFilm:= unassigned;
Mehr mache ich it dem Objekt nicht. Das ist alles, gebe ich das Objekt falsch frei ?

Freundliche Grüsse

gibb

gibb 5. Nov 2008 10:59

Re: OleVariant Aufruf
 
Ich hätte noch ne weitere Frage, falls niemand etwas dazu weiss...

Ich habe ne tlb datei die kann ich ja irgendwie einbinden und mir ein efilm_TLB.pas generieren damit ers dann die Funktionen kennt. Kann mir jemand verraten WIE ich diese efilm_TLB.pas generieren kann ? ich versuch das auch schon seit längerer Zeit weil ich gehofft hatte das es dann funktioniert.

Grüsse

gibb

toms 5. Nov 2008 11:15

Re: OleVariant Aufruf
 
Hallo

Hier gibt es einen ähnlichen Beitrag.
Vielleicht findest du dort eine Antwort.

gibb 5. Nov 2008 11:51

Re: OleVariant Aufruf
 
Den beitrag hab ich bereits selber Gefunden und den Ersteller angeschrieben ;)

Leider nein der hilft mir nicht weiter... wobei ich nun versuchsweise die TLB am einbinden bin...

Meine zweite Frage wurde beantwortet... Meine zweite blieb jedoch offen.

Dank dir

Lg Gibb

sirius 5. Nov 2008 12:22

Re: OleVariant Aufruf
 
Zitat:

Meine zweite Frage wurde beantwortet... Meine zweite blieb jedoch offen.
:gruebel:

Die TLB kannst du auf verschiedene Art und Weise nutzen. Bisher benutzt du Late-Binding. Da du jetzt die Interfaces kennst, kannst du EarlyBinding nutzen. Also du initialisierst nicht mehr in eine OleVariant, sondern gleich in das richtige Interface (was in der TLB definiert ist) . Dadurch wird dein Programm etwas schneller.

Wie geht, dass? Nun du hast mehrere Möglichkeiten:
  1. Du nimmst eben statt OleVariant das entsprechende Interface
  2. 1 + Du benutzt zum initialisieren die CoClass (ich kenne deine tlb nicht, deswegen kann ich dir auch nicht mehr sagen)
  3. Du benutzt die erstellte Klasse und interessierst dich nicht mehr für Interfaces.


Edit: Achso und zur eigentlichen Frage...
Du musst bestimmt noch eine Art close aufrufen bevor du das OleVariant wegschmeisst (musst du aber auch bei den anderen Varianten)

gibb 5. Nov 2008 12:50

Re: OleVariant Aufruf
 
[quote="sirius"]
Zitat:

Meine zweite Frage wurde beantwortet... Meine ERSTE blieb jedoch offen.
Tschuldige hab mich verschrieben ;)
[quote="sirius"]
Zitat:

:gruebel:

Die TLB kannst du auf verschiedene Art und Weise nutzen. Bisher benutzt du Late-Binding. Da du jetzt die Interfaces kennst, kannst du EarlyBinding nutzen. Also du initialisierst nicht mehr in eine OleVariant, sondern gleich in das richtige Interface (was in der TLB definiert ist) . Dadurch wird dein Programm etwas schneller.
Ja und dann hab ich genau das Problem das es dann nicht auf einem anderen System wo auch EFilm installiert funktioniert bis ich die tlb registriert habe oder ich mache das Später und dann muss ich die TLB mit deployen. Also werd ich wohl jetzt so programmieren und olevariant zum schluss nehmen wenns funktioniert.
[quote="sirius"]
Zitat:

Wie geht, dass? Nun du hast mehrere Möglichkeiten:
  1. Du nimmst eben statt OleVariant das entsprechende Interface
  2. 1 + Du benutzt zum initialisieren die CoClass (ich kenne deine tlb nicht, deswegen kann ich dir auch nicht mehr sagen)
  3. Du benutzt die erstellte Klasse und interessierst dich nicht mehr für Interfaces.

Hab ich geschafft.
[quote="sirius"]
Zitat:

Edit: Achso und zur eigentlichen Frage...
Du musst bestimmt noch eine Art close aufrufen bevor du das OleVariant wegschmeisst (musst du aber auch bei den anderen Varianten)
Ich hab nen connect und disconnect aber da krieg ich gesagt das hätt ich net zu gebrauchen... in der SDK fangen alle dokumentierten Funktionen mit Ole an. Und da find ich iirgendwie nichts passende...

Freundliche Grüsse

gibb

sirius 5. Nov 2008 13:03

Re: OleVariant Aufruf
 
Zitat:

Zitat von gibb
Ja und dann hab ich genau das Problem das es dann nicht auf einem anderen System wo auch EFilm installiert funktioniert bis ich die tlb registriert habe oder ich mache das Später und dann muss ich die TLB mit deployen. Also werd ich wohl jetzt so programmieren und olevariant zum schluss nehmen wenns funktioniert.

Diese Aussage stimmt nicht. Die TLB wird mit zum compilieren genutzt. Das kommt in die Exe mit rein. Und die wird im Fall der einfachen Nutzung des Interfaces sogar kleiner (late vs. early binding).
Die COM-Bibliothek musst du immer mit ausliefern und installieren+registrieren.

Ich würde sagen du brauchst eine Doku zu der Klasse.

gibb 5. Nov 2008 16:21

Re: OleVariant Aufruf
 
Zitat:

Zitat von gibb
Ja und dann hab ich genau das Problem das es dann nicht auf einem anderen System wo auch EFilm installiert funktioniert bis ich die tlb registriert habe oder ich mache das Später und dann muss ich die TLB mit deployen. Also werd ich wohl jetzt so programmieren und olevariant zum schluss nehmen wenns funktioniert.

Zitat:

Zitat von sirius
Diese Aussage stimmt nicht. Die TLB wird mit zum compilieren genutzt. Das kommt in die Exe mit rein. Und die wird im Fall der einfachen Nutzung des Interfaces sogar kleiner (late vs. early binding).

Dachte ich bisher auch immer. Stimmt so leider nicht, genau wie mein freund hier auch bemerkt haben muss:
http://www.delphipraxis.net/internal...ct.php?t=76716 (wollen scheinbar beide in etwa dasselbe)

Ich habe sogar das ganze umgeschrieben das ich die TLB nicht mehr in mein projekt einbinden muss (ich benötige lediglich eine Funktion) und gleichzeitig immernoch wie(Aber nicht mit) mit der TLB arbeite (Vorteil... so funktioniert das beenden) Nachteil: es geht auf dem 2 ten system einfach nicht. Ohne TLB registration tut sich da kein Wank... ich kriege dann immer interface is not supported.
Zitat:

Zitat von sirius
Die COM-Bibliothek musst du immer mit ausliefern und installieren+registrieren.

Ich würde sagen du brauchst eine Doku zu der Klasse.

das ist klar, diese wird jedoch mit ner 3t software installiert.

Die Doku hab ich schon x mal von unten nach oben und von oben nach unten durchgelesen. Ich sag nur: ICH DREH HIER DURCH MIT DEM VERDAMMTEN SCHEISS. :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall: das gabtezeuch sollte man -> :firejump: einstampfen

Meta777 12. Nov 2008 18:33

Re: OleVariant Aufruf
 
die efilm.tlb registrieren :-)

EDIT: :oops: Habs topic nur überflogen und eben erst gemerkt das du das schon tust... Werd erstmal lesen...

EDIT2: Habs nun nochmal beide threads gelesen (deinen und meinen) und kann nur sagen das ich das eFilm-OLE-Problem durch registrieren der .tlb-Datei gelöst hatte. Die tlb hab ich über "Typenbibliothek importieren" importiert (Delphi generiert dann ja die Klasse) und auf den Rechnern wird dann mit dieser Procedure die tlb registriert und dann gelöscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz