Cómo llamar a un método COM de .NET con una serie de Delphi usando PSafeArray?
-
03-10-2019 - |
Pregunta
Tengo una .NET (4.0) de la interfaz que se implementa con un ServicedComponent
COM + clase:
interface DotNetIface
{
void MethodRef(var System.Guid guid);
void MethodArray(System.Guid[] guids, params object[] parameters);
void MethodCStyle([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeConst=5)]System.Guid[] guids);
}
Ahora he utilizado el Delphi 2007 Asistente de importación para importar la biblioteca de tipos, y como se esperaba Consigo las siguientes firmas:
procedure MethodRef(var guid : TGuid);
procedure MethodArray(guids : PSafeArray);
procedure MethodCStyle(var guids : ClrGuid /* from mscorlib_TLB */);
Si ahora la palabra el método "ref" como esto funciona bien:
procedure CallByRef(guid : TGuid);
var
test : TGuid;
begin
test := ...
comRef.MethodRef(guid);
end;
Ahora también necesitan el método array
procedure CallArray();
var
localGuid : TGuid;
arrayVariant : OleVariant;
begin
arrayVariant := VarArrayCreate([0,4], varVariant /* dont know here */);
arrayVariant[0] := localGuid; /* compile error, cannot cast implicitly */
comRef.MethodArray(PSafeArray(TVarData(arrayVariant.VArray)), /* here this object... PSafeArray works actually*/);
end;
Ahora, por último, i intentado con una matriz de c
procedure CallCStyle();
var
localGuid : TGuid;
arrayOfGuid : array [0..4] of ClrGuid;
begin
arrayOfGuid[0] := ClrGuid(localGuid);
comRef.MethodCStyle(PSafeArray(/* now i dont know put it*/, /* here this object... PSafeArray works actually*/);
end;
En serio, no sé cómo hacer este trabajo. Espero que alguien tiene más experiencia con el COM de clasificación THX
nodo lateral:
He encontrado VT_CLSID que creo que se puede pasar por SafeArrayCreate, pero no estoy seguro de cómo demandar que
Solución
nunca he intentado lo que necesita, pero una búsqueda rápida se encuentran los siguientes artículos:
- Scripting Sus aplicaciones Delphi ( muestra un buen ejemplo de convertir una matriz de variante a PSafeArray
- Cómo hacer un acceso SafeArray con una DLL de variantes (OLE)
- Los misterios de PSafeArray