![]() |
OLE / VarDispInvoke
Bin gerade auf der suche, wie ich folgendes per VarDispInvoke aufrufen kann
das funkt
Delphi-Quellcode:
Wie kann ich das ganze jetzt per VarDispInvoke aufrufen?
oleObject.Field[7] := 12;
Ich muß es ebene Parametrisieren (den Namen also "field")
Delphi-Quellcode:
mit
var
CallDesc : TCallDesc; ParamTypes : array[0..6 * 4 - 1] of byte; begin CallDesc.CallType := DISPATCH_PROPERTYPUT; CallDesc.ArgCount := 2; // Value + Parameter CallDesc.NamedArgCount := 0; CallDesc.ArgTypes[0] := varInteger; CallDesc.ArgTypes[1] := varInteger; Param := 12; Move(Param, ParamTypes[0], 4); Param := 7; Move(Param, ParamTypes[3], 4); fieldName := 'Field'; VarDispInvoke(nil, oleObject, PChar(fieldName), @CallDesc, @ParamTypes[0]);
Delphi-Quellcode:
procedure GetIDsOfNames(Dispatch: IDispatch; Names: PChar; NameCount: Integer; DispIDs: PDispIDList);
var I : Integer; N : Integer; Ch : WideChar; P : PWideChar; NameRefs : array[0..MaxDispArgs - 1] of PWideChar; WideNames : array[0..1023] of WideChar; R : Integer; begin I := 0; N := 0; repeat P := @WideNames[I]; if N = 0 then NameRefs[0] := P else NameRefs[NameCount - N] := P; repeat Ch := WideChar(Names[I]); WideNames[I] := Ch; Inc(I); until Char(Ch) = #0; Inc(N); until N = NameCount; R := Dispatch.GetIDsOfNames(GUID_NULL, @NameRefs, NameCount, LOCALE_SYSTEM_DEFAULT, DispIDs); if R <> 0 then raise EOleError.CreateFmt('Fehler', [Names]); end; procedure VarDispInvoke(Result: PVariant; const Dispatch: IDispatch; Names: PChar; CallDesc: PCallDesc; ParamTypes: Pointer); cdecl; var DispIDs : array [0..6 - 1] of Integer; begin GetIDsOfNames(IDispatch(Dispatch), Names, CallDesc^.NamedArgCount + 1, PDispIDList(@DispIDs[0])); if Result <> nil then VarClear(Result^); DispatchInvoke(IDispatch(Dispatch), CallDesc, PDispIDList(@DispIDs[0]), ParamTypes, Result); end; Hoffe, habe keine Tippfehler hier drinnen, ist jetzt etwas aus dem Kontext gerissen, aber sollte alles logisch passen |
Re: OLE / VarDispInvoke
Und wieso genau willst du das jetzt machen?
|
Re: OLE / VarDispInvoke
Zitat:
|
Re: OLE / VarDispInvoke
Und nochmal zum Verständnis:
Die VarDispInvoke aus der Unit ComObj gefällt dir nicht, weil man die nicht so simpel aufrufen kann? |
Re: OLE / VarDispInvoke
Zitat:
Delphi-Quellcode:
Es kommt übrigens kein Fehler, es wird einfach der Parameter nicht gesetzt ....fieldName := 'field'; CallDesc.CallType := DISPATCH_PROPERTYPUT; CallDesc.ArgCount := 2; // Value + Parameter CallDesc.NamedArgCount := 0; CopyMemory(@CallDesc.ArgTypes[2], @fieldName[1], length(fieldName)); CallDesc.ArgTypes[0] := varInteger; CallDesc.ArgTypes[1] := varInteger; Param := 12; Move(Param, ParamTypes[0], 4); Param := 7; Move(Param, ParamTypes[4], 4); //VarDispInvoke(nil, oleObject, @CallDesc, @ParamTypes[0]); VarDispProc(nil, oleObject, @CallDesc, @ParamTypes[0]); |
Re: OLE / VarDispInvoke
Fehler gefunden ... der zu setzende Wert gehört am Schluß und nicht am Anfang
|
Re: OLE / VarDispInvoke
Ich hatte die Parameter in einem Record. Aber mit dem Array funktioniert es bei mir auch.
Da ich dein Interface nicht habe, habe ich einfach mal IStrings genommen.
Delphi-Quellcode:
Edit: Wahnsinn wie schnell die Zeit vergeht. Da kopiert man nur kurz und schwupps sind wieder 15 Minuten rum.
type TParams=packed record
p1,p2:Integer; end; var x:variant; tmp:IStrings; CallDesc:TCallDesc; Params:TParams; p:array[0..255] of byte; n:Integer; const Name='item'#0; begin //IStrings Interface vom memo1 in Variant erstellen getOlestrings(memo1.lines,tmp); x:=tmp; tmp:=nil; //Variante 0 x.item[1]:=12; //Vorbereitungen für VarDispProc CallDesc.CallType:=DISPATCH_PROPERTYPUT; CallDesc.ArgCount:=2; CallDesc.NamedArgCount:=0; CallDesc.ArgTypes[0]:=varInteger; CallDesc.ArgTypes[1]:=varInteger; move(name,CallDesc.argTypes[2],length(name)); //Variante 1 n:=1; move(n,p[0],4); n:=15; move(n,p[4],4); VarDispProc(nil,x,@CallDesc,@P); //Variante 2 Params.p1:=1; Params.p2:=10; VarDispProc(nil,x,@CallDesc,@Params); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 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