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文件,同时调用这两个函数出来的结果不正确,请问这是什么原因,如何处理?

解决方案 »

  1.   

    “//测试结果,向上面那样调用,结果不正确!
    //如果单独只调用PwdDecryption函数,结果是正确的。
    //或者将dll文件用Delphi分开写成两个文件,再调用也是正确的。”Delphi,你熟不熟悉?你直接这个net的exe做为dll外挂程序,
    在Delphi这两个函数入口设置断点,F5启动Delphi的工程,看看
    这两个函数的执行过程,一步一步,就会发现问题
      

  2.   

    我是反向的,相当于delphi写的dll是net程序的外挂.
      

  3.   


    这种说法有问题,exe程序才能做外挂程序!
    换种说法:也就是提供一个进程的启动程序!一个dll,没有exe程序,如何测试呢,对吧?
    net程序的dll,也是这种方式测试的,你想想是不是?
      

  4.   

    我是net写的程序是exe程序,去调用delphi写的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.
      

  5.   

    你怎么还没明白我的意思:    你有Delphi的这个dll的工程,直接在Delphi这边调试!
      

  6.   

    DLL中多个函数是没有问题的,检查DLL
      

  7.   

    我单独用Delphi写了一个exe文件来调试那个dll文件,也是遇到这个问题.
    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类型有问题.
      

  8.   

    DLL编译出现了问题,或DELPHI中DLL方法申明有问题
    感觉是这样,一般正常情况下不会出现这样的问题
      

  9.   

    “我单独用Delphi写了一个exe文件来调试那个dll文件,也是遇到这个问题.”,
    那说明你这个dll本身就有问题!对,就用现在的方式:把Delphi本身测试调通,再到net去使用!