Bin gerade auf der suche, wie ich folgendes per VarDispInvoke aufrufen kann
das funkt
oleObject.Field[7] := 12;
Wie kann ich das ganze jetzt per VarDispInvoke aufrufen?
Ich muß es ebene Parametrisieren (den Namen also "field")
Delphi-Quellcode:
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]);
mit
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