Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IOleCommandTarget & Invalid Variant Type (https://www.delphipraxis.net/42789-iolecommandtarget-invalid-variant-type.html)

toms 23. Mär 2005 20:55


IOleCommandTarget & Invalid Variant Type
 
Hallo~!

Warum kriege ich bei Zeile 11 einen Invalid Variant Type?


Delphi-Quellcode:
function HrExecCommand(ucmdID: cardinal; const pVarIn: OleVariant;
  var pVarOut: OleVariant; bPromptUser: boolean): HResult;
const
  CMDSETID_Forms3: TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}';
var
  dwCmdOpt: cardinal;
  OleCommandTarget: IOleCommandTarget;
begin
  dwCmdOpt := OLECMDEXECOPT_DONTPROMPTUSER;
  Webbrowser1.Document.QueryInterface(IOleCommandTarget, OleCommandTarget);
  result := OleCommandTarget.Exec(@CMDSETID_Forms3, // Invalid Variant Type!!!!
    ucmdID,
    dwCmdOpt,
    pVarIn,
    pVarOut);
end;
Delphi-Quellcode:
procedure TfrmMyBrowser.GetAvailableStyles(List: TStrings);
const
  IDM_GETBLOCKFMTS = 2233;
var
  varRange: OleVariant;
  b: TBStr;
  a: PSafeArray;
  l, h, i: Longint;
  hr: HRESULT;
  NullVariant: OleVariant;
begin
  TVariantArg(VarRange).VT := VT_ARRAY;
  TVariantArg(VarRange).ppArray := nil;
  hr := HrExecCommand(IDM_GETBLOCKFMTS, unassigned, VarRange, False);
  //....
end;

toms 25. Mär 2005 00:15

Re: IOleCommandTarget & Invalid Variant Type
 
Come on Leute, Irgend jemand hat doch sicher eine Idee?

toms 26. Mär 2005 06:32

Re: IOleCommandTarget & Invalid Variant Type
 
Hat vielleicht jemand von den Samstag-Forum Besucher eine Idee?

toms 27. Mär 2005 18:19

Re: IOleCommandTarget & Invalid Variant Type
 
Delphi-Quellcode:
  VarRange := null;
und

Delphi-Quellcode:
  VarRange := VarArrayCreate([20,20], varInteger);
funktionieren auch nicht... :(

Mavarik 4. Apr 2006 16:52

Re: IOleCommandTarget & Invalid Variant Type
 
Also ich habe es so gelösst:

Delphi-Quellcode:
var
  ValOut : OLEVariant;
  Val   : PSafeArray;
  sBuffer: WideString;
  i,
  iMin,
  iMax: integer;
begin
 TVariantArg(ValOUT).VT := VT_ARRAY;
 TVariantArg(ValOUT).ppArray := nil;
 TargetCommando(2233,EmptyParam,ValOut);
 TVariantArg(ValOut).VT := VT_ARRAY;
 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 do
   begin
     ActiveX.SafeArrayGetElement(Val, i, sBuffer);
   end;
  // Vorsicht, Leak...
  ActiveX.SafeArrayDestroy(Val); // Das Funktioniert noch nicht.....
Ach ja mein TargetCommando...


Delphi-Quellcode:

CONST

  CGID_MSHTML   : TGUID = '{DE4BA900-59CA-11CF-9592-444553540000}';  

procedure TMainform.TargetCommando(IDM:integer;Valin:OleVariant;Var Valout:OleVariant);
var
  Target : IOleCommandTarget;
  PtrGUID : PGUID;
  Doc    : IHTMLDocument2;
begin
  if Succeeded(pDisp.QueryInterface(IID_IWebBrowser2, wb2)) then
    begin
      Doc := wb2.Document as IHTMLDocument2;

      Doc.QueryInterface(IID_IOleCommandTarget,Target);
       
      New(PtrGUID);
      PtrGUID^ := CGID_MSHTML;

      Target.Exec(PtrGUID,IDM,0,Valin,Valout);
 
      Target := NIL;
      Dispose(PtrGUID);
    end;
end;
Hoffe ich habe alles "richtig" umkopiert!
(Bei mir sieht es noch etwas anders aus, weil ich das auch in Frameseiten realisiert habe)


LG Frank :coder:


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