Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Problem mit NetServerGetInfo (https://www.delphipraxis.net/46939-problem-mit-netservergetinfo.html)

Luckie 3. Jun 2005 12:13


Problem mit NetServerGetInfo
 
Ich versuche mittels der API Funktion MSDN-Library durchsuchenNetServerGetInfo das Betriebssystem des remote Rechners zu ermitteln. Implementiert habe ich es so:

Delphi-Quellcode:
type
  TSERVER_INFO_101 = packed record
    sv101_platform_ID: DWORD;
    sv101_name: PWChar;
    sv101_version_major: DWORD;
    sv101_version_minor: DWORD;
    sv101_type: DWORD; // not yet defined here!
    sv101_comment: PWChar;
  end;
  PSERVER_INFO_101 = ^TSERVER_INFO_101;
(Die Konstanten für sv101_type habe ich noch nicht definiert, da ich sie erstmal nicht brauche.)
Delphi-Quellcode:
function NetServerGetInfo(const servername: PWChar; level: DWORD; bufptr:
  Pointer): NET_API_STATUS; stdcall;

// ...

function NetServerGetInfo; external netapi32lib name 'NetServerGetInfo';
Aufruf:
Delphi-Quellcode:
function GetRemoteOS(const Computer: WideString; var Version: string): DWORD;
var
  res: DWORD;
  s: string;
  si: Pointer;
  Major: DWORD;
  Minor: DWORD;
resourcestring
  rsUnknown = 'Betriebsystem unbekannt';
begin
  res := 0;
  si := nil;
  s := '';
  res := NetServerGetInfo(PWideChar(Computer), 101, si);
  if res = NERR_Success then
  begin
    Major := PSERVER_INFO_101(si)^.sv101_version_major;
    Minor := PSERVER_INFO_101(si)^.sv101_version_minor;
    if Major = 4 then
      s := 'Windows 95/98/ME'
    else if (Major = 4) and (Minor = 0) then
      s := 'Windows NT 4.0'
    else if (Major = 5) and (Minor = 0) then
      s := 'Windows 2000'
    else if (Major = 5) and (Minor = 1) then
      s := 'Windows XP'
    else if (Major = 5) and (Minor = 2) then
      s := 'Windows 2003 Server Family'
    else
      s := rsUnknown;
    Version := s;
  end;
  NetApiBufferFree(si);
  result := res;
end;
Das Problem: Ich bekomme eine Access Violation nach dem Aufruf der Funktion. NetServerGetInfo gibt übrigens 1241672 zurück. :gruebel:

Bernhard Geyer 3. Jun 2005 12:43

Re: Problem mit NetServerGetInfo
 
Definiere mal
Delphi-Quellcode:
si: PSERVER_INFO_101;
und aufruf mittels
Delphi-Quellcode:
res := NetServerGetInfo(PWideChar(Computer), 101, @si);

marabu 3. Jun 2005 12:45

Re: Problem mit NetServerGetInfo
 
Hallo Luckie,

du musst die Adresse der Zeiger-Variable übergeben, nicht den Inhalt.

Delphi-Quellcode:
res := NetServerGetInfo(PWideChar(Computer), 101, @si);
Freundliche Grüße vom marabu

Christian Seehase 3. Jun 2005 12:47

Re: Problem mit NetServerGetInfo
 
Moin Luckie,

probier's mal so:

Code:
res := NetServerGetInfo(PWideChar(Computer), 101, [color=red][b]@[/b][/color]si);
Bei den LAN-Manager Funktionen wird, i.d.R., die Adresse des Bufferpointers erwartet, da die Funktion ja selber den Buffer reserviert, und somit in den Wert des Pointers setzen muss.

Luckie 3. Jun 2005 14:11

Re: Problem mit NetServerGetInfo
 
Zitat:

Zitat von marabu
Hallo Luckie,

du musst die Adresse der Zeiger-Variable übergeben, nicht den Inhalt.

Delphi-Quellcode:
res := NetServerGetInfo(PWideChar(Computer), 101, @si);
Freundliche Grüße vom marabu

:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:
:wall: :wall: :wall: :wall: :wall: :wall: :wall: :wall:

Danke, das war es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz