[DLL] Shellexecute aus DLL
spacer
Autor Nachricht
Hendrik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 310



BeitragVerfasst: So 11.09.11 19:06 
Betrifft: DLL
Hey!

Ich versuche aus meiner DLL heraus per Shellexecute eine Datei zu öffnen.

ausblenden Delphi-Quelltext markieren
1:
shellExecute( 0,nil, PChar(konfiguration.exe), pchar(sdaten), nil,SW_NORMAL );


Ich habe hier schon jede mögliche Kombination probiert. Offensichtlich, ist es nicht möglich, dies aus einer DLL heraus aufzurufen oder?

Habt ihr einen Tipp?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: So 11.09.11 19:29 
Du hast leider vergessen zu schreiben was passiert, welche Rückgabewerte und Fehlercodes kommen, ...

So können wir nur raten. Eine Möglichkeit wäre, dass du die Pfadangabe vergessen hast und dann natürlich im Arbeitsverzeichnis statt im Verzeichnis der Exe gesucht wird. Aber ohne mehr Informationen... :nixweiss:

Es funktioniert normalerweise jedenfalls aus der DLL genauso wie aus einer Exe direkt.

// EDIT:
Außerdem hast du als Operation/Verb nil angegeben. Es soll also nichts passieren? :gruebel:
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: So 11.09.11 20:53 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
// EDIT:
Außerdem hast du als Operation/Verb nil angegeben. Es soll also nichts passieren? :gruebel:


MSDN hat folgendes geschrieben:
NULL

The default verb is used, if available. If not, the "open" verb is used. If neither verb is available, the system uses the first verb listed in the registry.


Ansonsten aber: ich vermute auch, ein Pfad-Problem. Grade da die DLL gerne mal seltsame Arbeitsverzeichnisse ungleich dessen den ausführenden Threads haben kann, ist das sogar fast schon warhscheinlich. Wird dir aber eine ordentliche Fehlerbehandlung sagen ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: So 11.09.11 21:10 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
MSDN hat folgendes geschrieben:
NULL
[...]
Ich weiß, aber ich finds trotzdem unlogisch sich darauf zu verlassen. Denn das kann man auch ändern was standardmäßig passiert...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 310



BeitragVerfasst: Mo 12.09.11 17:21 
Hey!


Ein Blick in den Taskmanager hilft! Ich glaube, ich habe etwas ganz wesentliches vergessen!

Die Exe-Datei wird geöffnet, allerdings vom Benutzer "SYSTEM", da meine Exe-Datei, in der die DLL läuft, ein Windows Dienst ist.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 12.09.11 17:41 
Aus einem Dienst heraus läuft die Exe schlicht in einem anderen Desktop, so dass du von der Oberfläche nichts siehst.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 310



BeitragVerfasst: Mo 12.09.11 18:03 
Gibts eine andere Möglichkeit, eine Exe mit Parametern zu starten?
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15841
Erhaltene Danke: 741

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mo 12.09.11 18:51 
Ich habe das bisher immer so gemacht, dass im Kontext des Benutzers ein weiteres Programm lief, das mit dem Dienst via IPC kommuniziert und solche Befehle ausführt.

Es sollte aber auch mit CreateProcessAsUser gehen, aber beim Desktop muss ich auswendig (vom Handy aus) passen...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 2837
Erhaltene Danke: 182

Win 2000, Win XP
Delphi 7, Turbo Delphi Exp.
BeitragVerfasst: Mo 12.09.11 20:05 
Du kannst per SetThreadDesktop einen Thread auf einen anderen Desktop schieben. Wenn du danach ShellExecute ausführst, wird der neue Prozess auf diesem Desktop erstellt.
Der interaktive Desktop einer WinSta lässt sich mit OpenInputDesktop (statt OpenDesktop oben) ermitteln.

Einziges Problem: das funktioniert nicht aus Prozessen, die auf einem Secured Desktop (also "\WinLogon") laufen - mit anderen Worten: nicht aus Diensten. Du brauchst also zwangsläufig einen Prozess im User-Desktop (oder eigentlich 2, die sich gegenseitig am laufen halten). Mit diesem kannst du dann z.B. per MMF kommunizieren.


Obwohl... UltraVNC startet seinen Dienst nicht-interaktiv (geht ja auch auf neuern Windowsen nicht mehr), ist aber trotzdem in der Lage sein Tray-Icon auf meinem Desktop ("\Default") zu machen. Vielleicht da mal im Source nachlesen, wie das geht.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Ich code EdgeMonkey -~==~- #ee-lounge in Freenode
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Luckie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 11803
Erhaltene Danke: 146

WindowsXP Professional SP2
BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
BeitragVerfasst: Di 13.09.11 10:01 
user profile iconHendrik hat folgendes geschrieben Zum zitierten Posting springen:
da meine Exe-Datei, in der die DLL läuft, ein Windows Dienst ist.

Immer wieder schön, wenn solche entscheidenden Informationen mal so ganz nebenbei im Verlauf des Threads kommen. :?

_________________
Gruß Michael
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 310



BeitragVerfasst: Di 13.09.11 21:12 
CreateProcessAsUser war der richtige Ansatz! Ich habe es hinbekommen, vielen Dank!

@Luckie und alle

Sorry für die am Anfang unpräzisen Informationen. Ich war auf dem falschen Dampfer!
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home