![]() |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Hi!
Es lautet immer Empty auch für alle einzelnen Elemente... Auf diese Struktur kann man nur über das PSaveArray Construct zugreifen!!! Frank :coder: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Zitat:
Es wäre ein Leichtes gewesen, ein Variant-Array von OleStr(=BSTR) aufzubauen. Auf ![]() Das lässt sich auf Delphi übertragen. |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Nun ja... Also wenn Du Dir meine ursprüngliche Nachricht ansiehst, habe ich es genau so gemacht!
Frank :wiejetzt: |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
Zitat:
Vor dem Aufruf an TargetCommando braucht/soll ValOut nicht vorbereitet werden. Am Ende gibt du das SafeArray mit SafeArrayDestroy frei. Die Exception EVariantBadVarTypeError könnte darauf hindeuten, dass Delphi selbst versucht ValOut zu finalisieren und in diesem speziellen Fall aber ein Problem hat ein "Array of Empty" freizugeben. Im Delphi 5 Sourcecode gibt es die Exception EVariantBadVarTypeError nicht; du müsstest also deinen Sourcecode von D2005 danach durchsuchen. Es wäre auch wichtig zu wissen, ob die Exception durch SafeArrayDestroy ausgelöst ist (was ich nicht glaube) oder erst bei Erreichen des Procedureende (meine Vermutung). Evtl. könnte es helfen, den Typ des Variant zu ändern:
Delphi-Quellcode:
for i := iMin to iMax do
begin ActiveX.SafeArrayGetElement(Val, i, sBuffer); Combobox1.Items.Add(SBuffer); end; TVariantArg(ValOUT).VT := VT_EMPTY; // Trick: Variant ist nun kein Array mehr ValOUT := 42; // Trick2: Compiler soll "denken", du benützt ValOut immer noch |
Re: Fehler bei SafeArry Destroy - Wer kann helfen...
ICH HABS! Hoffe ich jedenfalls!
Delphi-Quellcode:
So gibt es keine Exception mehr...
FormatCombo.Items.Clear;
TVariantArg(ValOUT).VT := VT_BYREF or VT_SAFEARRAY; TVariantArg(ValOUT).ppArray := nil; TargetCommando(2233,EmptyParam,ValOut); // 2233 TVariantArg(ValOUT).VT := VT_BYREF or VT_SAFEARRAY; // EINFACH NOCHMAL SETZEN! Val := PSafeArray(TVariantArg(ValOUT).ppArray); // Die Anzahl der Elemente im Array bestimmen ActiveX.SafeArrayGetLBound(Val, 1, iMin); ActiveX.SafeArrayGetUBound(Val, 1, iMax); // Die einzelnen Strings auslesen for i := iMin to iMax-1 do begin try ActiveX.SafeArrayGetElement(Val, i, sBuffer); FormatCombo.Items.Add(SBuffer); except // Caption := 'Fehler'; end; end; ActiveX.SafeArrayDestroyData(Val); ActiveX.SafeArrayDestroy(Val); Frank :coder: PS.: Trotzdem danke für Deine Hilfe... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz