AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

Ein Thema von Memnarch · begonnen am 23. Jan 2015 · letzter Beitrag vom 12. Feb 2015
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

  Alt 23. Jan 2015, 13:31
Hi,
Ich habe gerade ein merkwürdiges Problem:
Mein Service erstellt per CreateProcessAsUser eine GUI-Applikation im Kontext des aktuell aktiven Benutzers (steht nicht zur diskussion!). Dabei habe ich festgestellt, dass ich Probleme mit Synchronize von TThread habe. Nachdem ich ein wenig nachgeforscht habe, musste ich feststellen, dass Application.Handle $0 ist. Dass dann WakeMainThread nicht geht und sich einiges weghängt ist logisch.

Aus irgendeinem grund wird TApplication.CreateHandle nicht aufgerufen, oder liefert kein Handle. Gui-Applikation ist gegen vcl und rtl packages gelinkt. Starte ich das Programm per doppelklick funktioniert alles. Andere Möglichkeit: Gegen keine Packages linken. Das geht aber aufgrund von Plugins die später geladen werden nicht (zum testen habe ich die Plugins ausgeschaltet, es ist gerade nurnoch eine nakte MainForm).

Andere Lösung, in der DPR am Anfang einfach Application.CreateHandle aufrufen. (Hab auch noch gefühlt nen anderes dutzend workarounds die tadelos gehen, ich will nur verstehen was hier passiert).

Zum aufrufen:
Nachdem der UserToken der aktiven session geholt wurde, und ein EnvironmentBlock erstellt wurde, wird folgendes aufgerufen:
CreateProceAsUser(Token, nil, CommandLine, nil, nil, False, 0, EnvironmentBlock, nil, StartupInfo, ProcessInfo) In StartupInfo ist der Desktop entsprechend auf 'Winsta0\Default' gesetzt.

Jemand eine AHnung, was das Phänomen verursachen könnte? Innerhalb von CreateHandle wird auf not IsConsole überprüft, der auffruf von CreateHandle ist mit not IsLibrary abgedeckt. Nen Grund warum die Variablen vllt innerhalb der packages gesetzt werden?

Grüße
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

  Alt 23. Jan 2015, 18:19
Erstell den Prozess mal suspended und häng dann den Delphi Debugger an. Da müsstest du ja dann sehen, welcher Aufruf mit welchem Fehlercode fehlschlägt.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

  Alt 26. Jan 2015, 09:39
Darauf war ich noch gar nicht gekommen, werd ich mir mal angucken.

EDIT: achja, es trat ja nur auf, wenn ich gegen VCL/RTL packages linke und wie soll ich die unter XE debuggen?
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden

Geändert von Memnarch (26. Jan 2015 um 09:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

  Alt 26. Jan 2015, 10:12
Mit Debug-DCUs ist das eigentlich kein Problem soweit ich mich erinnere. Aber es stimmt schon, bei Runtime Packages bin ich mir nicht ganz sicher, ich dachte ich hätte die auch schon drin gehabt.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: CreateProcessAsUser + Link gegen VCLPackage = kein Application.Handle

  Alt 12. Feb 2015, 10:27
Okay habs durch Zufall lösen können:
http://www.delphipraxis.net/1289428-post14.html

Zitat:
Meine Applikation linkt gegen PackageA(Was gegen RTL/VCL gelinkt ist). Allerdings linkt meine Applikation auch gegen MeineDll, welche auch gegen PackageA linkt. Was bedeutet das? Es zerrümpelt die Reihenfolge in der units initialisiert werden, den dadurch kommen erst die units aus den packages und dann die units aus Meiner Applikation (normalerweise ist das von der Reihenfolge in der Applikation abhängig). Deswegen war auch schon alles initialisiert bevor der erste initialisierungsblock meiner Applikation lief -.-
Das scheint auch zur folge zu haben, dass für die Packages IsLibrary gilt. Warum nur bei CreateProcessAsUser? Keine Ahnung. Jedenfalls war dass der Grund warum so einiges im argen lag.

Grüße
Memnarch
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr.
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