Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   JEDI API für Delphi XE2 (https://www.delphipraxis.net/163085-jedi-api-fuer-delphi-xe2.html)

hesch21 15. Sep 2011 09:03

JEDI API für Delphi XE2
 
Guten Morgen

ich habe soeben Delphi XE2 gekauft weil ich schon seit langem einen Dienst, der mit einem Treiber kommuniziert, auch in einer 64-Bit-Version haben sollte. Nach einigen Mühen habe ich sogar geschafft, auch die JEDI-JCL/JVCL-Komponenten zu installieren.
Nun stehe ich aber mit dem JEDI-API (aktuelle Version von SourceForgeNet) an. Ich bekomme beim Compile zuerst eine Fehlermeldung
JwsclLsa.pas(111): E2010 Inkompatible Typen: 'Cardinal' und 'NativeUInt'
(Zeile 111, property LsaHandle: Cardinal Read fLsaHandle; )

Wenn ich hingehe und einfach mal probehalber das 'Cardinal' in 'Handle' ändere, läuft mir Kompilation weiter bis zum Fehler
JwsclLsa.pas(481): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Auch da wieder führt ein probehalbes Ändern von hToken: TJwTokenHandle; zu hToken : Handle; scheinbar zu Erfolg. Doch dann steht die Umwandlung auf JwslToken.pas an, vermutlich als Folgefehler meiner 'Anpassungen' in JwsclLsa.pas. Der Fehler ist dann folgender:
JwsclToken.pas(3195): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Derselbe Fehler wiederholt sich auf Zeilen 3256, 3298, 3452, 3454, 3461, 3501, 3502, 3509, 3628, 3691 und 3735.

Da habe ich dann meine Versuche abgebrochen.

Nun meine Fragen:
- hat es jemand gescchafft, die JEDI-API auf Delphi-XE2 zu installieren?
- wenn nein, weiss jemand, wann man mit einer kompatiblen Version rechnen kann?
- Gibt es etwas anderes 'gescheites' um aus einem Service eine Desktop-Applikation als System-User zu pushen, so dass diese auf jeden möglichen Desktop angezeigt wird. Falls das jemand interessiert, hier die Funktion, welche auf W-XP oder W-7 auf 32-Bit-Maschinen perfekt funktioniert.

Besten Dank für Eure Antworten

Code:
{Starter of Notify program}
procedure TAMNotifier1.StartApp(const App, Parameters, CurDir : TJwString);
var
   pi             : PROCESS_INFORMATION;
   si             : STARTUPINFO;
   dwSessionId    : DWORD;
   winlogonPid    : DWORD;
   hUserToken     : THANDLE;
   hUserTokenDup  : THANDLE;
   hPToken        : THANDLE;
   hProcess       : THANDLE;
   hsnap          : THANDLE;
   dwCreationFlags : DWORD;
   procEntry      : TPROCESSENTRY32;
   winlogonSessId : DWORD;
   tp             : TOKEN_PRIVILEGES;
   lpenv          : pointer;
   err            : boolean;
   pCurDir        : TJwPChar;
   pCmdLine       : TJwPChar;
begin
  pCmdLine        := TJwPChar('"'+App+'" ' + Parameters);
  pCurDir         := Nil;
  if Length(CurDir) > 0 then
     pCurDir := TJwPChar(CurDir);
  dwSessionId := WTSGetActiveConsoleSessionId();
  hSnap      := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnap = INVALID_HANDLE_VALUE) then
      exit;
  procEntry.dwSize := sizeof(TPROCESSENTRY32);
  repeat
     if (comparetext(procEntry.szExeFile, 'winlogon.exe') = 0) then
        begin
        winlogonSessId := 0;
        if (ProcessIdToSessionId(procEntry.th32ProcessID, winlogonSessId)
           and (winlogonSessId = dwSessionId)) then
           begin
           winlogonPid := procEntry.th32ProcessID;
           break;
           end;
        end;
  until (not Process32Next(hSnap, procEntry));
  WTSQueryUserToken(dwSessionId, hUserToken);
  dwCreationFlags := NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE;
  ZeroMemory(@si, sizeof(STARTUPINFO));
  si.cb       := sizeof(STARTUPINFO);
  si.lpDesktop := 'winsta0\Winlogon';
  ZeroMemory(@pi, sizeof(pi));
  hProcess    := OpenProcess(MAXIMUM_ALLOWED,FALSE,winlogonPid);
  if(not OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY
     or TOKEN_DUPLICATE or TOKEN_ASSIGN_PRIMARY or TOKEN_ADJUST_SESSIONID
     or TOKEN_READ or TOKEN_WRITE, hPToken)) then
     Err := True;
  if (not LookupPrivilegeValue(nil,SE_DEBUG_NAME,tp.Privileges[0].Luid)) then
     Err := True;
  tp.PrivilegeCount := 1;
  tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  DuplicateTokenEx(hPToken,MAXIMUM_ALLOWED,Nil,
           SecurityIdentification,TokenPrimary,hUserTokenDup);
  SetTokenInformation(hUserTokenDup,
          TokenSessionId,pointer(dwSessionId),sizeof(DWORD));
  if (not AdjustTokenPrivileges(hUserTokenDup,FALSE,@tp,sizeof(TOKEN_PRIVILEGES),
          nil,nil)) then
     Err := True;
  if (GetLastError() = ERROR_NOT_ALL_ASSIGNED) then
     Err := True;
  lpEnv := nil;
  if(CreateEnvironmentBlock(lpEnv,hUserTokenDup,TRUE)) then
     dwCreationFlags := dwCreationFlags or CREATE_UNICODE_ENVIRONMENT
  else
    lpEnv := nil;
  CreateProcessAsUser(hUserTokenDup,TJwPChar(App), pCmdLine,
      nil, nil, FALSE, dwCreationFlags, lpEnv, pCurDir, si, pi );
  CloseHandle(hProcess);
  CloseHandle(hUserToken);
  CloseHandle(hUserTokenDup);
  CloseHandle(hPToken);
end;

ddcool 2. Nov 2011 11:22

AW: JEDI API für Delphi XE2
 
Same problem here... :)

kuba 12. Nov 2011 13:03

AW: JEDI API für Delphi XE2
 
geht auch bei mir nicht :cry:

gibts da schon was neues ??

kuba

chaosben 12. Nov 2011 16:36

AW: JEDI API für Delphi XE2
 
Also die Jedi-Windows-API aus dem SVN-Trunk lässt sich unter XE2 kompilieren.

Die Jedi-Security-Lib hat sich imho bisher noch keiner zur Brust genommen. Das könnte sich ändern, sobald mein XE2 auf Arbeit eintrifft.

kuba 17. Nov 2011 17:17

AW: JEDI API für Delphi XE2
 
aber bei 64 Bit stolpert der Compiler über Assembler Code...

[DCC Fehler] JwaWinNT.pas(9651): E1025 Sprach-Feature wird nicht unterstützt: 'ASM'

kuba

daywalker9 17. Nov 2011 17:46

AW: JEDI API für Delphi XE2
 
Hast Du den Compilerschalter DYNAMIC_LINK definiert?

Wenn ja, nehm den mal raus.

chaosben 18. Nov 2011 05:46

AW: JEDI API für Delphi XE2
 
Zitat:

Zitat von kuba (Beitrag 1136744)
aber bei 64 Bit stolpert der Compiler

Hast du auch den svn-trunk genommen? Der läuft bei mir 1a.

kuba 18. Nov 2011 07:20

AW: JEDI API für Delphi XE2
 
Hallo,

den Compilerschalter DYNAMIC_LINK kann ich nirgends in den Projektoptionen finden. Den SVN-trunk habe ich mir hier heruntergeladen.

Meine Pfade (64-Bit):

C:\jedi-apilib\jwapi\branches\2.3\Win32API\jwaWindows;
C:\jedi-apilib\jwapi\branches\2.3\Win32API;
C:\jedi-apilib\jwapi\branches\2.3\Packages;
C:\jedi-apilib\jwapi\branches\2.3\Common;
C:\jedi-apilib\jwapi\branches\2.3\Includes;

Habe auch diese ausprobiert:

C:\jedi-apilib\jwapi\trunk\Win32API\jwaWindows;
C:\jedi-apilib\jwapi\trunk\Win32API;
C:\jedi-apilib\jwapi\trunk\Packages;
C:\jedi-apilib\jwapi\trunk\Common;
C:\jedi-apilib\jwapi\trunk\Includes;

In der JediAPILib.inc habe ich folgende Zeile geändert (ging sonst gar nicht):

{$I ..\includes\jproject\jedi.inc}

geändert in:

{$I jedi.inc}

Was läuft falsch ??

kuba

chaosben 19. Nov 2011 07:40

AW: JEDI API für Delphi XE2
 
Hmmm .. also wenn, dann kann es nur mit dem 2. Pack an Pfaden funktionieren.

Leider hab ich im Moment kein XE2 zur Hand. Sobald ich es aber habe, werd ich mich mit deinem Problem befassen.

kuba 19. Nov 2011 13:14

AW: JEDI API für Delphi XE2
 
im trunk fehlt die Jedi.inc komplett.

kuba


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz