delphi 调用 VC 的 DLL 高分求解 350(100分)

  • 主题发起人 主题发起人 山顶瀑布
  • 开始时间 开始时间

山顶瀑布

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一dll,其用VB 调用的声明如下:
Type param_byname_data
point_name As String
param_name As String
param_offset As Long
padding1 As Long 'for byte alignment between VB and C
param_value As Variant
param_type As Integer
padding2 As Integer 'for byte alignment between VB and C
status As Long
End Type

Public Declare Function rhsc_param_value_put_bynames Lib "hscnetapi.dll" _
Alias "rhsc_param_value_put_bynames_vb" _
(ByVal Server As String, ByVal num_requests As Long, _
param_byname_data_array() As param_byname_data) As Long

VC 的调用声明如下:
typedef struct _PARAM_BYNAME_DATA
{
n_char *szPntName
/* (in) point name */
n_char *szPrmName
/* (in) parameter name */
n_long nPrmOffset
/* (in) parameter offset */
PARvalue *pupvValue
/* (in/out) parameter value union */
n_ushort nType
/* (in/out) value type */
n_long fStatus
/* (out) status of each value access */
} PARAM_BYNAME_DATA;

EXTERN_C int __loadds CALLBACK rhsc_param_value_put_bynames
_DECLARE((char *, int, PARAM_BYNAME_DATA *));

但我用D6 调用却报参数错误,我调用的声明如下:
Type
param_byname_data = record
point_name : PChar ;
param_name : PChar ;
param_offset : LongInt ;
padding1 : LongInt
//for byte alignment between VB and C
param_value : Variant;
param_type : word;
padding2 : Integer
//for byte alignment between VB and C
status : LongInt ;
End
{param_byname_data}

function rhsc_param_value_put_bynames(Server : PChar
num_requests : Integer;
numb_prm:array of param_byname_data) : LongInt
cdecl;
external 'hscnetapi.dll' name 'rhsc_param_value_put_bynames_vb';

望各位高手给与解答
 
1、两个padding就不用了,除非你的record是 packed 的
2、PARvalue是什么,你应该定义一个这样的record,然后pupvValue是这个record的指针类型,而不是variant,delphi的variant和vb的不是一回事
3、传入的第三个参数,numb_prm,是 Pparam_byname_data (指向param_byname_data的指针)
 
如果是VC写的DLL,调用约定多半是:CDECL
同意楼上的,你的RECORD只需要六个字段
第三个参数也可以用数组,要看情况,主要是给出一块空间,要保证这空间与DLL实际
使用的一致(可以查看在VC中调动时的情况)
把你的第三个参数的数据类型声明为静态的试一下,有时会有影响:
TYPE TArrOfParamRecord=array [0..k] of param_byname_data;
numb_prm:TArrOfParamRecord,K的大小视实际情况而定
 
都使用 stdcall
 
后退
顶部