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