Delphi的dll文件里有两个函数,在C#程序这样调用。[DllImport("LoginIdentAuth.dll")]
public static extern string PwdDecryption(string myPwd);
//
[DllImport("LoginIdentAuth.dll")]
public static extern bool LoginValidation(string IP, string User, string Pwd);//
private void button1_Click(object sender, EventArgs e)
{
if (LoginValidation(IP, User, Pwd)) //调用Dll里LoginValidation函数
{
string str=PwdDecryption("ah*&%ase"); //调用Dll里PwdDecryption函数
}
}//测试结果,向上面那样调用,结果不正确!
//如果单独只调用PwdDecryption函数,结果是正确的。
//或者将dll文件用Delphi分开写成两个文件,再调用也是正确的。现在是同一个dll文件,同时调用这两个函数出来的结果不正确,请问这是什么原因,如何处理?
public static extern string PwdDecryption(string myPwd);
//
[DllImport("LoginIdentAuth.dll")]
public static extern bool LoginValidation(string IP, string User, string Pwd);//
private void button1_Click(object sender, EventArgs e)
{
if (LoginValidation(IP, User, Pwd)) //调用Dll里LoginValidation函数
{
string str=PwdDecryption("ah*&%ase"); //调用Dll里PwdDecryption函数
}
}//测试结果,向上面那样调用,结果不正确!
//如果单独只调用PwdDecryption函数,结果是正确的。
//或者将dll文件用Delphi分开写成两个文件,再调用也是正确的。现在是同一个dll文件,同时调用这两个函数出来的结果不正确,请问这是什么原因,如何处理?
//如果单独只调用PwdDecryption函数,结果是正确的。
//或者将dll文件用Delphi分开写成两个文件,再调用也是正确的。”Delphi,你熟不熟悉?你直接这个net的exe做为dll外挂程序,
在Delphi这两个函数入口设置断点,F5启动Delphi的工程,看看
这两个函数的执行过程,一步一步,就会发现问题
这种说法有问题,exe程序才能做外挂程序!
换种说法:也就是提供一个进程的启动程序!一个dll,没有exe程序,如何测试呢,对吧?
net程序的dll,也是这种方式测试的,你想想是不是?
Dll文件代码如下:
library LoginIdentAuth;uses
ADODB,
ActiveX,
SysUtils,
Classes;const
FNIL = '''(&.&!''%&$"''&)" ",&)$(%#$-$#$$" ' ; //NIL值
PS1 = '&''$%"# !./,-*+()' ; //密码符
FF1 = ' !"#$%&''()*+,-./'; //符号集Function JudgeEffect(myADOCon:TADOConnection; myADOQuery:TADOQuery; mySqlStr,myID,myValue,ContrastStr:string):Boolean;
var
i:integer;
begin
……
end;Function JudgeDate(myADOCon:TADOConnection; myADOQuery:TADOQuery; mySqlStr:string):Boolean;
begin
……
end;Function LoginJudge(IP,User,Pwd,Dt:string):Boolean;
var
ConStr:string;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
begin
……
end;Function TransitionUser(s:String):string;
var
n,i,d:integer;
begin
……
end;Function DecryptionCode(EnStr,s:string):string;
var
KeyLen,i,n1,n2:integer;
FStr1{,Fstr2}, FStr3,FStr4:Char;
begin
……
end;Function LoginValidation(IP,User,Pwd,Dt:Pchar):Boolean; stdcall ;
var
myIP,myUser,myPwd,myDt:string;
begin
myIP:=IP;
myUser:=User;
myPwd:=Pwd;
myDt:=Dt;
//上,类型转换
Result:=(LoginJudge(myIP,myUser,myPwd,myDt));
end;Function PwdDecryption(myName,myPwd:Pchar):Pchar; stdcall ;
var
EnStr,s:string;
begin
EnStr:=myName;
s:= myPwd;
//上,类型转换
Result:=Pchar(DecryptionCode(EnStr,s));
end;{$R *.res}exports LoginValidation,PwdDecryption;beginend.
var
Form1: TForm1;Function PwdDecryption(EnStr,s:Pchar):Pchar; stdcall; external 'LoginIdentAuth.dll' ;
Function LoginValidation(IP,User,Pwd,Dt :Pchar):Boolean; stdcall ; external 'LoginIdentAuth.dll' ;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(PwdDecryption(Pchar(Trim(Edit1.Text)),Pchar(Trim(Edit2.Text))));
ShowMessage(BoolTostr(LoginValidation(Pchar(IP),Pchar(sa),Pchar(sa))));
end;问题很奇怪,前两次Button1Click事情显示结果正确,第三个就变错了.
我在dll文件函数中加了每次Result显示出来,又是正确的.
感觉是Pchar类型转换string类型有问题.
感觉是这样,一般正常情况下不会出现这样的问题
那说明你这个dll本身就有问题!对,就用现在的方式:把Delphi本身测试调通,再到net去使用!