http://expert.csdn.net/Expert/topic/1618/1618219.xml?temp=.6791345原贴内容如上,上次就当散分了。这次希望大家亲自动手试试,谁的代码编译通过并实现上述功能分全部给他。如果感觉很好的话也加分给大家分。

解决方案 »

  1.   

    呵呵,不能通过编译?你是指:
    “[Hint] Project1.dpr(19): Value assigned to 'a' never used”
    这个信息么?
    如果是的话,这不叫做不能通过编译,编译通过了,这仅仅是个提示信息,意思是变量a被赋值后再没有使用过,因此此句被编译器优化时去掉了,最终不会编译到dll或者exe中。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    a:=pchar(GetUserName);    
    try
      

  3.   

    谁有兴趣留下Mail,我把程序发过去帮忙调试一下。
      

  4.   

    “是因为调用GetUserName出现无效指针操作,你的MAIL留下我把程序发给你看看”
    不用发了,是因为你的GetUserName的第一个参数(PChar)类型没有分配地址。应该类似如下书写:
    var
      P: PChar;
    begin
      GetMem(P, MAXBYTE);
      GetUserName(P, ……);
      //……
      FreeMme(P);
    end;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  5.   

    FreeMem(P);—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  6.   

    [email protected]给我发一个调试看看.改好了再发给你.没改好的话就不好意思...没得了
      

  7.   

    我的GetUserName没有参数,其实这个函数有过几个版本一直不行。第一次:function GetUserName:ShortString;
    begin
      Result:=FUserName;
    end;第二次:
    function GetUserName:Pchar;
    begin
      Result:=Pchar(FUserName);
    end;第三次:
    function GetUserName:Pchar; 
    begin
      GetMem(Result, Length(FUserName));
      StrCopy(Result, FUserName);
    end;我现在不知到调用dll是否必须传递PChar、返回PCHAR,资料上说可以用shortstring。
    下面的调用,如果传入Sting调用成功但窗体标题为乱码,但如果传入PCHAR则编译不通过。
    function Logon(AHandle: THandle; ACaption: PChar): boolean;
    var
      LogonForm: TLogonForm;
    begin
       Check := False;
       Application.Handle := AHandle;
       LogonForm := TLogonForm.Create(Application);
       try
         LogonForm.Caption := ACaption;    //此处显示不正常,乱码
         LogonForm.ShowModal;     //返回给调用本dll的应用程序判断
         Result:=Check;
       finally
         LogonForm.Free;
       end;
    end;
      

  8.   

    你把SHAREMEM.PAS加到USES中并且为第一个引用的单元,然后把LOGIN过程的ACaption参数换成PCHAR型试试.
      

  9.   

    我来帮你调试一下如何?[email protected]
      

  10.   

    也发给我试试吧,[email protected]
      

  11.   

    谢谢大家,已经解决了。原来是函数声明的问题,小疏忽折磨了我很长时间。一会散分给大家,哈哈dll中声明了stdcall,
      function Logon(AHandle: THandle; ACaption: PChar): boolean; stdcall;
      function GetUserName:PChar; stdcall; //ShortString;
      function GetPassword:PChar; stdcall;
      function GetProject :PChar; stdcall;而调用部分漏掉了
      function Logon(AHandle: THandle; ACaption: PChar): Boolean; external 'LogonDll.dll' name 'Logon';
      function GetUserName:PChar; external 'LogonDll.dll' name 'GetUserName';
      function GetPassword:PChar; external 'LogonDll.dll' name 'GetPassword';
      function GetProject:PChar; external 'LogonDll.dll' name 'GetProject';