int Dacsp_StrEnc(int hanle, unsigned char *inData, int
inDataLen, unsigned char *outData, unsigned char *pubkey);
说明:错误返回小于0;int Dacsp_StrDec(int handle, unsigned char *inData,
int inDataLen, unsigned char *outData, int keyNo);
说明: 错误返回小于0;以上是dll中的函数定义。
-----------------------------------------------------------------------------------------
Delphi中的调用代码如下:
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;stdcall;external 'dacsplib.dll';
我将上面的String类型替换成Pchar类型后,仍然抱错,替换前是"不能写入0000000",替换后报错"某某内存地址在dacsplib模块中访问错误"请问 unsigned char * 类型对应Delphi中应该如何定义啊?
我的dll调用就是玩不转~~
inDataLen, unsigned char *outData, unsigned char *pubkey);
说明:错误返回小于0;int Dacsp_StrDec(int handle, unsigned char *inData,
int inDataLen, unsigned char *outData, int keyNo);
说明: 错误返回小于0;以上是dll中的函数定义。
-----------------------------------------------------------------------------------------
Delphi中的调用代码如下:
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;stdcall;external 'dacsplib.dll';
我将上面的String类型替换成Pchar类型后,仍然抱错,替换前是"不能写入0000000",替换后报错"某某内存地址在dacsplib模块中访问错误"请问 unsigned char * 类型对应Delphi中应该如何定义啊?
我的dll调用就是玩不转~~
解决方案 »
- 马上结~~~
- 要附带的字符串大于 64K 不能使用资源文件 还有其他办法加入到程序中么?
- [月薪5000-8000]急聘Delphi程序员1名(中介勿扰)(2006年7月17-8月17日有效)
- 求助,请各位大哥帮我解释一下 " 的含义,谢谢!
- IntraWeb用StandAlone模式做成的程序如何用Apache发布?
- 如何做一个数据库安装程序?!请教高手!!
- 囧囧的Ansistring和String……
- memo --> edit的问题
- 请问ADO访问access数据库时,对于AutoIncrement字段如何在insert a record后取得该值?
- 关于cxGrid 显示字段的问题
- 读excel
- 用原生的Socket语句来如何控制Socket的发送和接收字符串?
我把函数定义里加上var.Function Dacsp_StrEnc(var Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';结果不抱内存错误了,但是程序执行后返回的是空值~~
郁闷。
function Dacsp_StrEnc(Context:Longint;
indata: PChar;
indatalen: integer;
outdata, pubkey: PChar):Integer;stdcall;
external 'dacsplib.dll';还要注意的是:indata, outdata, pubkey是指针参数,所以你要先分配足够的内存:
如:
GetMem(indata, 100);
GetMem(outdata, 100);
GetMem(pubkey, 100);
Dacsp_StrEnc(Context, indata, indatalen, outdata, pubkey);
//使用indata, outdata, pubkey中的数据
FreeMem(pubkey, 100);
FreeMem(outdata, 100);
FreeMem(indata, 100);
Function Dacsp_StrEnc(var Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';
其中,outdata为传出参数,其他均为传入参数
你说得没错,只有outdata一个参数是传出的。那还要不要在outdata前面加上var ??
其他的传入参数是不是就不用getmem和freemem了?
我刚才把函数里的所有参数都getmem和freemem了,结果程序执行时不报错,但是一调用完
就报错:"Invalid Pointer Operation"
代码如下:
Function
Dacsp_StrEnc(Context:Longint;indata:Pchar;indatalen:Integer;var
outdata:Pchar;pubkey:Pchar):Integer;stdcall;external 'dacsplib.dll';
Function
Dacsp_StrDec(Context:Longint;indata:Pchar;indatalen:Integer;var
outdata:Pchar;keyno:Integer):Integer;stdcall;external 'dacsplib.dll';
procedure TFrm_Main.Button2Click(Sender: TObject);
var pubkeyFile:Textfile;
pubkeydir:String;
pubkey,str,str2:String;
ret:Integer;
Context:Longint;
indata,outdata,pubk:Pchar;
begin
GetMem(indata, 100);
GetMem(outdata, 100);
GetMem(pubk, 100);
pubkeydir:=ExtractFilePath(Application.ExeName);
AssignFile(pubkeyFile,pubkeydir+'encrypt\server\encsvr.dat');
reset(pubkeyFile);
Readln(pubkeyFile,pubkey);
closeFile(pubkeyFile);
Context := Dacsp_init();
edit1.text:=intToStr(Context);
ret := Dacsp_login(Context);
if ret < 0 Then
Messagedlg('操作失败!',mtError,[mbok],0);
str:='abcd';
indata:=Pchar(str);
pubk:=Pchar(pubkey);
ret:=Dacsp_StrEnc(Context,indata, 4, outdata, pubk);
edit2.text:=inttostr(ret);
edit3.text:=outdata;
FreeMem(pubk, 100);
FreeMem(outdata, 100);
FreeMem(indata, 100);
end;
Error : :"Invalid Pointer Operation"
这里给个提醒:C的DLL默认调用方式是_cdecl,DELPHI的默认调用方式是_stdcall.