从Java调用WinMain:可能吗?还有别的办法吗?

从Java调用WinMain:可能吗?还有别的办法吗?,java,c++,winapi,java-native-interface,winmain,Java,C++,Winapi,Java Native Interface,Winmain,如何从java调用此方法: WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 可以从java调用WinMain吗?我希望函数中的参数值与直接运行C++程序时的值相同。我想链接一个入口点是此函数的.dll。应该可以通过JNA: 然而,对我来说,这仍然是一种设计的味道。。。。。为什么要从Java程序调用WinMain(标准Windows应用程序入口点)?为什

如何从java调用此方法:

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

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

应该可以通过JNA:


然而,对我来说,这仍然是一种设计的味道。。。。。为什么要从Java程序调用WinMain(标准Windows应用程序入口点)?为什么不仅仅是它呢?

应该可以通过JNA实现:


然而,对我来说,这仍然是一种设计的味道。。。。。为什么要从Java程序调用WinMain(标准Windows应用程序入口点)?为什么不干脆用它来代替呢?

这是个坏主意,有多种原因

很特别 与
main
DllMain
一样,这些函数比表面上看起来更有发言权


与天真的方法相反,
WinMain
不是堆栈上的“第一个”函数。这是第一个可由代码开发人员编写的函数。但是如果您进入debug,您将看到在
WinMain
之前和之后发生了很多事情

其中,C++全局对象的构造/销毁、用C API注册的函数等,但是您可以确信在Windows平台上有很多特定的事件发生。 然后,如果它是一个

WinMain
,那么很可能在其中的某个地方有一个消息循环。它可能会干扰您自己的应用程序(您的Java应用程序是GUI应用程序吗?)

HINSTANCE不是可选的 您将给出哪些参数值
WinMain

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

隐藏变量不是可选的 假设您成功地调用了程序的WinMain。这个程序会有一些东西(请参阅
WinMain
is special部分)。其中, > GeTraceDeLink()/<代码> API函数的结果,可以在C++程序中使用。 WinMain用于进程,而不是DLL 可以从java调用WinMain吗?我希望函数中的参数值与直接运行C++程序时的值相同。我想链接一个.dll,它的入口点是这个函数

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

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


就像他在书中写的那样,你最好使用JavaAPI来启动一个进程。

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

很特别 与
main
DllMain
一样,这些函数比表面上看起来更有发言权


与天真的方法相反,
WinMain
不是堆栈上的“第一个”函数。这是第一个可由代码开发人员编写的函数。但是如果您进入debug,您将看到在
WinMain
之前和之后发生了很多事情

其中,C++全局对象的构造/销毁、用C API注册的函数等,但是您可以确信在Windows平台上有很多特定的事件发生。 然后,如果它是一个

WinMain
,那么很可能在其中的某个地方有一个消息循环。它可能会干扰您自己的应用程序(您的Java应用程序是GUI应用程序吗?)

HINSTANCE不是可选的 您将给出哪些参数值
WinMain

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

隐藏变量不是可选的 假设您成功地调用了程序的WinMain。这个程序会有一些东西(请参阅
WinMain
is special部分)。其中, > GeTraceDeLink()/<代码> API函数的结果,可以在C++程序中使用。 WinMain用于进程,而不是DLL 可以从java调用WinMain吗?我希望函数中的参数值与直接运行C++程序时的值相同。我想链接一个.dll,它的入口点是这个函数

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

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


正如在他的文章中所写,您最好使用Java API来启动一个进程。

可能需要创建一个包装器。只要使用JNA——那么就不需要使用包装器。@装满鳗鱼的气垫船我想使用JNI。原因之一是我不知道JNA可能必须创建包装器。只需使用JNA——那么就不需要使用包装器。@装满鳗鱼的气垫船我想使用JNI。原因之一是我不知道JNARuntime.exec():我不想启动单独的进程,但想在
dll
java
程序之间进行通信除非我错了,WinMain前后都有很多代码,所以直接调用WinMain至少会让一些全局