[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]

    (*
    From: ROBIN@plato.ucsalf.ac.uk (Robin Bowes)

    I'm trying to call a function in a Windows .dll from
    Turbo Pascal for Windows v1.5.

    The .dll in question is NETAPI.DLL.  The function I want to call is
    defined as follows (in C format):

    (from Microsoft LAN Manager Programmer's Reference, )

    NetWkstaGetInfo ( const char far *  pszServer,
           short      sLevel,
           char far *    pbBuffer,
           unsigned short   cbBuffer,
           unsigned short far * pcbTotalAvail
          );

    where

    pszServer
     contains the name of the server on which to execute NetWkstGetInfo.

    sLevel
     specfies the level of detail to be supplied in the return buffer

    pbBuffer
     points to the buffer in which data is returned

    cbBuffer
     specifies the size of the buffer pointed to by pbBuffer

    pcbTotalAvail
     points to an unsigned integer in which the number of bytes of
     information available is returned.

    The detail level I require is 10 which means that the buffer returned
    will contain a wksta_info_10 structure which is defined as follows:

    struct wksta_info_10 {
     char far *  wki10_computername;
     char far *  wki10_username;
     char far *  wki10_langroup;
     unsigned char wki10_ver_major;
     unsigned char wki10_ver_minor;
     char far *  wki10_logon_domain;
     char far *  wki10_oth_domains;
    };

    I am having trouble getting this function to work.  It will be a .dll
    eventually but for now I'm jsut coding it as a program using WinCrt.

    My code so far looks something like this:
    *)
    program Username;

    uses WinTypes, WinCrt;

    const
     NERR_BufTooSmall = 2123;
      NERR_Success   = 0;

    type
     Wksta_info_10 =
      record
       wki10_computername : pChar;
       wki10_username   : pChar;
       wki10_langroup   : pChar;
       wki10_ver_major   : Byte;
       wki10_ver_minor   : Byte;
       wki10_logon_domain : pChar;
       wki10_oth_domains  : pChar;
      end;
     pWksta_info_10 = ^Wksta_info_10;

    function NetWkstaGetInfo( pszServer     : pChar;
                 sLevel      : Integer;
                 var pbBuffer   : pWksta_info_10;
                 cbBuffer     : Word;
                 var pcbTotalAvail : pWord
                ) : Integer; far; external 'NETAPI';

    function getUsername(var Username : pChar) : Integer;
    var
     pWI        : pWksta_info_10;
     sWorkStationInfo : Word;
     pbBufLen     : pWord;
     pbTotalAvail   : pWord;
     uRetCode     : Integer;

    begin
     {first call will fail but should return the size of the
     buffer needed to hold all the available data}
     getMem(pbBufLen, sizeOf(pbBufLen));
      pwI := nil;
     uRetCode := NetWkstaGetInfo(nil,   {Servername (nil -> local machine)}
                   10,    {Reporting level}
                   pWI,   {target buffer for info}
                   0,    {Size of target buffer}
                   pbBufLen {Count of bytes available}
                   );
     {check the return code from the function}
     if (uRetCode = NERR_BufTooSmall) then
      { check available memory }
      begin
      if maxAvail < pbBufLen^ then
       begin
       getUsername := -1;
          Exit
       end
        else
       {allocate memory for buffer to hold information}
       begin
       getMem(pWI, pbBufLen^)
       end
      end
     else
       {Unexpected error returned}
      begin
        {Pass return code back to calling program}
      getUsername := uRetCode;
      Exit
      end;

     {second call to get information}
     getMem(pbTotalAvail, sizeOf(pbTotalAvail));
     uRetCode := NetWkstaGetInfo(nil, 10, pWI,  pbBufLen^, pbTotalAvail);
     getUsername := uRetCode;
     if uRetCode = NERR_Success then
       begin
      Username := pWI^.wki10_username;
      end;
     freeMem(pbBufLen, sizeOf(pbBufLen));
     freeMem(pbTotalAvail, sizeOf(pbTotalAvail))
    end;

    {exports
     getUsername  index 1;}

    var
     retVal : Integer;
     uName : pChar;

    begin
    getMem(uName, sizeOf(uName));
    retVal := getUserName(uName);
    if retVal = NERR_Success then
     writeln(uName)
    else
     writeln('Error returned: ', retVal);
    freeMem(uName, sizeOf(uName));
    end.
    {

    This compiles OK but throws a GPF in NETAPI.DLL.

    I'm fairly sure it's the conversion of the structure type that's causing
    the problem.

    Has anybody got any ideas ?

    }

[Back to NETWORK SWAG index] [Back to Main SWAG index] [Original]