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

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

山顶瀑布

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';

望各位高手给与解答
 
'rhsc_param_value_put_bynames_vb'这是什么东东?怎么后面多了个_VB!
还有numb_prm是param_byname_data的指针变梁!
 
pparam_byname_data = ^param_byname_data;
param_byname_data = record
point_name : PChar
param_name : PChar
param_offset : Integer
padding1 : Integer
//for byte alignment between VB and C
param_value : Variant;
param_type : word;
padding2 : Integer
//for byte alignment between VB and C
status : Integer
End
{param_byname_data}

function put_bynames(Server : PChar
num_requests : Integer;
numb_prm : pparam_byname_data) : Integer
stdcall;
external 'hscnetapi.dll' name 'rhsc_param_value_put_bynames_vb';
 
该 DLL 提供了两个函数
'rhsc_param_value_put_bynames_vb' 用于 VB 调用
'rhsc_param_value_put_bynames' 用于 VC 调用
 
那用VC的好一些吧!注意stdcall标准!
 
如何将 VC 的调用转化为 Delphi 的调用。
 
同意楼上的,你的RECORD只需要六个字段
第三个参数也可以用数组,要看情况,主要是给出一块空间,要保证这空间与DLL实际
使用的一致(可以查看在VC中调动时的情况)
把你的第三个参数的数据类型声明为静态的试一下,有时会有影响:
TYPE TArrOfParamRecord=array [0..k] of param_byname_data;
numb_prm:TArrOfParamRecord,K的大小视实际情况而定
 
调用的结果显示 维数错误
 
维数错误?调整数组长度总是出错么?
你可以用VC的例子,跟踪一下各个参数,只要能保证在这块空间里,以同样的格式
放入同样的数据就可以了
 
可能是这个问题。不知如何解决。
 
如何看呢?VC 实在是不太熟悉。
 
CALLBACK 好像是与 stdcall 对应,而不是cdecl;
 
第三个参数可转为空指针Pointer,在用时再进行类形转换
 
现在看来是 Delphi 的 Record 和 VC 的 Structure 的存储空间不一致造成的。不知
那位有这方面的经验,这两者是如何分配空间的。
 
我碰到过用delphi调用vc编写的dll的问题,我用
function put_bynames(Server : PChar
num_requests : Integer;
numb_prm : pparam_byname_data) : Integer
stdcall;
external 'hscnetapi.dll' name 'rhsc_param_value_put_bynames_vb';
之类的声明,delphi找不到函数的入口,最后换成按index调用解决问题。
 
我的是能够调用,但返回值报错
 
把第三个参数声明为如下形式试过没有:
function xxx_put_bynames(Server : PChar
num_requests : Integer;
var numb_prm : param_byname_data) : Integer
cdecl;
还有第一个参数实际需要的空间如果大于4个字节,要自己分配空间。
STRUCTRUE和RECORD的空间至少要保证一致再说,你写出的STRUCTRUE里的类型都是自
定义的吧, 你能找到VC的例子么,主要是参数的声明和赋值语句部分?
 
同意beyondair:
传递引用指针试试看!
 
我想用VC写个DLL玩玩。学习调用先。
 
问题已请我的一个朋友解决了,定义一个与 VC 结构一样大小的空间。自己定义传递参数。
不过总感觉比较麻烦。应该还有其他的方法。
 

Similar threads

回复
3
查看
112
妙兔无花
回复
5
查看
128
山顶瀑布
N
回复
5
查看
93
nhuangjr
N
顶部