0

呼び出しで他のプログラムにするプログラムを修正しようとしていcreateProcesます。

Brick問題は、クラスのオブジェクトをcreateProcess呼び出しのパラメーターとして渡すときです。

この方法で(メインで)オブジェクトを作成します。

char IpApplicationName[1000];

STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcessInfo;

strcpy(IpApplicationName, "c:\\Documents and Settings\\Eigenaar\\Bureaublad\\BluetoothTestr\\recvProc\\bin\\Debug\\recvProc.exe");

//set up the NXT
Connection *connection = new Bluetooth();
Brick *nxt = new Brick(connection);
char *nxt_ptr = (char *)&nxt;

次に、次のように接続します (6は Bluetooth ドングルの通信ポートです)。

connection->connect(6);

CreateProcess(IpApplicationName, nxt_ptr, NULL, NULL, FALSE,    CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo, &ProcessInfo);

これはすべて正常に機能すると思いますが、問題は、次のようにプロセスでクラスにchar*バックキャストする場合です。BrickrecvProc.exe

Brick *nxt = (Brick*)argv[0];

これにコメントすると、プログラムは正常に動作します...この行の何が問題になっていますか? または、 Connection オブジェクトを に渡す必要がありますcreateProcessか?

4

1 に答える 1

3

コマンドライン引数として、クラスへのポインターへのポインターを渡しています。これはかなりの数の点で壊れています:

  • CreateProcess の lpCommandLine 引数は、テキスト文字列を取ります。NUL バイトを埋め込むことはできません。文字列の終わりを示す NUL バイトが必要です。そのような保証は、ポインタへのポインタ、または実際にはポインタまたは一般的なあらゆる種類の非テキストデータには存在しません。
  • なんらかの奇跡によってポインタが新しいプロセスに適切に渡されたとしても、新しいプロセスには独自のアドレス空間があります。古いプロセスからのポインターはまったく使用できません。それらは、作成されたプロセスとは異なるプロセスでは意味がありません。だから議論は無意味。
  • 古いプロセスのアドレス空間にアクセスできたとしても、新しいプロセスがその作業を完了する前に、ポイント先のブリックが破棄されるのを止めるものは何もありません。
  • これらがすべて修正されたとしても、レンガへのポインターを渡し、それを通常のレンガへのポインターとして使用しようとしています。

つまり、オブジェクトをコマンドライン引数として渡すことはできません。テキストのみ。

それで、ここで何をしますか?オプションは次のとおりです。

  • 子プロセスを単独でブリックに接続します。接続を渡そうとしないでください。
  • ある種のプロトコル (stdin/stdout、または場合によっては DCOM 経由) をセットアップして、子プロセスが親の Brick オブジェクトをリモート コントロールできるようにします。
  • recvProcプロセス内で実行される DLL にします。
于 2011-07-07T22:57:51.937 に答える