从Java调用WinMain:可能吗?还有别的办法吗?
如何从java调用此方法:从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应用程序入口点)?为什
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部分)。其中,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部分)。其中,WinMain
或main
是Windows上进程的标准入口点,而不是DLL。DLL入口点通常是具有不同原型的DllMain
结论
我不知道为什么您需要在与Java启动器相同的过程中启动可执行文件,但我相信您做错了什么
正如在他的文章中所写,您最好使用Java API来启动一个进程。可能需要创建一个包装器。只要使用JNA——那么就不需要使用包装器。@装满鳗鱼的气垫船我想使用JNI。原因之一是我不知道JNA可能必须创建包装器。只需使用JNA——那么就不需要使用包装器。@装满鳗鱼的气垫船我想使用JNI。原因之一是我不知道JNARuntime.exec():我不想启动单独的进程,但想在
dll
和java
程序之间进行通信除非我错了,WinMain前后都有很多代码,所以直接调用WinMain至少会让一些全局