请问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呢?