2012-06-07 16 views
4

我有我需要使用COM,其聲明如下在C#中調用過程:如何轉換數據類型以調用COM過程?

void DoSomething (string param1, string[] param2, Object[] param3) 

在進口的TypeLibrary德爾福聲明:

procedure DoSomething (param1: System.Widestring, 
         param2: ActiveX.PSafeArray, 
         param3: ActiveX.PSafeArray); 

參數1只是一個字符串。
param2是一個參數名稱數組,我們假設:['arg1','arg2']。
param3是這些參數的根據值。

實施例:ARG1:雙= 1.23,ARG2:整數= 10。
這將導致:
- 參數2:[ 'ARG1', 'ARG2']
- 參數3:[1.23,10]

到目前爲止,我有這樣的代碼參數2 []轉換成PSafeArray:

var param2: array of string; 
    i: integer; 
    va_param2: Variant; 
    psa_param2: Activex.PSafeArray; 
begin 
    SetLength (param2, 2); 
    param2 [0] := 'arg1'; 
    param2 [1] := 'arg2'; 
    // Create VariantArray, copy data 
    va_param2 := VarArrayCreate ([0, Length(param2)-1], varOleStr); 
    for i := 0 to Length(param2)-1 do 
    va_param2 [i] := param2 [i]; 
    // Convert VariantArray to PSafeArray 
    psa_param2 := PSafeArray (TVarData (va_param2).VArray); 
end; 

現在,我應該有一個參數2的PSafeArray。
但是我怎樣才能做到這一點param3 []?
會有不同的數據類型,不僅是字符串。

因爲在param2和param3設置之前我不能調用COM過程,所以我也不能確定上面的代碼是否正在做我所需要的。
它運行,但我是否正確地做這些轉換將結果傳遞給上述COM過程?

回答

9

缺省情況下,.NET Object被編組爲COM VARIANT,除非explicitally指定爲使用MarshalAs語法C#代碼的IUnknownIDispatch

試試這個:

var 
    param2: array of string; 
    param3: array of Variant; 
    i: integer; 
    va_param2: Variant; 
    va_param3: Variant; 
    psa_param2: Activex.PSafeArray; 
    psa_param3: Activex.PSafeArray; 
begin 
    SetLength (param2, 2); 
    param2 [0] := 'arg1'; 
    param2 [1] := 'arg2'; 

    SetLength (param3, 2); 
    param3[0] := 1.23; 
    param3[1] := 10; 

    // Create arrays, copy data 

    va_param2 := VarArrayCreate ([Low(param2), High(param2)], varOleStr); 
    for i := Low(param2) to High(param2) do 
    va_param2 [i] := param2 [i]; 

    va_param3 := VarArrayCreate ([Low(param3), High(param3)], varVariant); 
    for i := Low(param3) to High(param3) do 
    va_param3 [i] := param3 [i]; 

    // Convert arrays to PSafeArray 

    psa_param2 := PSafeArray (TVarData (va_param2).VArray); 
    psa_param3 := PSafeArray (TVarData (va_param3).VArray); 

    ... 
end; 
+0

謝謝的作品! – Holgerwa