home *** CD-ROM | disk | FTP | other *** search
- (*
- 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 ?
-
- }