Показать сообщение отдельно
  #2  
Старый 12.06.2026, 14:52
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Вроде получилось ,но ....

Код:
function VariantObjectClassName(const V: OleVariant): string;
var
pd: PVarData;
ti: ITypeInfo;
disp: IDispatch;
 basicType  : Integer;
sDoc, sHelpFile: PBStr;
helpCtx: PLongInt;
 typeString : string;
 Presult:PBStr;
begin

pd := PVarData(@V);

 basicType := pd^.VType  and VarTypeMask;

  // ????????? ?????? ??? ???????????? ????
  case basicType of
    varEmpty     : typeString := 'varEmpty';
    varNull      : typeString := 'varNull';
    varSmallInt  : typeString := 'varSmallInt';
    varInteger   : typeString := 'varInteger';
    varSingle    : typeString := 'varSingle';
    varDouble    : typeString := 'varDouble';
    varCurrency  : typeString := 'varCurrency';
    varDate      : typeString := 'varDate';
    varOleStr    : typeString := 'varOleStr';
    varDispatch  : typeString := 'varDispatch';
    varError     : typeString := 'varError';
    varBoolean   : typeString := 'varBoolean';
    varVariant   : typeString := 'varVariant';
    varUnknown   : typeString := 'varUnknown';
    varByte      : typeString := 'varByte';
    varWord      : typeString := 'varWord';
    varLongWord  : typeString := 'varLongWord';
    varInt64     : typeString := 'varInt64';
    varStrArg    : typeString := 'varStrArg';
    varString    : typeString := 'varString';
    varAny       : typeString := 'varAny';
    varTypeMask  : typeString := 'varTypeMask';
    varObject    : typeString := 'varObject';
  end;

Result :={VarToStr(pd^.VType)+'|'+} typeString;// VarToStr(pd^.VType);
try
// Delphi-объект, упакованный как varObject
if (pd^.VType = varObject) and  (pd^.VPointer <> nil) then
begin
Result := TObject(pd^.VPointer).ClassName;
//Exit;
end;
except
    Result := 'IDispatch none typeinfo';

end;
disp:=IDispatch.Create;




// COM/Automation объект (IDispatch или IUnknown)
if (pd^.VType = varDispatch) or (pd^.VType = varUnknown) then
begin
// Попробуем получить IDispatch
try
                     // VarAsType(V,varVariant);
disp :=IDispatch( pd.VDispatch);//VarAsType(V,varVariant));
pd:= PVarData(@disp);
   //   disp.ClassType.ClassName;
   if pd^.VType = varObject then
       Result := TObject(pd^.VPointer).ClassName;
//ShowMessage('IDispatch'+#13+VarToStr(pd^.VType)+#13+Result);
except
disp := nil;
end;
end;

           try
if Assigned(disp) then
begin
 // Получаем typeinfo (локаль можно заменить на LOCALE_USER_DEFAULT)
 if Succeeded(disp.GetTypeInfo(0, {LOCALE_USER_DEFAULT{}GetUserDefaultLCID, ti)) and Assigned(ti) then
  begin
  result:='';
            // // Получаем typeinfo (локаль можно заменить на LOCALE_USER_DEFAULT)
    // MEMBERID_NIL (-1) — имя типа
   ti.GetDocumentation(-1, @Result, @sDoc, nil, nil);
Result:=(result) ;
  // ShowMessage('Succeeded'+#13+Result);

   //    ti.GetDocumentation(MEMBERID_NIL, PResult, sDoc, helpCtx, sHelpFile);
  end
  else
    Result := 'IDispatch без typeinfo';
        // }

       // disp.Free;
end;
           except
              Result := 'Error IDispatch typeinfo';
           end;


end;



пришлось перекодировать результат из UTF8 в Win
Ответить с цитированием