XE7: EXE-Datei in Anwendung "einbetten"
-
Hallo,
ich möchte mit C++ Builder XE7 eine EXE-Datei in ein TPanel "einbetten". Also z.B. Notepad. In C# geht das ja ganz einfach:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Process p = Process.Start("notepad.exe"); p.WaitForInputIdle(); SetParent(p.MainWindowHandle, panel1.Handle); } [DllImport("user32.dll")] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); } }
Danke schonmal im Voraus!
-
Damit wird keine EXE-Datei eingebettet, sondern ein Fenster!
Und das geht in C++ ja noch direkter als in C#, da kein P/Invoke benötigt wird.
Binde einfach die "windows.h" ein und rufe SetParent() auf.
Um einen Process zu starten, kannst du CreateProcess oder ShellExecute() aufrufen...
Und - oh wunder - auch WaitForInputIdle gibt es
-
@OP:
Ja und? Codeschnispel hinwerfen und drauf warten, dass es dir jemand programmiert?
-
@DocShoe Hä? Hat @OP seinen Post etwa gelöscht?
-
@DocShoe Über ein Code-Beispiel wäre ich aber trotzdem dankbar.
-
-
LuksSoftware schrieb:
@DocShoe Hä? Hat @OP seinen Post etwa gelöscht?
Der OP bist du.
Außerdem finde ich das mit dem Einbetten eine furchtbare Idee. Sag doch mal, warum du meinst, du bräuchtest das.
-
[quote="audacia"]
LuksSoftware schrieb:
Außerdem finde ich das mit dem Einbetten eine furchtbare Idee. Sag doch mal, warum du meinst, du bräuchtest das.
Dem schliesse ich mich an. Sowas macht man nur in absoluten Ausnahmefällen und wenn einem nach "jahrelangem" Grübeln nichts Besseres eingefallen ist.
-
Hallo,
was ist das fuer eine Diskussion. Die einzig brauchbaren Antworten waren der Verweis auf CreateProcess, WaitForInputIdle und SetParent (die sich ja einfach von dem NET-Schnipsel uebertragen lassen).
Da fehlt aber noch
p.MainWindowHandle
.
Und das muss man dann scheinbar so machen: http://stackoverflow.com/questions/1888863/how-to-get-main-window-handle-from-process-idund ob einem dann die Definition von
BOOL is_main_window(HWND handle) { return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle); }
gefaellt, ist eine ganz andere Frage (Abhaengig von der Anwendung).
Bitte nach WinApi verschieben, hat nichts mit VCL zu tun.
-
Das Handle bekommt man ja auch über die VCL mit TApplication::Handle. Es geht natürlich auch alles mit WinAPI.
-
Und wie deklariere ich bitte den Prozess? System::Diagnostics::Process^ p = [...] gibt's ja im C++ Builder nicht. Vielleicht ja mit ShellExecute(), aber wie muss ich das schreiben? Entschuldigt mich, ich bin ziemlich schlecht in C++.
-
Zu ShellExecute und Konsorten gibt es einen Eintrag in der FAQ
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39256.html