GambaJo Geschrieben 22. September 2003 Teilen Geschrieben 22. September 2003 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. September 2003 Teilen Geschrieben 22. September 2003 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
GambaJo Geschrieben 23. September 2003 Autor Teilen Geschrieben 23. September 2003 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 ); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. September 2003 Teilen Geschrieben 23. September 2003 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
GambaJo Geschrieben 23. September 2003 Autor Teilen Geschrieben 23. September 2003 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.