Thema: Delphi OLE / VarDispInvoke

Einzelnen Beitrag anzeigen

Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#1

OLE / VarDispInvoke

  Alt 23. Okt 2008, 11:11
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
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat