Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt' (https://www.delphipraxis.net/185291-eoleexception-der-objektverweis-wurde-nicht-auf-eine-objektinstanz-festgelegt.html)

Raketenschnitzel 28. Mai 2015 14:04

EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Hallo DelphiCoder,

ich hab ne DLL von einem Unternehmen, die leider dem Datenschutz unterliegt. Daher kann ich sie leider nicht posten.
Das Ding enthält ein COM Server und ich möchte Funktionen aufrufen.

Mein Problem:
Ich krieg ne Exception und hab nicht die geringste Ahnung, woran es liegt.
Wie debugge ich so ein Projekt? Hab die Quelldateien für die DLL des Unternehmens natürlich nicht da.
Die Exception ist auch merkwürdig, da der Pointer für MyExcelAddin ja existiert.
Hat jemand Ideen was ich machen kann, um weiterzukommen?

Mein Vorgehen:
1) Delphi > Komponenten > Komponente importieren (um mir ne Unit mit den entsprechenden Interfaces zu holen)
2) Objekt bauen und Pointer speichern (funktioniert)
3) Aufruf einiger einfacher Funktionen ohne Parameter mit Rückgabewerten String und PSafeArray (funktioniert)
4) Aufruf einer komplexeren Funktion mit Parametern
=> EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'

Delphi-Quellcode:
MyExcelAddin     := CoExcelAddin.Create; //s. Punkt 2
Memo1.Lines.Add(MyExcelAddin.GetVersionInfo); //s. Punkt 3
Fluidpointer     := MyExcelAddin.GetAllFluids; //s. Punkt 3
if assigned(MyExcelAddin) then begin
    //hier kommt die Exception
    CalculationResult := MyExcelAddin.CalculateBPHE(Name, InData, FluidData, FluidData, 7, False); //s. Exception
end;
Hier noch die InterfaceDefinition, die ich für MyExcelAddin nutze und mittels Komponente importieren (s. Punkt 1) erstellt habe:
Delphi-Quellcode:
ISSPG7ExcelAddin = interface(IDispatch)
    ['{3904440C-92A7-49C8-B983-CD9F11764CDE}']
    function GetAllFluids: PSafeArray; safecall;
    function GetAllBPHE: PSafeArray; safecall;
    function GetAllModelsWithRestrictionSummary: PSafeArray; safecall;
    function CalculateBPHE(const CalculationName: WideString; const strIndata: WideString;
                           const strFluidSide1: WideString; const strFluidside2: WideString;
                           MaxNoResults: Integer; bLocalizationSettings: WordBool): PSafeArray; safecall;
    function CalculateApplication(const CalculationName: WideString;
                                  const strRadiatordata: WideString;
                                  const strTwoStagedata: WideString;
                                  const strFluidSide1: WideString; const strFluidside2: WideString;
                                  const strFluidSide3: WideString; MaxNoResults: Integer;
                                  AutoPerformance: WordBool; bLocalizationSettings: WordBool): PSafeArray; safecall;
    function GetVersionInfo: WideString; safecall;
  end;

TiGü 28. Mai 2015 15:06

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Sind alle Eingangsargumente von CalculateBPHE mit sinnvollen Werten gefüllt?

Raketenschnitzel 28. Mai 2015 15:43

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Die Firma welche die DLL erstellt hat liefert für die beiden Widestrings strIndata und strFluidSide eine Konvention mit.
Bei strIndata handelt es sich um ca 30 Werte die mittels ";" verkettet werden.
Bei strFluidSide sind es 5 Werte die mittels ";" verkettet werden.
--> es ist gut möglich, dass einer der Werte nicht passt

Die Firma liefert auch ein eigenes Programm aus, mit welchem man die Kalkulationen manuell durchführen kann.
Dort hat sich gezeigt, dass man verhätlnissmäßig leicht durch blöde Eingabewerte Fehler provozieren kann.
--> kann schon gut sein, dass bei meinen Eingabewerten der Fehler steckt

Aber die Exception deutet darauf ja eigentlich nicht hin...

himitsu 28. Mai 2015 18:32

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Es kann auch sein, daß intern (noch) irgendwas fehlt, was in der DLL vielleicht noch nicht richtig initialisiert wurde?


PS: Erst zwei mal auf MyExcelAddin zugreifen und erst dann mit
Delphi-Quellcode:
if Assigned(MyExcelAddin) then
prüfen?
Aber vermutlich wirft
Delphi-Quellcode:
CoExcelAddin.Create
eh eine Exception, wenn es nicht ging und dann ist
Delphi-Quellcode:
MyExcelAddin
danach immer Assigned.

Raketenschnitzel 28. Mai 2015 23:37

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Ja, das create läuft durch und wie gesagt die anderen Funktionen laufen auch.
Das auf assigned prüfen hat ich noch reingebastelt, um hier im Forum auch noch mal klarzustellen, dass die Exception merkwürdig ist.
Evtl. fehlt halt intern was oder es wird wegen fehlerhafter Eingabewerte intern was nicht gebaut, was dann fehlt.
Nervt.

himitsu 29. Mai 2015 00:25

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Delphi-Quellcode:
MyExcelAddin := CoExcelAddin.Create; //s. Punkt 2
Memo1.Lines.Add(MyExcelAddin.GetVersionInfo); //s. Punkt 3
Fluidpointer := MyExcelAddin.GetAllFluids; //s. Punkt 3
MyExcelAddin := nil;
CalculationResult := MyExcelAddin.CalculateBPHE(Name, InData, FluidData, FluidData, 7, False); //s. Exception
Wird doch bestimmt eine andere Fehlermeldung erzeugen?

Raketenschnitzel 30. Mai 2015 13:12

AW: EOleException 'Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt'
 
Ja, eine Read of Adress Exception gibts dann.
Dann muss ich wohl mal noch bissel mit den EingabeStrings rumexperimentieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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