vb调用该dll的演示代码如下:
Private Declare Function Dacsp_init Lib "dacsplib.dll" () As Long
Private Declare Function Dacsp_login Lib "dacsplib.dll" (ByVal Context As Long) As Integer
Private Declare Function Dacsp_final Lib "dacsplib.dll" (ByVal Context As Long) As IntegerPrivate Declare Function Dacsp_FileEnc Lib "dacsplib.dll" (ByVal Context As Long, ByVal infil As String, ByVal outfile As String, ByVal pubkey As String) As Integer
Private Declare Function Dacsp_FileDec Lib "dacsplib.dll" (ByVal Context As Long, ByVal infil As String, ByVal outfile As String, ByVal keyNo As Integer) As Integer
Private Declare Function Dacsp_StrEnc Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal pubkey As String) As Integer
Private Declare Function Dacsp_StrDec Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal keyNo As Integer) As IntegerDim Context As Long
Dim ret As Integer
Dim pubkey As BytePrivate Sub Command1_Click()
Dim str As String
Dim str2 As String * 2048
Dim str3 As String * 2048
Dim pubkey As String
Context = Dacsp_init()
ret = Dacsp_login(Context)
If ret < 0 Then
MsgBox ("登陆失败!")
Exit Sub
End If以上代码能成功运行无错!!
--------------------------------------------------------------------------------------
我改写成Delphi版的代码如下:
Interface
Function Dacsp_init():Longint;
Function Dacsp_login(Context:Longint):Integer;
Function Dacsp_final(Context:Longint):Integer;
Function Dacsp_FileEnc(Context:Longint;infil,outfile,pubkey:String):Integer;
Function Dacsp_FileDec(Context:Longint;infil,outfile:String;keyno:Integer):Integer;
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;implementation
Function Dacsp_init:Longint;external 'dacsplib.dll';
Function Dacsp_login(Context:Longint):Integer;external 'dacsplib.dll';
Function Dacsp_final(Context:Longint):Integer;external 'dacsplib.dll';
Function Dacsp_FileEnc(Context:Longint;infil,outfile,pubkey:String):Integer;external 'dacsplib.dll';
Function Dacsp_FileDec(Context:Longint;infil,outfile:String;keyno:Integer):Integer;external 'dacsplib.dll';
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;external 'dacsplib.dll';
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;external 'dacsplib.dll';procedure TFrm_Main.Button2Click(Sender: TObject);
var
ret:Integer;
Context:Longint;
Context := Dacsp_init();
ret := Dacsp_login(Context);
if ret < 0 Then
Messagedlg('操作失败!',mtError,[mbok],0); 程序一执行就报错,翻译后大概内容为:"内存访问错误,在模块dacsplib中"请问为什么同样一个dll在vb中能被成功调用,而在delphi中却会报错呢?是不是变量类型的问题?
还是什么传值和传地址之间的转换??
求高手指点~~~
Private Declare Function Dacsp_init Lib "dacsplib.dll" () As Long
Private Declare Function Dacsp_login Lib "dacsplib.dll" (ByVal Context As Long) As Integer
Private Declare Function Dacsp_final Lib "dacsplib.dll" (ByVal Context As Long) As IntegerPrivate Declare Function Dacsp_FileEnc Lib "dacsplib.dll" (ByVal Context As Long, ByVal infil As String, ByVal outfile As String, ByVal pubkey As String) As Integer
Private Declare Function Dacsp_FileDec Lib "dacsplib.dll" (ByVal Context As Long, ByVal infil As String, ByVal outfile As String, ByVal keyNo As Integer) As Integer
Private Declare Function Dacsp_StrEnc Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal pubkey As String) As Integer
Private Declare Function Dacsp_StrDec Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal keyNo As Integer) As IntegerDim Context As Long
Dim ret As Integer
Dim pubkey As BytePrivate Sub Command1_Click()
Dim str As String
Dim str2 As String * 2048
Dim str3 As String * 2048
Dim pubkey As String
Context = Dacsp_init()
ret = Dacsp_login(Context)
If ret < 0 Then
MsgBox ("登陆失败!")
Exit Sub
End If以上代码能成功运行无错!!
--------------------------------------------------------------------------------------
我改写成Delphi版的代码如下:
Interface
Function Dacsp_init():Longint;
Function Dacsp_login(Context:Longint):Integer;
Function Dacsp_final(Context:Longint):Integer;
Function Dacsp_FileEnc(Context:Longint;infil,outfile,pubkey:String):Integer;
Function Dacsp_FileDec(Context:Longint;infil,outfile:String;keyno:Integer):Integer;
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;implementation
Function Dacsp_init:Longint;external 'dacsplib.dll';
Function Dacsp_login(Context:Longint):Integer;external 'dacsplib.dll';
Function Dacsp_final(Context:Longint):Integer;external 'dacsplib.dll';
Function Dacsp_FileEnc(Context:Longint;infil,outfile,pubkey:String):Integer;external 'dacsplib.dll';
Function Dacsp_FileDec(Context:Longint;infil,outfile:String;keyno:Integer):Integer;external 'dacsplib.dll';
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;external 'dacsplib.dll';
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;external 'dacsplib.dll';procedure TFrm_Main.Button2Click(Sender: TObject);
var
ret:Integer;
Context:Longint;
Context := Dacsp_init();
ret := Dacsp_login(Context);
if ret < 0 Then
Messagedlg('操作失败!',mtError,[mbok],0); 程序一执行就报错,翻译后大概内容为:"内存访问错误,在模块dacsplib中"请问为什么同样一个dll在vb中能被成功调用,而在delphi中却会报错呢?是不是变量类型的问题?
还是什么传值和传地址之间的转换??
求高手指点~~~
你把DLL拷到当前目录下了吗
我只把dll放在system32下了(win2000server)
还有啊,我刚才查到帖子说调用dll的时候必须添加stdcall
例如 Function Dacsp_init:Longint;stdcall;external 'dacsplib.dll';
还有一种说法是如果vb用到了string类型的定义,delphi调用时应该改为Pchar类型?
请问是不是这样啊,如果是, 那其他类型(比如long和longint)该如何相互转换呢~
对于不细心而胡答一气,请楼主原谅
stdcall调用方式能解决不同语言的编写的动态连接库的兼容,他是制从右到左的参数调用顺序
有LONGINT类型的
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模块中访问错误"
------------------------------------------------------------------------------------
下面是vb的函数定义,而且已经测试成功!
Private Declare Function Dacsp_StrEnc Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal pubkey As String) As Integer
Private Declare Function Dacsp_StrDec Lib "dacsplib.dll" (ByVal Context As Long, ByVal indata As String, ByVal indatalen As Integer, ByVal outdata As String, ByVal keyNo As Integer) As Integer
该dll应该是c++写的,而且用vb调用很成功,但是用delphi调用后两个函数就出错。
http://community.csdn.net/Expert/topic/3428/3428921.xml?temp=.7383234
那为什么delphi里用string会报内存错误呢??