Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c