Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

IDispatch.Invoke   Найти похожие ветки 

 
_Guest_   (2004-03-11 18:18) [0]

может ли кто-нибудь привести пример вызова метода интерфейса через Invoke?


 
Digitman ©   (2004-03-11 18:28) [1]

чем вызван сей приступ мазохизма ?
почему бы не поручить компилятору эту нудную и кропотливую работу ?


 
_Guest_   (2004-03-11 18:33) [2]

допустим, я использую позднее связывание


 
Digitman ©   (2004-03-11 18:36) [3]

да хоть раннее !

поручи всю эту работу компилятору ... который вставит нужный код и задействует все необходимые механизмы, избавив тебя от необходимости потеть над параметрами вызова метода и интерпретацией возвращенного им результата ..


 
_Guest_   (2004-03-11 18:48) [4]

И тем не менее хотелось бы получить ответ (хотя бы просто из интереса). То, что компилятор кучу всякой ботвы делает автоматически, ещё не значит, что ни в коем случае нельзя интересоваться механизмом её реализации


 
icWasya ©   (2004-03-11 18:52) [5]


var
ID:IDispatch;
V:Variant; // это раз
...
const
 CLASS_Word    : TGUID = "{000209FF-0000-0000-C000-000000000046}";
begin
 ID:=CreateComObject(CLASS_Word);
 V:=ID; // это два

 Label1.Caption:="  число документов ="+
  IntToStr(WordApp.Documents.Count);

end;


 
MMF ©   (2004-03-11 19:13) [6]

function GetPropVal(PropDispID: integer;  Obj: IDispatch;
                   var pvarPropVal: OleVariant): HResult; stdcall;Var
 VarResult: OleVariant;
 Inf:       ExcepInfo;
 DispParams: TDispParams;
begin
 DispParams.rgvarg:=nil;
 DispParams.rgdispidNamedArgs := nil;
 DispParams.cArgs :=0;
 DispParams.cNamedArgs := 0;
 FillChar(inf,SizeOf(ExcepInfo),0);
 result:=Obj.Invoke(PropDispId, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
                    DISPATCH_PROPERTYGET , DispParams, @VarResult, @Inf, nil);
 If Result<>S_OK Then Exit
   else
     If TVarData(VarResult).VType = varByRef or varVariant Then
        pvarPropVal:= OleVariant(TvarData(TVarData(VarResult).VPointer^))
     Else
        pvarPropVal:=VarResult;
end;


 
Serginio666   (2004-03-12 13:58) [7]

Используй диспинтерфейсы.
Привет MMF.
В DispParams.rgvarg:=nil; при отсутствии параметров.

Может тебе это поможет

главное правильно заполнить структуры и вызвать с соответствующими флагами

Function FillParams(Var MethodRecord:TMethodRecord;Var Args:TArgs; var paParams: PSafeArray{(OleVariant)}; var DispParams: TDispParams): HResult;
Var
P:PParamsArray;
i,j:Integer;
begin
if Length(MethodRecord.Params)=0 Then
begin
DispParams.rgvarg:=nil;
DispParams.rgdispidNamedArgs := nil;
DispParams.cArgs := 0;
DispParams.cNamedArgs := 0;
Result:=S_OK;
exit;
end;
Try
Try
VarResultCheck(SafeArrayGetUBound(paParams,1,j));
VarResultCheck(SafeArrayGetLBound(paParams,1,i));
j:=j-i;
VarResultCheck(SafeArrayAccessData(paParams,Pointer(p)));
Try
For i:=0 to j Do
Begin
If MethodRecord.Params[i].IsPtr Then
Begin
//=========================================================
If MethodRecord.Params[i].ParamType=VT_VARIANT Then
begin
Args[j-i].vt:=VT_BYREF or VT_VARIANT;
Args[j-i].byRef:=@p^[i];
end
else
begin
if MethodRecord.Params[i].ParamType<>TvarData(p^[i]).VType Then
Begin
If MethodRecord.Params[i].ParamType=VT_DISPATCH Then // Возможно Out параметр
Begin
VarClear(p^[i]);
TvarData(p^[i]).VType:=VT_DISPATCH;
TvarData(p^[i]).VAny:=nil;
end
else
VarCast(p^[i],p^[i], MethodRecord.Params[i].ParamType);
end;
Args[j-i].vt:=VT_BYREF or TvarData(p^[i]).VType;
Args[j-i].unkVal:=@TVarData(p^[i]).VAny;
end;
end
else
//==============================================================
begin
If MethodRecord.Params[i].ParamType=VT_VARIANT Then
begin
Args[j-i].vt:=TVarData(p^[i]).Vtype;
Args[j-i].dblVal:=TVarData(p^[i]).VDouble;
end
else
begin
if MethodRecord.Params[i].ParamType<>TvarData(p^[i]).VType Then
Begin
If MethodRecord.Params[i].ParamType=VT_DISPATCH Then // Возможно Out параметр
Begin
VarClear(p^[i]);
TvarData(p^[i]).VType:=VT_DISPATCH;
TvarData(p^[i]).VAny:=nil;
end
else
VarCast(p^[i],p^[i], MethodRecord.Params[i].ParamType);
end;
Args[j-i].vt:=TvarData(p^[i]).VType;
Args[j-i].dblVal:=TVarData(p^[i]).VDouble;
end;
end

end;
DispParams.rgvarg:=@Args;
DispParams.rgdispidNamedArgs := nil;
DispParams.cArgs := j+1;
DispParams.cNamedArgs := 0;
Finally
VarResultCheck(SafeArrayUnaccessData(paParams));

end;
finally

end;
except
Result:=S_False;
exit;
end;
Result:=S_OK;
end;

function TAddInObject.CallAsFunc(lMethodNum: Integer; var pvarRetValue: OleVariant; var paParams: PSafeArray{(OleVariant)}): HResult; stdcall;
Var VarResult:OleVariant;
Inf:ExcepInfo;
begin

if FillParams(MethodArray[lMethodNum],Args,paParams,DispParams)<>S_OK Then
begin
result:=E_FAIL;
RaiseParamError;
exit;
end;
FillChar(inf,SizeOf(ExcepInfo),0);
result:=obj.Invoke(MethodArray[lMethodNum].DispId, GUID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD OR DISPATCH_PROPERTYGET, DispParams, @VarResult, @Inf, nil);
If Result<>S_OK Then
Begin
ErrorLog.AddError(nil,@inf);
result:=E_FAIL
end
Else
Begin
If TVarData(VarResult).VType = varByRef or varVariant Then
pvarRetValue:= OleVariant(TvarData(TVarData(VarResult).VPointer^))
Else
pvarRetValue:=VarResult
end;

end;


 
_Guest_   (2004-03-12 14:16) [8]

спасибо всем



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
6-1076571983
d_s
2004-02-12 10:46
2004.04.04
Входяшие подключения


7-1073698191
Poison
2004-01-10 04:29
2004.04.04
Log_Off


1-1079538058
Александр1
2004-03-17 18:40
2004.04.04
Как добавить лист в Excel?


7-1074007088
_наблюдатель_
2004-01-13 18:18
2004.04.04
crHandPoint


3-1078662906
Крутыш
2004-03-07 15:35
2004.04.04
Устанавливаю свойство edgosmartrefresh и не работает удаление