0

Java からこのメソッドを呼び出す方法:

 WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

java から WinMain を呼び出すことは可能ですか? その関数の引数の値を、C++ プログラムを直接実行するときと同じにしたい。.dllこの関数をエントリポイントとする a をリンクしたい。

4

2 に答える 2

3

複数の理由から、これは悪い考えです。

WinMain特別です

mainやのようDllMainに、これらの関数には見かけ以上の意味があります。

単純なアプローチとWinMainは反対に、スタックの「最初の」関数ではありません。これは、コード開発者が記述できる最初の関数です。しかし、デバッグに入ると、前後に多くのことが行われていることがわかりますWinMain

その中には、C++ グローバル オブジェクトの構築/破棄、atexitC API に登録された関数などがありますが、Windows プラットフォームに固有の多くのことが起こっていることは確かです。

次に、それが の場合、WinMain内部のどこかにメッセージ ループがある可能性があります。それはあなた自身のものと干渉する可能性があります (あなたの Java アプリケーションは GUI アプリですか?)

HINSTANCE はオプションではありません

どのパラメータ値を指定しますWinMainか?

最初の HINSTANCE パラメータは非常に重要で、起動しようとしている実行可能ファイルのコードで使用される可能性があります。ランダムな値をフィードして、それが機能することを期待することはできません。Java プロセスの HINSTANCE を取得することもできますが、結果が気に入らないのではないかと思います。

隠し変数はオプションではありません

プログラムの WinMain の呼び出しに成功したとしましょう。このプログラムは、そこにいくつかのものがあることを期待します (WinMain特別なセクションを参照してください)。その中にはGetCommandLine()、C++ プログラムで使用できる API 関数の結果があります。

WinMain はプロセス用であり、DLL 用ではありません

java から WinMain を呼び出すことは可能ですか? その関数の引数の値を、C++ プログラムを直接実行するときと同じにしたい。この関数をエントリ ポイントとする .dll をリンクしたい

エントリポイントが WinMain である DLL を「起動」しようとしていますか? どこかで何かが間違っていると思います。WinMainまたはmain、DLL ではなくプロセスの Windows の標準エントリポイントです。DLL エントリ ポイントは通常DllMain、異なるプロトタイプを持つものです。

結論

Javaランチャーと同じプロセスで実行可能ファイルを起動する必要がある理由はわかりませんが、何か間違っていると思います。

mikeraが回答で書いたように、Java API を使用してプロセスを起動することをお勧めします

于 2012-05-29T12:32:50.493 に答える
2

JNAを介して可能になるはずです:

しかし、それでも私にはデザインの匂いがするように思えます... なぜ、Java プログラムから WinMain (標準の Windows アプリケーション エントリ ポイント) を呼び出したいのでしょうか? 代わりにRuntime.exec()だけではないのはなぜですか?

于 2012-05-29T11:58:21.437 に答える