Einzelnen Beitrag anzeigen

jensw_2000
(Gast)

n/a Beiträge
 
#6

Re: Datenaustausch (Message o.Ä.) von Terminalserver an Clie

  Alt 20. Sep 2005, 23:00
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
  Mit Zitat antworten Zitat