2009-11-03 2 views
0

내부 개체의 일부 기능을 DLL로 공개하려고하지만이 기능은 변형을 사용합니다. 하지만 알아야 할 것은 Variant 매개 변수 및/또는 return을 사용하여 함수를 내보낼 수 있습니다. 아니면 문자열 만 표시하는 것이 더 낫습니다.간단한 DLL에서 어떻게 변형을 사용할 수 있습니까?

언어에 구애받지 않는 POV (소비자는 Delphi로 만들지 않았지만 모두 Windows에서 실행)에서 더 낫습니다.

+0

델파이 2010있다? 나는 VB6 주위에 델파이가 끝났다라고 생각했다 –

+2

명백하게 당신은 너무나 잘 생각하지 않는다. :-) 델파이는 여전히 살아 있으며 2010 년은 몇 달 전에 출시되었으며 현재 개발중인 릴리스가 2 개 이상 (하나의 64 비트, 하나의 크로스 플랫폼)으로 출시되었습니다. 당신은 현재의 뉴스에 잘 따라해야합니다. –

+2

Delphi가 살아 있고 발로 차 있습니다. Chris ;-) –

답변

6

COM에서 사용하는 변형 값 형식 인 OleVariant를 사용할 수 있습니다. 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

+1. 기본적으로 형식 라이브러리 임포트 단위에서 볼 수있는 데이터 형식 및 규칙을 고수하는 것은 좋은 생각입니다. – mghie

+0

흠 ... 잘 됐네. 오늘 밤 한번 시도해 볼게. –

0

내가 아는 한 다른 언어로 Variant 변수 유형을 사용하는 데 문제가 없습니다. 그러나 다른 변수 유형에 대해 동일한 함수를 내보내는 것이 좋습니다.

+0

델파이 heapmanager를 통해 할당 된 refcounted 유형이 있습니다. Olevariant 방법은 이것을 피할 수 있습니다. –

관련 문제