The Delphi Bug List

Visual Component Library (VCL)

Internet


The color codes indicate in which version(s) of Delphi the bug occurs and what its status is.
Latest update: 21 January 1999
Bug # Delphi versions Description
5 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
The components on the Internet page of the Component Palette have many problems.
6 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
There's a bug in ScktComp when stThreadBlocking is used.
7 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
Problems making ISAPI dll work with Netscape Fasttrack Server 3.0
526 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 TIsapiRequest
TIsapiRequest.ReadClient doesn't work with NSAPI
521 1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02 TNMSMTP
Calling Disconnect when there's no active copnnection causes the component to go into an infinite loop.

Bug #5; last modified: before April 1998
1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
N/A Exists Unknown Unknown Unknown Unknown Unknown Unknown
Internet

The components on the Internet page of the Component Palette have many problems.

Description
  • FTP: "Database Engine Error: Delphi32.exe - Entry point not found: The procedure entry point could not be located in the dynamic link library MSVCRT40.Dll". Click OK. Then follows: Error: The specified procedure could not be found"
  • HTML: "Delphi32.exe - Entry point not found: The procedure entry point SMapLS_IP_EBP_24 could not be located in the dynamic link library KERNEL32.Dll"
  • HTTP: "Delphi32.exe: Bad Image: The application or DLL \DosDevices\D:\WINNT35\SYSTEM32\HTTPCT.OCX is not a valid Windows NT image. Please check this against your installation diskette." Click OK. Then follows: Error: OLE error 800700C1.
  • NNTP: "Delphi32.exe: Bad Image: The application or DLL \DosDevices\D:\WINNT35\SYSTEM32\NNTPCT.OCX is not a valid Windows NT image. Please check this against your installation diskette." Click OK. Then follows: Error: OLE error 800700C1.
  • POP: "Delphi32.exe: Bad Image: The application or DLL \DosDevices\D:\WINNT35\SYSTEM32\POPCT.OCX is not a valid Windows NT image. Please check this against your installation diskette." Click OK. Then follows: Error: OLE error 800700C1.
  • SMTP: "Error: Invalid access to memory location".
  • TCP: "Access is denied".
  • UDP: "Access is denied".
  • Then there is the issue of the 'time bombed' components. After my call for more information on this, Dave Bolt responded:
    I attach the NetManage ActiveX Time Bomb patch utility (nmpatch.zip; 20,387 bytes).
    The Internet Control Pack does indeed contain time-bombed components. I forget where I thought I saw this documented, but I found the information on Compuserve when I had to get it solved.
    The patch utility worked well, but the controls must be correctly registered. On one machine I use there was a problem with the registration, which was first discovered when I ran the patch utility. The OCX registration is carried out in D2 by selecting Component|Install|OCX. Refer to the help for further information. As I recall, the registration process sets up the Component Library representation. The only thing you might have to do is set the name of the page you want the OCX to appear on. (Please excuse me if I don't go into the details too deeply. I have this machine working reasonably and don't want to change anything I dont have to. It didn't take too much figuring out anyway once I was looking at the OCX registration option).
    If you need to register the OCX files, you will first need to find them. This is not as much of a problem as you might think. Just search for files with the extension .OCX, (using File Manager or Windows Explorer), then work through them trying to get Delphi to register them. It will only agree to register appropriate OCXs.
    Hope this is of use to someone.

    Bug #6; last modified: before April 1998
    1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
    N/A N/A Unknown Unknown Unknown Unknown Unknown Unknown
    Internet

    There's a bug in ScktComp when stThreadBlocking is used.

    Description
    Reported by Jonas Frost; not independently confirmed yet
    When I use stThreadBlocking the OnClientWrite and OnClientRead dont get fired...
    instead my program runs in to a loop (that's ScktComp that loops Line:1538)
    The DoRead and DoWrite methods then calls FServerSocket.Event correct.
    ...which calls TCustomSocket.DoEvent...
    ...which TCustomSocket.Event....
    ...which believes that the OnRead/OnWrite is nil (Which is is (?)...)
    I think that OnRead/OnWrite (Line 1600 in scktComp) should be assigned by TServerSocket or something...

    For the moment I'm too tired to dig into it...


    Bug #7; last modified: 31-Oct-98
    1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
    N/A N/A Exists Exists Exists Gotcha Gotcha Gotcha
    Internet

    Problems making ISAPI dll work with Netscape Fasttrack Server 3.0

    Description
    Posted on borland.public.delphi.internet by Yateendra Kulkarni (forwarded by Anders Melander); it has been independently confirmed

    Hi,
    I have been struggling since last few days to make my isapi dll work with netscape fasttrack server 3.0. There is a dll provided by delphi to do this. This dll is isapiter.dll.
    The isapiter.dll provided by delphi c/s 3.0 works with netscape fasttrack server 2.0. To get the new isapiter.dll upgrade delphi to version 3.02.
    It's not yet over!!! The file ns30fix.pas which contains the Netscape fasttrack 3.0 fix contains a piece of code which tries to import "servact_translate_uri" from ns_httpd30.dll. ns_httpd30.dll does not contain this function!!! However an eqivalent function "INTservact_translate_uri" exists in nshttpd30.dll. So if you have any such problems just change the code in ns30fix.pas so that it imports "INTservact_translate_uri" instead of "servact_translate_uri". Then compile the ns30fix and place the ns30fix.dcu in the lib directory of delphi. Then recompile isapiter.dpr and get the new isapiter.dll. this dll works with fasttrack 3.0!!
    While compiling isapiter.dpr do not forget to put the conditional "NETSCAPE3"

    In the mean time, the Delphi Bug List has received corrected compiled versions of these DLLs. They can be downloaded:
    isapiterns30.zip is the isapiter.dll for Netscape 3.0 servers and isapiterns35.zip is the isapiter.dll for Netscape 3.5 servers. Building these one should use the right settings:
    ns30 with delphi 3.01 & a conditional NETSCAPE3
    ns35 with delphi 4.0 & a conditional NETSCAPE35


    Bug #526; last modified: 21-Jan-99
    1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
    Unknown Unknown Unknown Unknown Exists Exists Exists Exists
    Internet - TIsapiRequest

    TIsapiRequest.ReadClient doesn't work with NSAPI

    Description
    Reported by Nicolás Aragón
    To reproduce the problem:
    Install Netscape Enterprise Server or any server (maybe FastTrack) that supports NSAPI. I've worked with NES 3.0 amd 3.5 but you'll see it doesn't matter. Upload a file larger than 48kb (through HTTP POST).

    A short background:
    Web applications made using "web broker" components (shipped with C/S edition of Delphi 3) can be plugged into either an ISAPI enabled server or Netscape servers.

    The "trick" is ISAPIter.DLL (called "Web bridge" by Borland) that interfaces your Isapi DLL with the Nsapi server.
    NSToIS.pas is one of the source files needed to build ISAPIter and has two bugs in the function TISAPISession.ReadClient.
    As stated in Delphi help: "ReadClient allows the server application to get the next chunk of information when the content of the request message is too large for the Content property".
    I've found the maximum size of Content is 48kb. When the data sent by HTTP POST is larger than this size, you must call ReadClient to retrieve the rest.

    Here's a small source code sample; it's a simplified version of what we're using (the actual code would be confusing). But if you just want to make the bug appear, I think it'll work fine.
    This can be placed in the default action handler:

    var
      Buffer: Pointer;
      nTotal: Integer;
      sContent: string;
    begin
      nTotal := Request.ContentLength;
      sContent := Request.Content;
      if Length( sContent ) < nTotal then begin
        GetMem( Buffer,nTotal ); 
        try
          if Request.ReadClient( Buffer^,nTotal ) = -1 then
            raise Exception.Create( 'Server overloaded' );
          SetLength( sContent,nTotal );
          Move( Buffer^,sContent[1],nTotal );
        finally
          FreeMem( Buffer,nTotal )
        end;
      end; 
      Response.Content := Format( 'Received %d bytes', 
                                  [ Length( sContent ) ] );
      Handled := True;
    end;
    To test it you just need a simple html code:
    <HTML>
    <form action="prupload.dll" method="post">
    <input type="file">
    <p>
    <INPUT TYPE="SUBMIT" VALUE="Send">
    </form>
    </HTML>
    And a file bigger than 48kb.
    Solution / workaround
    The problem is caused by an error in the file NSToIS.pas; function TISAPISession.ReadClient (line 521 of NSToIS.pas).
    function TISAPISession.ReadClient(Buffer: Pointer; var Size: DWORD):
    Boolean;
    var
      nBuf, nRemaining: Integer;
    begin
      LogMessage('ReadClient($%p, %d)'#13#10, [Buffer, Size]);
      nRemaining := Size;
      while nRemaining > 0 do
      begin
        with Fsn.inbuf^ do
          if pos < cursize then
          begin
            nBuf := cursize - pos;
            if nBuf > Size then nBuf := Size;
    
            { Look at this: }
            Move(inbuf[pos], Buffer, nBuf);
            { Moving the data to the pointer!
              Of course it should be:
            Move(inbuf[pos], Buffer^, nBuf); }
    
            { Now look at the following line: }
            Inc(pos, nBuf);
            { All right, but... }
    
            Dec(nRemaining, nBuf);
            Inc(Integer(Buffer), nBuf);
          end else
          begin
            nBuf := net_read(Fsn.csd, Buffer, nRemaining, NET_READ_TIMEOUT);
            if nBuf = IO_ERROR then Break;
    
            { It must be here too:
            Inc(pos, nBuf); }
    
            Dec(nRemaining, nBuf);
          end;
      end;
      if nRemaining = 0 then
        Result := True
      else Result := False;
      Size := Size - nRemaining;
    end;
    The workaround is:
    Replace line 534 of NSToIS.pas:
            Move(inbuf[pos], Buffer, nBuf);
    With:
            Move(inbuf[pos], Buffer^, nBuf);
    Add this line between lines 541 and 542 of NSToIS.pas:
            Inc(pos, nBuf);

    Bug #521; last modified: 7-Jan-99
    1.02 2.01 3.0 3.01 3.02 4.0 4.01 4.02
    N/A N/A Unknown Unknown Unknown Unknown Unknown Exists
    Internet - TNMSMTP

    Calling Disconnect when there's no active copnnection causes the component to go into an infinite loop.

    Description
    Reported by Paul Thomas Ralphs; checked by Reinier Sterkenburg
    The documentation states that calls to 'disconnect' when no connection exists does nothing. In fact, calling 'disconnect' with no connection sends the program into a never ending loop. The form still works but will not close.
    The error can be easily demonstrated in Inprise's SMTP Internet demo program. Press 'Disconnect' several times. Everything is o/k until you try to exit.
    Solution / workaround
    The only work around is to only call 'disconnect' when connected.

    Index page
    The Delphi Bug Lists are maintained by Reinier Sterkenburg, with help from the DeBug Team.
    All feedback is appreciated. See also the feedback section of the Delphi Bug List home page.