Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.03 c
1-1079340178
pavlov
2004-03-15 11:42
2004.04.04
работа с файлами из под сервиса


7-1073914819
Sergant
2004-01-12 16:40
2004.04.04
Прямая работа с портами


1-1079449864
Mikle
2004-03-16 18:11
2004.04.04
Как не дать закрыть форму?


3-1078685032
Volodya_
2004-03-07 21:43
2004.04.04
Сортировка DxDBGrid


3-1078384596
Виктор Исмагилов
2004-03-04 10:16
2004.04.04
Ключевые слова ADO, BDE и правила





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский