VC写的COM接口函数为
AddItems (Count As Long, ItemIDs() As String, ClientHandles() As Long, ByRef ServerHandles() As Long, ByRef Errors() As Long, Optional RequestedDataTypes As Variant, Optional AccessPaths As Variant)
参数说明如下:
Count: The number of items to be affected
ItemIDs:Array of Fully Qualified ItemID’s
ClientHandles:Array of client item handles for the items processed
ServerHandles:Array of server item handles for the items processed
Errors: Array of Long’s indicating the success of the individual items operation.
RequestedDataTypes:Optional Variant containing an integer array of Requested DataTypes.
AccessPaths:Optional Variant containing a string array of Access Path’s.用Delphi 的Import Type Libaray转换城TLB后,上述接口函数成为
procedure AddItems(NumItems: Integer; var ItemIDs: PSafeArray; var ClientHandles: PSafeArray;out ServerHandles: PSafeArray; out Errors: PSafeArray;RequestedDataTypes: OleVariant; AccessPaths: OleVariant); safecall;我的调用代码如下:
procedure TForm1.Button4Click(Sender: TObject);
var
MyItemIDs: PSafeArray;
MyClientHandles: PSafeArray;
MyServerHandles: PSafeArray;
MyServerErrors: PSafeArray;
DataTypes: OleVariant;
AccessPaths: OleVariant; ArrayBounds: SAFEARRAYBOUND;
i: Integer;
p1,p2: Pointer;type
ItemIDsArray = Array of WideString;
ClientHandlesArray = Array of LongInt;begin
ArrayBounds.lLbound := 0;
ArrayBounds.cElements := 3; MyItemIDs := SafeArrayCreate(varOleStr,1,ArrayBounds);
if SafeArrayAccessData(MyItemIDs,p1) = S_OK then
begin
ItemIDsArray(p1)[0] := 'TAG1';
ItemIDsArray(p1)[1] := 'TAG51';
ItemIDsArray(p1)[2] := 'TAG631';
end;
SafeArrayUnAccessData(MyItemIDs); MyClientHandles := SafeArrayCreate(varInteger,1,ArrayBounds);
if SafeArrayAccessData(MyClientHandles,p2) = S_OK then
for i := 0 to 2 do
ClientHandlesArray(p2)[i] := 100+i;
SafeArrayUnAccessData(MyClientHandles); MyServerHandles := SafeArrayCreate(varInteger,1,ArrayBounds);
MyServerErrors:= SafeArrayCreate(varInteger,1,ArrayBounds); DataTypes := varArrayCreate([0,2],varInteger);
AccessPaths := varArrayCreate([0,2],varOleStr);
for i := 0 to 2 do
begin
DataTypes[i] := VT_EMPTY;
AccessPaths[i] := '';
end; MyGroup.OPCItems.AddItems(ItemCount,MyItemIDs,MyClientHandles,MyServerHandles,MyServerErrors,DataTypes,AccessPaths);
end;编译通过了,但是执行时出现class EOleException with Message "The parameter is incorrect"
问题出在哪里?是PsafeArray,还是OleVariant?请高手指点。
AddItems (Count As Long, ItemIDs() As String, ClientHandles() As Long, ByRef ServerHandles() As Long, ByRef Errors() As Long, Optional RequestedDataTypes As Variant, Optional AccessPaths As Variant)
参数说明如下:
Count: The number of items to be affected
ItemIDs:Array of Fully Qualified ItemID’s
ClientHandles:Array of client item handles for the items processed
ServerHandles:Array of server item handles for the items processed
Errors: Array of Long’s indicating the success of the individual items operation.
RequestedDataTypes:Optional Variant containing an integer array of Requested DataTypes.
AccessPaths:Optional Variant containing a string array of Access Path’s.用Delphi 的Import Type Libaray转换城TLB后,上述接口函数成为
procedure AddItems(NumItems: Integer; var ItemIDs: PSafeArray; var ClientHandles: PSafeArray;out ServerHandles: PSafeArray; out Errors: PSafeArray;RequestedDataTypes: OleVariant; AccessPaths: OleVariant); safecall;我的调用代码如下:
procedure TForm1.Button4Click(Sender: TObject);
var
MyItemIDs: PSafeArray;
MyClientHandles: PSafeArray;
MyServerHandles: PSafeArray;
MyServerErrors: PSafeArray;
DataTypes: OleVariant;
AccessPaths: OleVariant; ArrayBounds: SAFEARRAYBOUND;
i: Integer;
p1,p2: Pointer;type
ItemIDsArray = Array of WideString;
ClientHandlesArray = Array of LongInt;begin
ArrayBounds.lLbound := 0;
ArrayBounds.cElements := 3; MyItemIDs := SafeArrayCreate(varOleStr,1,ArrayBounds);
if SafeArrayAccessData(MyItemIDs,p1) = S_OK then
begin
ItemIDsArray(p1)[0] := 'TAG1';
ItemIDsArray(p1)[1] := 'TAG51';
ItemIDsArray(p1)[2] := 'TAG631';
end;
SafeArrayUnAccessData(MyItemIDs); MyClientHandles := SafeArrayCreate(varInteger,1,ArrayBounds);
if SafeArrayAccessData(MyClientHandles,p2) = S_OK then
for i := 0 to 2 do
ClientHandlesArray(p2)[i] := 100+i;
SafeArrayUnAccessData(MyClientHandles); MyServerHandles := SafeArrayCreate(varInteger,1,ArrayBounds);
MyServerErrors:= SafeArrayCreate(varInteger,1,ArrayBounds); DataTypes := varArrayCreate([0,2],varInteger);
AccessPaths := varArrayCreate([0,2],varOleStr);
for i := 0 to 2 do
begin
DataTypes[i] := VT_EMPTY;
AccessPaths[i] := '';
end; MyGroup.OPCItems.AddItems(ItemCount,MyItemIDs,MyClientHandles,MyServerHandles,MyServerErrors,DataTypes,AccessPaths);
end;编译通过了,但是执行时出现class EOleException with Message "The parameter is incorrect"
问题出在哪里?是PsafeArray,还是OleVariant?请高手指点。
AddItems (Count As Long, ItemIDs() As String, ClientHandles() As Long, ByRef ServerHandles() As Long, ByRef Errors() As Long, Optional RequestedDataTypes As Variant, Optional AccessPaths As Variant)
参数说明如下:
VC?? VB吧。
Optional RequestedDataTypes As Variant='', Optional AccessPaths As Variant=''