Zum Inhalt springen

DLL richtig aufrufen, aber wie?


GambaJo

Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 );

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...