请问Delphi调用VC写的dll,有传入和传出参数都是unsigned char*运行中有有关问题

请教Delphi调用VC写的dll,有传入和传出参数都是unsigned char*,运行中有问题
VC写的dll的定义 
extern   "C "_declspec(dllexport)   unsigned   char*   GenAuthenNO(unsigned   char   *MachineNO,   unsigned   char   *AuthenNO) 
Delphi调用时的申明 
SQRTPROC   =   function(MachineNO:   array   of   BYTE;   var   pBuff:   PByte):   pbyte;stdcall; 
程序运行过程中,如果pBuff赋值了,就不能运行,如果pBuff没有赋值了,就可以运行, 
有谁知道怎么回事啊?

------解决方案--------------------
不要用var 声明参数。 
指针对指针。 
SQRTPROC = function(MachineNO: PChar; pBuff: PByte): pbyte;stdcall; 

------解决方案--------------------
SQRTPROC = function(MachineNO, pBuff:PChar): PChar;cdecl; 

调用之前是否为MachineNO, pBuff申请了空间? 
看声明应该默认的是cdecl方式 
------解决方案--------------------
AUTHENROC = function(MachineNO: array of BYTE; AuthenNO: array of BYTE): Integer;stdcall 

不要用array of byte这种动态数组类型,这是Delphi特有的,与VC不兼容,使用PChar,PByte 
或者: 
type 
TArray = array [0..7]of byte; 
PArray = ^TArray; 
var 
MachineNO,AuthenNO:PArray; 

使用时 New(MachineNo);动态申请空间 

另确认一下是否是stdcall方式 


------解决方案--------------------
GenAuthenNO(MachineNO, AuthenNO: PChar): PChar;//PByte也行 

var 
MachineNO, AuthenNO: array[0..7] of Char;//of Byte也行 

调用 
GenAuthenNO(@MachineNO[0], @AuthenNO[0]) 
------解决方案--------------------
1.使用前请对需要传出的参数预先分配固定空间,这个不能交给vc的DLL来处理,当然传入的时候是指针。 
2、当然使用stdcall了,怎么会使用cdecl呢?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值