我这有个delphi调用webservice(VS.net)的未知错误,我想贴图出来,怎么处理?

解决方案 »

  1.   

    delphi7调用webservice(VS.net)在自定义dll文件中声明以下函数(delphi编写)
    ////////////////////////////////////////////////////////////////////////////////////
    function Getdefurl(user_id:WideString;password:WideString; var userdata:WideString;var errmsg:WideString):integer;stdcall;////////////////////////////////////////////////////////////////////////////////////在delphi下,编写应用程序,调用自定义dll代码如下:
    procedure TForm1.webserviceClick(Sender: TObject);
    type
      TIntFunc = function (user_id:wideString;password:wideString; userdata:wideString;  errmsg:wideString):integer; stdcall;
    var
      Th:Thandle;
      Tf:TIntFunc;
      Tp:TFarProc;
      str1,str2:string ;
      s1,s2,s3,s4,s5,s6:string;begin
        s1:=edit1.text;
        s2:=edit2.text;
        s3:=edit3.text;
        s4:=edit4.text;
        s5:=edit5.text;
        s6:=edit6.text;  Th:=LoadLibrary('C:\WINDOWS\system32\uskydll.dll');
      if Th>0 then
      try
        Tp:=GetProcAddress(Th,PChar('Getdefurl'));
          if Tp<>nil then
          begin
          try
            Tf:=TIntFunc(Tp);        Tf(s1,s2,s3,s4,s5,s6,str1,str2 );
          finally
            showmessage('Error');
          end;
          
          userdatat.caption :=str1;
          errmsgt.caption :=str2;      end
      else
        ShowMessage('Getdefurl&ordm;&macr;&Ecirc;&yacute;&Atilde;&raquo;&Oacute;&ETH;&Otilde;&Ograve;&micro;&frac12;');
      finally
        FreeLibrary(Th);
      end
    else
      ShowMessage('uskydll.dll&Atilde;&raquo;&Oacute;&ETH;&Otilde;&Ograve;&micro;&frac12;');
    end;错误描述:
    title:Debugger Exception Notification
    message:Project apptest.exe raised exception class EAccessViolation with message 'Access violation at address 770ECA05 in module 'oleaut32.dll'. Read of address 0000000'.
    Process stopped. Use step or run to continue.
      

  2.   

    出错语句:   Tf(s1,s2,s3,s4,s5,s6,str1,str2 );可怎么trace into dll文件中的tf函数呢?
      

  3.   

    在编译DLL时候,设置APPLICATION HOST为这个EXE程序.. 然后在DLL去跟踪执行,看看函数里的哪条语句出错了
      

  4.   

    就是run菜单中的第三个子菜单然后在host application栏中指定这个EXE程序就行了。
      

  5.   

    刚才试了,执行到这句就出错 Tf(s1,s2,s3,s4,s5,s6,str1,str2 );错误信息:
    title:apptest
    message:Access violation at address 770ECA05 in moudle 'oleaut32.dll'.Read of address 0000000.跟踪程序没有进入dll里面,请帮忙看看
      

  6.   

    不是呀,,,你找开Dll这个项目,然后点击run菜单中的第三个子菜单然后在host application栏中指定apptest.exe程序就行了。然后在dll中设置断点,接着编译dll,这时delphi会启动exe文件,当exe执行到Tf(s1,s2,s3,s4,s5,s6,str1,str2 );时,DLL中的断点就会跳出来了,然后你在单步执行,看看错误在哪一条语句呀
      

  7.   

    对的,是这样操作的,可我的应用程序是动态调用的,执行到调用函数就出错,根本就没进入dll,所以才头痛阿,兄台help me~
      

  8.   

    function Getdefurl(user_id:WideString;password:WideString; var userdata:WideString;var errmsg:WideString):integer;stdcall;
    TIntFunc = function (user_id:wideString;password:wideString; userdata:wideString;  errmsg:wideString):integer; stdcall;这两个里面参数定义不一样,,,把TIntFunc = function (user_id:wideString;password:wideString; userdata:wideString;  errmsg:wideString):integer; stdcall;改成和声明一样
      

  9.   

    procedure TForm1.webserviceClick(Sender: TObject);
    type
      TIntFunc = function(user_id:WideString;password:WideString; software:WideString; ver:WideString;group_id:WideString;creditkey:WideString;var userdata:WideString;var errmsg:WideString):integer;stdcall;
    var
      Th:Thandle;
      Tf:TIntFunc;
      Tp:TFarProc;
      str1,str2:String ;
      s1,s2,s3,s4,s5,s6:String;begin
        s1:=edit1.text;
        s2:=edit2.text;
        s3:=edit3.text;
        s4:=edit4.text;
        s5:=edit5.text;
        s6:=edit6.text;  Th:=LoadLibrary('C:\WINDOWS\system32\uskydll.dll');
      if Th>0 then
      try
        Tp:=GetProcAddress(Th,PChar('Getdefurl'));
          if Tp<>nil then
          begin
          try
            Tf:=TIntFunc(Tp);        Tf(s1,s2,s3,s4,s5,s6,@str1,@str2 );
          finally
            
          end;      userdatat.caption :=str1;
          errmsgt.caption :=str2;      end
      else
        ShowMessage('Getdefurl&ordm;&macr;&Ecirc;&yacute;&Atilde;&raquo;&Oacute;&ETH;&Otilde;&Ograve;&micro;&frac12;');
      finally
        FreeLibrary(Th);
      end
    else
      ShowMessage('uskydll.dll&Atilde;&raquo;&Oacute;&ETH;&Otilde;&Ograve;&micro;&frac12;');
    end;  TIntFunc = function(user_id:WideString;password:WideString; software:WideString; ver:WideString;group_id:WideString;creditkey:WideString;var userdata:WideString;var errmsg:WideString):integer;stdcall;以上函数调用已和Dll文件中声明的格式一样,可还是有错误信息,请帮忙看看。
    错误信息如下:
    [Error] test.pas(116): Types of actual and formal var parameters must be identical
    [Fatal Error] apptest.dpr(6): Could not compile used unit 'test.pas'
      

  10.   

    将Tf(s1,s2,s3,s4,s5,s6,@str1,@str2 ); 改成 Tf(s1,s2,s3,s4,s5,s6,str1,str2 );还是以上错误。