Veröffentlicht 22. September 200321 j 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?
22. September 200321 j 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.
23. September 200321 j 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 );
23. September 200321 j 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.
23. September 200321 j 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.