C++ Builder Snippets  

Uhrzeit des Netware-Servers abfragen:
//---------------------------------------------------------------------------
// Funktion NovellTimeSync() gibt die Uhrzeit des Netware-Servers
// mit dem Namen slServerName zurück. Sollte während der Ausführung ein
// Fehler auftreten, wird TDateTime(0) zurückgeliefert.
// Parameter blSynchronize legt fest, ob die Systemuhrzeit auf des
// lokalen Rechners mit der Serverzeit abgeglichen werden soll.
//---------------------------------------------------------------------------
TDateTime NovellTimeSync(AnsiString slServerName, bool blSynchronize)
{
  bool blNoErrors = true;  // Flag "keine Fehler aufgetreten"
  TDateTime dtCurrentTime = TDateTime(0);
  // Struktur min den Datums- und Uhrzeitangaben
  // (wird gefüllt von NWGetFileServerDateAndTime())
  typedef struct
  {
    BYTE year;
    BYTE month;
    BYTE day;
    BYTE hour;
    BYTE minute;
    BYTE second;
    BYTE dayOfWeek;
  } TIMEDATE;

  // Zeiger auf die NWCallsInit-Funktion
  DWORD (__stdcall *pfNWCallsInit)(void*, void*);
  // Zeiger auf die NWGetConnectionHandle-Funktion
  DWORD (__stdcall *pfNWGetConnectionHandle)(BYTE*, WORD, DWORD*, WORD*);
  // Zeiger auf die NWGetFileServerDateAndTime-Funktion
  DWORD (__stdcall *pfNWGetFileServerDateAndTime)(DWORD, BYTE*);

  TIMEDATE           datebytes;  // für das Fileserver-Datum / Uhrzeit
  DWORD              ccode;      // für die Rückgabewerte der NW*()-Funktionen
  DWORD              connHandle; // connection handle
  char caSystemPath[MAX_PATH];   // für Windows-Systemverzeichnis

  // Funktionsnamen in der calwin32.dll
  char caNWCallsInitFunc[] = "NWCallsInit\0";
  char caNWGetConnectionHandle[] = "NWGetConnectionHandle\0";
  char caNWGetFileServerDateAndTime[] = "NWGetFileServerDateAndTime\0";

  HINSTANCE dllInstance = 0;   // handle der DLL-Instanz

  // Vorinitialisierung der Funktionszeiger
  pfNWCallsInit = NULL;
  pfNWGetConnectionHandle = NULL;
  pfNWGetFileServerDateAndTime = NULL;

  // Namen des Systemverzeichnisses ermitteln:
  GetSystemDirectory(caSystemPath, sizeof(caSystemPath));

  // calwin32.dll laden:
  if(FileExists(AnsiString(caSystemPath)+"\\calwin32.dll"))
  {
    dllInstance = ::LoadLibrary(AnsiString(
      AnsiString(caSystemPath)+"\\calwin32.dll").c_str());
  }
  else blNoErrors = false;

  if(dllInstance == NULL) blNoErrors = false;

  // Funktionszeiger initialisieren:
  if(blNoErrors)
  {
    pfNWCallsInit = (DWORD (__stdcall*)(void*, void*))(GetProcAddress(
       dllInstance, caNWCallsInitFunc));

    pfNWGetConnectionHandle = (DWORD (__stdcall*)
      (BYTE*, WORD, DWORD*, WORD*))(GetProcAddress(
       dllInstance, caNWGetConnectionHandle));

    pfNWGetFileServerDateAndTime = (DWORD (__stdcall*)(DWORD, BYTE*))
      (GetProcAddress(dllInstance, caNWGetFileServerDateAndTime));

    // Zeiger prüfen:
    if(pfNWCallsInit == NULL || pfNWGetConnectionHandle == NULL ||
       pfNWGetFileServerDateAndTime == NULL)
    blNoErrors = false;
  }

  // Initialisierung:
  if(blNoErrors)
  {
    ccode = pfNWCallsInit(NULL, NULL);
    if (ccode != 0x0000) blNoErrors = false;
  }

  if(blNoErrors)
  {
    ccode = pfNWGetConnectionHandle(slServerName.c_str(), 0, &connHandle, NULL);
    if (ccode != 0x0000) blNoErrors = false;
  }

  // Server-Uhrzeit abfragen:
  if(blNoErrors)
  {
    ccode=pfNWGetFileServerDateAndTime(connHandle, (BYTE *)&datebytes);
    if (ccode != 0x0000) blNoErrors = false;
  }

  if(blNoErrors)
  {
    dtCurrentTime = TDateTime(WORD(datebytes.year+1900),
      WORD(datebytes.month), WORD(datebytes.day)) +
      TDateTime(WORD(datebytes.hour), WORD(datebytes.minute),
      WORD(datebytes.second), 0);

    // ggf. lokale Uhrzeit setzen
    if(blSynchronize)
    {
      SYSTEMTIME dtSysTime;
      DateTimeToSystemTime(dtCurrentTime, dtSysTime);
      SetLocalTime(&dtSysTime);
    }
  }

  // DLL freigeben
  if(dllInstance != NULL)
  {
    FreeLibrary(dllInstance);
    dllInstance = NULL;
  }
  return dtCurrentTime;
}
//---------------------------------------------------------------------------



© '99-2001 by S. Kreutzmann