delphi 与 VB 的variant数据类型一样吗? ( 积分: 200 )

  • 主题发起人 主题发起人 dongruxue
  • 开始时间 开始时间
D

dongruxue

Unregistered / Unconfirmed
GUEST, unregistred user!
一个C做的DLL,VB能正常调用,但是转为DELPHI后不能正常调用,其中有一个参数是VARIANT类型的,并且是按地址传递的,请高手帮忙
 
把VB的声明贴出来吧,是使用的BYVAL么?那么在D中恐怕的使用指针而非VARIANT了
 
VB的variant对应于DELPHI的olevariant。
 
VB的结构:<br>Type&nbsp;param_byname_data<br>&nbsp;&nbsp;&nbsp;&nbsp;point_name&nbsp;As&nbsp;String<br>&nbsp;&nbsp;&nbsp;&nbsp;param_name&nbsp;As&nbsp;String<br>&nbsp;&nbsp;&nbsp;&nbsp;param_offset&nbsp;As&nbsp;Long<br>&nbsp;&nbsp;&nbsp;&nbsp;padding1&nbsp;As&nbsp;Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'for&nbsp;byte&nbsp;alignment&nbsp;between&nbsp;VB&nbsp;and&nbsp;C<br>&nbsp;&nbsp;&nbsp;&nbsp;param_value&nbsp;As&nbsp;Variant<br>&nbsp;&nbsp;&nbsp;&nbsp;param_type&nbsp;As&nbsp;Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;padding2&nbsp;As&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'for&nbsp;byte&nbsp;alignment&nbsp;between&nbsp;VB&nbsp;and&nbsp;C<br>&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;As&nbsp;Long<br>End&nbsp;Type<br>声明:<br>Public&nbsp;Declare&nbsp;Function&nbsp;rhsc_param_value_bynames&nbsp;Lib&nbsp;&quot;hscnetapi.dll&quot;&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;Alias&nbsp;&quot;rhsc_param_value_bynames_vb&quot;&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;(ByVal&nbsp;Server&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;period&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;num_requests&nbsp;As&nbsp;Long,&nbsp;_<br>&nbsp;&nbsp;&nbsp;&nbsp;param_byname_data_array()&nbsp;As&nbsp;param_byname_data)&nbsp;As&nbsp;Long<br><br>调用示例:<br>'Set&nbsp;up&nbsp;local&nbsp;variables<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;data()&nbsp;As&nbsp;param_byname_data<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;Count&nbsp;As&nbsp;Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;i&nbsp;As&nbsp;Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;status&nbsp;As&nbsp;Long<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;period&nbsp;As&nbsp;Long<br>&nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;NameArray&nbsp;As&nbsp;Variant<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>'Start&nbsp;routine<br>&nbsp;&nbsp;&nbsp;&nbsp;NameArray&nbsp;=&nbsp;ArraysFromString(EdtGetName,&nbsp;3,&nbsp;Count)<br>&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Count&nbsp;&lt;&nbsp;1&nbsp;Then&nbsp;Exit&nbsp;Sub<br>&nbsp;&nbsp;&nbsp;&nbsp;ReDim&nbsp;data(Count)<br>&nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;i&nbsp;=&nbsp;0&nbsp;To&nbsp;Count&nbsp;-&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data(i).point_name&nbsp;=&nbsp;NameArray(0,&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data(i).param_name&nbsp;=&nbsp;NameArray(1,&nbsp;i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Not&nbsp;IsNumeric(NameArray(2,&nbsp;i))&nbsp;Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox&nbsp;(&quot;Parameter&nbsp;Offset&nbsp;&quot;&nbsp;&amp;&nbsp;i&nbsp;+&nbsp;1&nbsp;&amp;&nbsp;&quot;&nbsp;must&nbsp;be&nbsp;a&nbsp;numeric&nbsp;expression.&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit&nbsp;Sub<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data(i).param_offset&nbsp;=&nbsp;CLng(NameArray(2,&nbsp;i))<br>&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;'i<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;period&nbsp;=&nbsp;GetPeriod()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;=&nbsp;rhsc_param_value_bynames(EdtHostName,&nbsp;period,&nbsp;Count,&nbsp;data)
 
改为delphi:<br>&nbsp;&nbsp;Type<br>&nbsp;&nbsp;&nbsp;&nbsp;Pparam_byname_data&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;^param_byname_data;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_byname_data&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_name&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_name&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;string&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_offset&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;LongInt&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding1&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;LongInt&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//for&nbsp;&nbsp;&nbsp;byte&nbsp;&nbsp;&nbsp;alignment&nbsp;&nbsp;&nbsp;between&nbsp;&nbsp;&nbsp;VB&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_value&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;OLEVariant;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_type&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;word;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding2&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;word&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//for&nbsp;&nbsp;&nbsp;byte&nbsp;&nbsp;&nbsp;alignment&nbsp;&nbsp;&nbsp;between&nbsp;&nbsp;&nbsp;VB&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;LongInt&nbsp;&nbsp;&nbsp;;<br>&nbsp;&nbsp;End;&nbsp;&nbsp;&nbsp;{param_byname_data}<br><br><br><br>&nbsp;&nbsp;function&nbsp;&nbsp;&nbsp;rhsc_param_value_bynames(const&nbsp;Server:string;const&nbsp;period:integer;&nbsp;const&nbsp;num_requests:Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;param_byname_data_array:array&nbsp;of&nbsp;param_byname_data):integer;stdcall&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;external&nbsp;'hscnetapi.dll'&nbsp;&nbsp;name&nbsp;'rhsc_param_value_bynames_vb';<br><br>调用示例&nbsp;<br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servername:&nbsp;&nbsp;&nbsp;array[0..255]&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;char;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;params:&nbsp;&nbsp;Tparam_byname_data;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A:&nbsp;array&nbsp;of&nbsp;param_byname_data;<br><br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servername:='localhost';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;params:=&nbsp;VarArrayCreate([0,&nbsp;4],Tparam_byname_data);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;A&nbsp;:=&nbsp;VarArrayCreate([0,1],&nbsp;varVariant);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlength(A,1);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;2&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[0].point_name&nbsp;:='TR-OUT';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[0].param_name&nbsp;:='PV';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A[0].param_offset:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;params.padding1&nbsp;:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;params.param_value&nbsp;:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;params.param_type&nbsp;:=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;params.padding2&nbsp;:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;params.status&nbsp;:=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;end;<br><br><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;listbox1.Items.Add(inttostr(rhsc_param_value_bynames('localhost',0,1,A)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listbox1.Items.Add(a[0].point_name&nbsp;);<br>&nbsp;&nbsp;&nbsp;listbox1.Items.Add(a[0].param_value&nbsp;);<br>end;
 
后退
顶部