0

我如何从 java 调用此方法:

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

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

4

2 回答 2

3

这是一个坏主意,原因有很多。

WinMain很特别

mainor一样DllMain,这些功能比看起来要多说。

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

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

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

HINSTANCE 不是可选的

你会给什么参数值WinMain

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

隐藏变量不是可选的

假设您成功调用了程序的 WinMain。这个程序会期望一些东西在那里(见WinMain特殊部分)。其中,GetCommandLine()API 函数的结果,可以在你的 C++ 程序中使用。

WinMain 用于进程,而不是 DLL

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

您是否试图“启动”一个 DLL,其入口点是 WinMain?我猜是哪里出了问题。WinMain或者main是 Windows 上进程的标准入口点,而不是 DLL。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 回答