gpt4 book ai didi

delphi - 如何转换数据类型来调用COM过程?

转载 作者:行者123 更新时间:2023-12-03 15:21:18 29 4
gpt4 key购买 nike

我有一个需要使用 COM 调用的过程,它在 C# 中的声明如下:

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

导入的TypeLibrary中的Delphi声明是:

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

param1 只是一个字符串。
param2 是参数名称数组,比方说:['arg1', 'arg2']。
param3 是这些参数的相应值。

示例:arg1: double = 1.23,arg2:整数 = 10。
这将导致:
- 参数2:['arg1','arg2']
- 参数3:[1.23,10]

到目前为止,我有以下代码将 param2[] 转换为 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;

现在我应该有 param2 的 PSafeArray。
但是我该如何为 param3[] 执行此操作?
将会有不同的数据类型,而不仅仅是字符串。

由于在设置 param2 和 param3 之前我无法调用 COM 过程,因此我也无法确定上面的代码是否正在执行我需要的操作。
它运行了,但是我是否正确地进行了这些转换以将结果传递给上面的 COM 过程?

最佳答案

默认情况下,.NET Object 被编码为 COM VARIANT,除非明确指定为 IUnknownIDispatch 在 C# 代码中使用 MarshalAs 语法。

试试这个:

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;

关于delphi - 如何转换数据类型来调用COM过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935894/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com