从Java调用WinMain:可能吗?任何其他方式

Calling WinMain from Java : Possible ? Any other way?

本文关键字:任何 其他 方式 Java 调用 WinMain      更新时间:2023-10-16

我如何从java调用此方法:

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

是否可以从java调用WinMain?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个入口点是此功能的.dll

出于多种原因,这是一个坏主意。

WinMain很特别

mainDllMain一样,这些功能要说的比看起来的要多。

与幼稚的方法相反,WinMain不是堆栈上的"第一个"函数。它是代码开发人员可编写的第一个函数。但是如果你进行调试,你会发现在WinMain之前和之后发生了很多事情。

其中包括C++全局对象的构造/销毁、向 atexit C API 注册的函数等,但您可以确定那里发生了很多特定于 Windows 平台的事情。

然后,如果它是一个 WinMain ,很可能您在内部的某个地方有一个消息循环。它很可能会干扰你自己的(你的 Java 应用程序是 GUI 应用程序吗?

HINSTANCE 不是可选的

您将WinMain提供哪些参数值?

第一个 HINSTANCE 参数非常重要,可以由您尝试启动的可执行文件的代码使用。你不能只是输入一些随机值并期望它起作用。你可以检索你的Java进程的hinstance,但我怀疑你不喜欢这个结果。

隐藏变量不是可选的

假设您成功地调用了一个程序的 WinMain。该程序将期望存在一些东西(请参阅WinMain是特殊部分)。其中,GetCommandLine() API 函数的结果,可用于您的C++程序。

WinMain 用于进程,而不是 DLL

是否可以从java调用WinMain?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个入口点是此功能的.dll

您是否正在尝试"启动"一个入口点为 WinMain 的 DLL?我想某处有问题。 WinMainmain是 Windows 上进程的标准入口点,而不是 DLL。DLL 入口点通常是具有不同原型的DllMain

结论

我不知道为什么你需要在与Java启动器相同的进程中启动可执行文件,但我相信你做错了什么。

就像mikera在他的回答中写的那样,你最好使用Java API来启动一个进程。

应该可以通过 JNA 实现:

  • http://en.wikipedia.org/wiki/Java_Native_Access

然而,对我来说,它仍然像是一种设计气味.....为什么要从Java程序调用WinMain(标准的Windows应用程序入口点)?为什么不只用 Runtime.exec() 代替呢?

相关文章: