
Сегодня, 16:44
|
|
Прохожий
|
|
Регистрация: 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;
|