Pergunta

eu quero expor algumas funcionalidades de um objeto interno como um DLL - mas que usa a funcionalidade variantes. Mas eu preciso saber: eu posso exportar uma função com parâmetros variantes e / ou retorno - ou é melhor ir para uma representação única-corda?

O que é melhor, de POV linguagem agnóstica (o consumidor não é feita com Delphi - mas tudo vai correr no Windows)?

Foi útil?

Solução

Você pode usar OleVariant, que é o tipo de valor variante que é usado por COM. Certifique-se de não devolvê-lo como um resultado da função como stdcall e tipos de resultados complexos podem facilmente levar a problemas.

Um exemplo simples biblioteca DelphiLib;

uses
  SysUtils,
  DateUtils,
  Variants;

procedure GetVariant(aValueKind : Integer; out aValue : OleVariant); stdcall; export;
var
  doubleValue : Double;
begin
  case aValueKind of
    1: aValue := 12345;
    2:
    begin
      doubleValue := 13984.2222222222;
      aValue := doubleValue;
    end;
    3: aValue := EncodeDateTime(2009, 11, 3, 15, 30, 21, 40);
    4: aValue := WideString('Hello');
  else
    aValue := Null();
  end;
end;

exports
  GetVariant;

Como poderia ser consumida a partir de C #:

public enum ValueKind : int
{
   Null = 0,
   Int32 = 1,
   Double = 2,
   DateTime = 3,
   String = 4
}

[DllImport("YourDelphiLib",
           EntryPoint = "GetVariant")]
static extern void GetDelphiVariant(ValueKind valueKind, out Object value);

static void Main()
{
   Object delphiInt, delphiDouble, delphiDate, delphiString;

   GetDelphiVariant(ValueKind.Int32, out delphiInt);
   GetDelphiVariant(ValueKind.Double, out delphiDouble);
   GetDelphiVariant(ValueKind.DateTime, out delphiDate);
   GetDelphiVariant(ValueKind.String, out delphiString);
}

Outras dicas

Tanto quanto eu sei que não há nenhum problema de trabalhar com Variant tipo de variável em outros idiomas. Mas vai ser ótimo se você exportar as mesmas funções para diferentes tipos de variáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top