从Java调用WinMain:可能吗?还有其他方法吗?

时间:2012-05-29 11:51:06

标签: java c++ winapi java-native-interface winmain

如何从java调用此方法:

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

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

2 个答案:

答案 0 :(得分:3)

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

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,其入口点是此函数

你是否试图“启动”一个DLL,其入口点是WinMain?我想某处出了点问题。 WinMainmain是Windows上进程的标准入口点,而不是DLL。 DLL入口点通常是DllMain,它具有不同的原型。

结论

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

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

答案 1 :(得分:2)

应该可以通过JNA:

然而,它似乎仍然是一种设计气味......为什么你要从Java程序中调用WinMain(标准的Windows应用程序入口点)?为什么不只是Runtime.exec()呢?