2009-05-11 13 views
0

Mein Chef hat eine Windows-Anwendung, die er schrieb. Es ist keine Windows-Konsolenanwendung, sondern eine Windows-GUI-Anwendung. Wir haben natürlich den Quellcode, aber er möchte nicht, dass es eine Konsolen-App ist. Er möchte, dass es eine reguläre GUI-Anwendung bleibt.Ausgabe von einer Windows-Anwendung mit PHP

Die Sache ist, er will in der Lage sein, es von PHP zu nennen, es Parameter übergeben, und die Anwendung gibt Informationen an das aufrufende PHP-Skript zurück. Ich kann problemlos Windows-Konsolenanwendungen aufrufen und die Ausgabe lesen. Ich kann sogar VBS-Skripte aufrufen und die Ausgabe von ihnen erhalten.

Aber wir sind ratlos darüber, wie man eine normale Windows-Anwendung zur Ausgabe von Daten an ein aufrufendes PHP-Skript erhält, ohne die Ausgabe in eine Textdatei zu schreiben und sie in PHP zu lesen.

Hat jemand das schaffen können? Wenn das so ist, wie?

Vielen Dank im Voraus.

Amy


Schnitt hinzuzufügen: Offenbar legte der Chef diesen Code in seiner Anwendung:

BOOL bConsole = AllocConsole(); 
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
DWORD dwCharsWritten = 0; 
string sS3Path = sCommandLine.substr(sCommandLine.find("S3://") + 5); 
string sMessage = "S3 Path: " + sS3Path; 

BOOL bWritten = WriteConsole(hOutput, sMessage.c_str(), sMessage.size(), &dwCharsWritten, NULL); 

Aber PHP nicht die Informationen ist zu sehen, dass er auf diese Konsole schreibt. Wir haben exec und shell_exec vergeblich versucht.

Antwort

0

Unsere endgültige Lösung war für meinen Chef, seine Windows-Anwendung zu ändern. Er konnte von der App aus auf die Konsole schreiben und wir konnten die Ausgabe dann auf dieser Konsole lesen.

Amy

3

Die beste Annäherung wäre hier, einen Befehlszeilenschalter hinzuzufügen, der Ihre Anwendung sich wie eine Konsolenanwendung verhalten würde, wenn sie angegeben wird, sonst GUI.

Das Abrufen von Informationen aus einer GUI-Anwendung ist nicht möglich, es sei denn, es wird eine Ausgabe über die Standardausgabe oder eine Datei gesendet.

+1

Anscheinend ist nicht trivial, da die Wahl eine App als GUI-Anwendung oder als Konsolenanwendung ausgeführt werden bei Ihrer Anwendung Build-Zeit, soweit sie nicht zur Laufzeit - Sie können * wirklich * Wählen Sie basierend auf einem Befehlszeilenschalter. Siehe: http://stackoverflow.com/questions/54536/win32-gui-app-that-writes-usage-text-to-stdout-when-invoked-as-app-exe-help –

+0

Wie gesagt, benehmen Sie sich wie ... Sie können Informationen auch dann an die Standardausgabe weiterleiten, wenn es sich um eine GUI-Anwendung handelt. Das Konsolenfenster wird nicht angezeigt, aber andere Programme können die Informationen weiterhin lesen. –

3

Der beste Ansatz besteht darin, die Logik in der Windows-GUI-App ordnungsgemäß neu zu gestalten, sodass sie als COM-Komponente verfügbar gemacht wird. Die GUI-App und das PHP-Skript können die COM-Komponente aufrufen und dieselbe Logik verwenden.

In diesem Fall muss der Datenaustausch nicht und wahrscheinlich nicht per Text erfolgen. Sie können den Datenaustausch durchführen, indem Sie typisierte Eigenschaften für die COM-Komponente festlegen und lesen.

Dies ist, wofür COM bestimmt ist/war. Und PHP hat natürlich eine ausgereifte Bibliothek zum Aufruf von COM-Komponenten unter Windows.

Es ist eine wirklich schlechte Idee, eine GUI-App über eine Web-App aufzurufen. Sie fragen nach Problemen dabei. Der COM-Ansatz ist sehr bevorzugt.

Update: PHP COM DOC

0

Sie Parameter an eine Win-Formen App viel die Art und Weise passieren können Sie sich auf eine Kommandozeilen-Anwendung. Verwenden des arguments-Parameters in der main-Methode.

Dies erfordert einige Änderungen Ihrer winforms-Anwendung, aber es wird Ihnen ermöglichen, die exe von php aufrufen, einige Parameter übergeben.

Ich bin nicht sicher, was Ihre Geschäftsanforderungen sind, aber im Idealfall wird die Anwendung mit der Business-Domäne und der GUI getrennt geschrieben, da Sie wahrscheinlich diese cmd-Linie Prozess nicht alle Features der Winforms haben App, aber eher produzieren richtige Ausgabe von einigen Eingaben, sollte es nicht zu groß sein, eine CMD-Version der Anwendung zu implementieren, ohne Ihre Geschäftslogik neu zu schreiben.