So, jetzt gehts los ... ich und
API und obendrauf noch C Syntax. Da habe ich mir was vorgenommen
Zum Verständnis für Diejenigen, die auch einmal Daten zwischen Terminalserver und Terminalclient über Virtual Channels austauschen müssen, hier einmal knapp die grobe Funktion.
Die um VirtuelChannels nutzen zu können, wird auf den Terminalclient eine
DLL als Addin an den Terminalclient gebunden. Diese
DLL wird dem Terminalclient über einen RegistryKey bekanntgegeben und geladen, sobald eine Terminalsitzung aufgebaut wird. Der Client initialisiert den/die Virtual Channel. Auf den Terminalserver läuft eine kleine Applikation in der Clientsitzung, die den Virtual Channel öffnet.
Sobald ein Kanal steht können beide Seiten (Server-Applikation und Client-Addin) mit WTSVirtualChannelRead / WTSVirtualChannelWrite über diesen Kanal Daten austauschen. Insgesamt können bis max. 28 VChannels geöffnet werden.
Jetzt zu meinem ersten Problem:
Um das Terminalserverhandle herauszufinden (benötigt um mit WTSEnumerateSessions die aktuellen SitzungsID zu ermitteln) werden die beiden
DLL-Funktionen WTSOpenServer und WTSCloseServer aus der wtsapi32.dll benötigt.
Die
DLL habe ich dynamisch geladen und die
DLL Funktionen in der Server-Applikation wie folgt zugewiesen:
Delphi-Quellcode:
type
TWTSAPI32_WTSOpenServer=function (pServerName:Pointer):THandle; stdcall;
TWTSAPI32_WTSCloseServer=procedure (hServer:Pointer); stdcall;
...
private
WTSAPI32_WTSOpenServer:TWTSAPI32_WTSOpenServer;
WTSAPI32_WTSCloseServer:TWTSAPI32_WTSCloseServer;
var
implementation
...
@WTSAPI32_WTSOpenServer := GetProcaddress(HDL_WTSAPI32_DLL,pchar('WTSOpenServer'));
if @WTSAPI32_WTSOpenServer = NIL then
begin
log.lines.add('WTSAPI32.DLL - Funktion WTSOpenServer wurde nicht gefunden oder ist falsch deklariert');
end
else begin
log.lines.add('WTSAPI32.DLL - Funktion WTSOpenServer erfolgreich initialisiert');
end;
@WTSAPI32_WTSCloseServer := GetProcaddress(HDL_WTSAPI32_DLL,pchar('WTSCloseServer'));
if @WTSAPI32_WTSCloseServer = NIL then
begin
log.lines.add('WTSAPI32.DLL - Prozedur WTSCloseServer wurde nicht gefunden oder ist falsch deklariert');
end
else begin
log.lines.add('WTSAPI32.DLL - Prozedur WTSCloseServer erfolgreich initialisiert');
end;
...
WTSCloseServer wird erfolgreich zugewiesen, WTSOpenServer jedoch nicht.
Laut
MSDN ist WTSOpenServer so deklariert...
Delphi-Quellcode:
HANDLE WTSOpenServer(
LPTSTR pServerName
);
Was ist hieran falsch ?
TWTSAPI32_WTSOpenServer=function (pServerName:Pointer):THandle; stdcall;
Schöne Grüße,
Jens