| 
			
			 
			
				02.12.2024, 08:11
			
			
			
		 | 
	| 
		
			
			| Модератор |  | 
					Регистрация: 17.04.2008 Сообщения: 8,111
 Версия Delphi: 7, XE3, 10.2 Репутация: 49089     |  | 
	| 
				  
 Непонятно что конкретно тебе надо сделать. Точнее в чем проблема. 
Вот более полный пример:
 
Форма:
 
	Код: unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Unit2, Unit3, Vcl.StdCtrls;
type
  TForm1 = class(TForm)
    btAddStr1: TButton;
    btAddStr2: TButton;
    btAddStr3: TButton;
    btCall: TButton;
    procedure btAddStr1Click(Sender: TObject);
    procedure btAddStr2Click(Sender: TObject);
    procedure btAddStr3Click(Sender: TObject);
    procedure btCallClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    Buf : TParamsColleator;
    procedure AddStrToBuf(S : String);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AddStrToBuf(S: String);
begin
  if Not Assigned(Buf) then Buf := TParamsColleator.Create;
  Buf.Add(S);
end;
procedure TForm1.btAddStr1Click(Sender: TObject);
begin
  AddStrToBuf('Str1');
end;
procedure TForm1.btAddStr2Click(Sender: TObject);
begin
  AddStrToBuf('Str2');
end;
procedure TForm1.btAddStr3Click(Sender: TObject);
begin
  AddStrToBuf('Str3');
end;
procedure TForm1.btCallClick(Sender: TObject);
var
  Intf : IComDemoInterface;
  params : OleVariant;
begin
  If Not Assigned(Buf) Then raise Exception.Create('Buf is empty. Add values first.');
  Intf := TComDemoImpl.Create;
  Try
    params := Buf.GetParamsArray;
    Intf.ProcessArray(params);
  Finally
    Intf := Nil;
  End;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Buf := Nil;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  If Assigned(Buf) Then FreeAndNil(Buf);
end;
end. 
Интерфейс с имплементацией:
 
	Код: unit Unit2;
interface
type
  IComDemoInterface = interface(IUnknown)
    ['{00000000-0000-ABCD-0000-000000000001}']
    procedure ProcessArray(arr: OleVariant); safecall;
  end;
  TComDemoImpl = class(TInterfacedObject, IComDemoInterface)
    procedure ProcessArray(arr: OleVariant); safecall;
  end;
implementation
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants;
{ TComDemoImpl }
procedure TComDemoImpl.ProcessArray(arr: OleVariant);
var
  I : Integer;
  S : String;
begin
  If Not VarIsArray(arr)
    Then MessageBox(0,PChar('<no data>'),PChar('Received call, but param is not array:'),0)
    Else
      Begin
        S := '';
        For I := VarArrayLowBound(arr,1) To VarArrayHighBound(arr,1) Do
          If VarIsStr(arr[i])
            Then S := S + IntToStr(I) + ' : ' + arr[i] + #10#13
            Else S:= S + IntToStr(I) + ' : <not string>' + #10#13;
        MessageBox(0,PChar(S),PChar('Received call:'),0);
      End;
end;
end. 
Аккумулятор для параметров (самый простейший, просто унаследовался от TStringList и добаил свою функцию):
 
	Код: unit Unit3;
interface
uses
  System.SysUtils, System.Variants, System.Classes;
type
  TParamsColleator=class(TStringList)
  public
    function GetParamsArray : OleVariant;
  end;
implementation
{ TParamsColleator }
function TParamsColleator.GetParamsArray: OleVariant;
var
  I : Integer;
begin
  Result :=  VarArrayCreate([0,Count-1],varOleStr);
  For I := 0 To Count-1 Do
    Result[i] := Strings[i];
end;
end.
			
			
			
			
				  |