1

ここに投稿するのは初めてです。

私は borland c++ を使用して小さなアプリケーションを構築しました。このアプリケーションは、商用のサード パーティ アプリケーションによってシェル コマンドを介して実行されます。この 2 番目のアプリは、アプリから終了コードを受け取るまで待機します。私がやりたかったことは、終了コードを模倣するためにメッセージ wm_copydata を送信して、2 番目のアプリに「0」または「1」を送信することです。アプリを終了せずに終了コードを送信したいので、このようにしています! これは可能ですか?

問題は、データが到着せず、2 番目の受信アプリによって処理されないことです。2 番目のアプリが wm_copydata メッセージを処理するコードを実装しているかどうかは実際にはわかりません。

私たちの部門で、さまざまなベンダーのさまざまなソフトウェアを相互接続するアプリケーションを構築しようとしているので、ご協力をお願いします。私が使用しているコードは次のとおりです。

void SendMyMessage(char* command)
{
HWND Hamilton_Window_Handle;
int len;
char title[254];
AnsiString stemp;
AnsiString hname = "HAMILTON RUN CONTROL";
Hamilton_Window_Handle = FindWindow(0,0);
while (Hamilton_Window_Handle != 0)
    {
    len = GetWindowText(Hamilton_Window_Handle, title, 255);
    stemp = UpperCase(title);
    if (AnsiPos(hname, stemp) > 0)
            {break;}
    Hamilton_Window_Handle = GetWindow(Hamilton_Window_Handle, GW_HWNDNEXT);
    }

COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = strlen(command) +1;
cds.lpData = command;
SendMessage(Hamilton_Window_Handle, WM_COPYDATA, 0, (LPARAM)&cds);
if(AnsiString(command) == "1")
    {
    Form1->Label1->Caption="Barcodes passed consistency check!";
    Form1->Label1->Font->Color = clGreen;
    }
else
    {

    Form1->Label1->Caption="Barcodes failed consistency check!";
    Form1->Label1->Font->Color = clRed;
    }
}
4

2 に答える 2

0

@Adrianoが言ったことに加えて、生成されたプロセスは、最初にそれ自体を終了することなく、起動プロセスに終了コードを返すことはできません。結局のところ、それが終了コードと呼ばれる理由です。プロセスが終了するまで、Windows はプロセスの終了コードを認識しません。

于 2012-06-14T23:36:21.247 に答える
0

要するに:いいえ、それは不可能です。WM_COPYDATAあるアプリケーションから別のアプリケーションにデータを渡すことを目的としていますが、両方のアプリケーションがこのメッセージを認識して使用する必要があります。さらに、データのインターフェイスを共有する必要があります。プロセスの終了コードとこのメッセージは無関係であるため、自動ではなく、そうであると想定することはできません (アプリケーションがプロセスを終了するのを待つ場合、なぜそれを受け入れる必要があるのWM_COPYDATAでしょうか? そのメッセージを受け入れる場合、どのような構造で、どのような目的で?) . たとえば、コマンド ライン パラメータではなく、アプリケーションが WM_COPYDATA を受け入れると誰かが想定している場合のイメージ。そういう意味でメッセージを扱っていますか?

必要になるのは、fork()Unix で使用できるコマンドです。Windows はこの機能を提供していません。 を使用してその動作を模倣することはできますNtCreateProcess()が、非常にトリッキーになる可能性があります (複雑な GUI と統合する方法はわかりません)。

考えられる解決策は、共有メモリを作成し、そこにすべてのプライベート データをコピーして、別のプロセスを実行することです。次に、2 番目のプロセスが共有メモリからその状態を読み取ることができますが、最初のプロセスは適切な終了コードで単純に終了します。

于 2012-06-14T20:37:14.443 に答える