我如何(或者如果我不能)在简单的DLL上使用变量?

时间:2009-11-03 13:15:32

标签: delphi dll delphi-2010 variant

我想将内部对象的某些功能公开为DLL - 但该功能使用变体。但我需要知道:我可以使用Variant参数导出函数和/或返回 - 或者更好地转到仅字符串表示形式?

更好的是,从语言无关的POV(消费者不是用Delphi制作 - 但所有都将在Windows中运行)?

2 个答案:

答案 0 :(得分:6)

您可以使用OleVariant,它是COM使用的变体值类型。 请确保不要将其作为函数结果返回,因为stdcall和复杂的结果类型很容易导致问题。

一个简单的例子     库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;

如何从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);
}

答案 1 :(得分:0)

据我所知,在其他语言中使用Variant变量类型没有问题。 但是,如果为不同的变量类型导出相同的函数,那将会很棒。