Показать сообщение отдельно
  #4  
Старый Сегодня, 16:44
infopol infopol вне форума
Прохожий
 
Регистрация: 03.06.2021
Сообщения: 46
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Благодаря ИИ нашел решение

Код:
 
function GetGUIDOleObject(ole:OleVariant): WideString;
var
TA: PTypeAttr;
 IIDS:WideString;
 Dispatch: IDispatch;
  MyGuid:TGUID;
// IDD:OleVariant;
 Guids:System.TGuid;
ti: ITypeInfo;
  pd: PVarData;
     unk: IUnknown;
   MyInterface: IInterface;
 begin
 //MyGiud
 try
 pd := PVarData(@ole);
 dispatch:=IDispatch.Create;
// COM/Automation объект (IDispatch или IUnknown)
if (pd^.VType = varDispatch) or (pd^.VType = varUnknown) then
begin
// Попробуем получить IDispatch
try
                     // VarAsType(V,varVariant);
dispatch :=IDispatch( pd.VDispatch);//VarAsType(V,varVariant));
except
dispatch := nil;
end;
end;

if Assigned(dispatch) then
begin
try
   unk := IUnknown(@ole);
   MyInterface:=  IInterface(PVarData(unk).VUnknown ) ;
if Succeeded( Dispatch.GetTypeInfo  (0, {LOCALE_USER_DEFAULT{}GetUserDefaultLCID, ti)) then
begin
//ti.Release;
if Succeeded(TI.GetTypeAttr(TA)) then
try

result:=(System.TGuid( TA^.guid).ToString) ; // GUID найден
 result:= StringReplace(result, '{', '',
                          [rfReplaceAll, rfIgnoreCase]);
result:= StringReplace(result, '}', '',
                          [rfReplaceAll, rfIgnoreCase]);

finally
TI.ReleaseTypeAttr(TA);

end;

end;
  except
  result:=' None GUID';
end;

end;
     except;
     result:='Error'
end;
end;
Ответить с цитированием