Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Ich versuche gerade die ganze Zeit mit Borland C++ Builder 5 Standart ein kleines Progrämchen zu erstellen, daß auf die Funktionen einer DLL zugreift. Bei der DLL handelt es sich um die "WTsapi32.dll". Dabei handelt es sich um eine DLL, die Funktionen für den Terminalserver untr Win2K Server liefert.

Das EndZiel ist es, die IP oder den namen des Clients der aktiven Verbindung auszulesen.

Mein Code:

typedef bool (WINAPI *funktion1)(LPTSTR);


     //DLL laden

     HMODULE   hDll;

     funktion1 f1;

     hDll = LoadLibrary("WTsapi32.dll");

     if(hDll == NULL)

     {

         Application->MessageBox( "WTsapi32.dll nicht gefunden.",

                       "DLL - Fehler", MB_OK );

         return;

     }

     //Adresse der Funktion ermitteltn

     f1 = (funktion1)GetProcAddress(hDll,"WTSOpenServer");

     //Funktion aufrufen

     if(f1 == NULL)

     {

               Application->MessageBox( "Open-Funktion nicht gefunden!",

                       "DLL - Fehler", MB_OK );

                       FreeLibrary( hDll );

                       return;

     }

     f1("WTS_CURRENT_SERVER_HANDLE");

     //Die DLL freigeben

     FreeLibrary( hDll );

Die DLL scheint der noch zu laden, weil keine Fehlermeldung kommt. Wenn er aber die Funktion Suchen soll, bekommt er als Ergebnis NULL raus. Wiso?

Die DLL bietet zwei Versionen dieser Funktion an, eine für ANSI und eine für UNICODE. Die Namen sind WTSOpenServerA bzw. WTSOpenServerW. Den Typ des Parameters musst du dann entsprechend auf LPSTR bzw. LPWSTR ändern.

So etwas kannst du mit Depends oder einem ähnlichen Tool leicht selbst herausfinden.

Und da das ganze nichs mit Standard-C++ zu tun hat:

--> Verschoben.

Wie gut, daß das nicht in der MSDN steht.:eek:

Ok, so weit so gut.

Funktion wird gefunden, ich kann mich anscheinend mit dem Server mit der Funktion "WTSOpenServerA" verbinden.

Allerdings macht mir die Funktion "WTSQuerySessionInformationA" immer noch Probleme. Ich vermute das liegt entweder an den Pointern oder an den Parametern, weil ich, wenn ich den Rückgabewert ausgebe, nur Kraut und Rüben zurückbekomme.

typedef HANDLE (_stdcall *funktion1)(LPTSTR);

     typedef void (_stdcall *funktion2)(LPTSTR);

     typedef bool (_stdcall *funktion3)(HANDLE,DWORD,DWORD,LPTSTR*,DWORD*);

     LPTSTR* add;

     DWORD* size;

     HMODULE hDll = LoadLibrary("WTsapi32.dll");

     if(hDll == NULL)

     {

         Application->MessageBox( "WTsapi32.dll nicht gefunden.",

                       "DLL - Fehler", MB_OK );

         return;

     }

     funktion1 f1 = (funktion1)GetProcAddress(hDll,"WTSOpenServerA");

     funktion2 f2 = (funktion2)GetProcAddress(hDll,"WTSCloseServer");

     funktion3 f3 = (funktion3)GetProcAddress(hDll,"WTSQuerySessionInformationA");

     if(f1 == NULL)

     {

               Application->MessageBox( "Open-Funktion nicht gefunden!",

                       "DLL - Fehler", MB_OK );

                       FreeLibrary( hDll );

                       return;

     }

     if(f2 == NULL)

     {

               Application->MessageBox( "Close-Funktion nicht gefunden!",

                       "DLL - Fehler", MB_OK );

                       FreeLibrary( hDll );

                       return;

     }

     if(f3 == NULL)

     {

               Application->MessageBox( "Info-Funktion nicht gefunden!",

                       "DLL - Fehler", MB_OK );

                       FreeLibrary( hDll );

                       return;

     }

     f1("WTS_CURRENT_SERVER_HANDLE");

     f3("WTS_CURRENT_SERVER_HANDLE",-1,10,add,size);

     LabelInfo->Caption = *add;

     //Label1->Caption = size;

     f2("WTS_CURRENT_SERVER_HANDLE");

     //Die DLL freigeben

     FreeLibrary( hDll );

Original geschrieben von GambaJo

Wie gut, daß das nicht in der MSDN steht.:eek:

Also in meiner MSDN Library steht:

Unicode: Implemented as Unicode and ANSI versions.

Allerdings macht mir die Funktion "WTSQuerySessionInformationA" immer noch Probleme. Ich vermute das liegt entweder an den Pointern oder an den Parametern, weil ich, wenn ich den Rückgabewert ausgebe, nur Kraut und Rüben zurückbekomme.

...

DWORD* size;

Laut MSDN Library soll als letzter Parameter die Adresse einer Variablen übergeben werden. Es wäre also wohl gut, wenn dieser Zeiger auf eine gültige DWORD-Variable zeigen würde, und nicht irgendwohin, wie das ein uninitialisierter Zeiger nun mal tut. ;)

Du solltest auch den Rückgabewert der Funktionen prüfen.

Original geschrieben von Klotzkopp

Also in meiner MSDN Library steht:

Unicode: Implemented as Unicode and ANSI versions.

Jetzt seh eich es auch. Wußte nur nicht, daß es bedetet, daß es dann mehrere gibt, die auch verschieden heißen. Ist ja auch wurscht.

Original geschrieben von Klotzkopp

Laut MSDN Library soll als letzter Parameter die Adresse einer Variablen übergeben werden. Es wäre also wohl gut, wenn dieser Zeiger auf eine gültige DWORD-Variable zeigen würde, und nicht irgendwohin, wie das ein uninitialisierter Zeiger nun mal tut. ;)

Du solltest auch den Rückgabewert der Funktionen prüfen.

*AufDieStrinHau*

Ist schon was länger her mit C++ und Pointern. Da lob ich mir Java.

Wie auch immer, Du hast mir sehr geholfen, thx.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.