我如何从 java 调用此方法:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
是否可以从 java 调用 WinMain ?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个.dll
入口点是这个函数的。
我如何从 java 调用此方法:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
是否可以从 java 调用 WinMain ?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个.dll
入口点是这个函数的。
这是一个坏主意,原因有很多。
WinMain
很特别像main
or一样DllMain
,这些功能比看起来要多说。
与天真的方法相反,WinMain
不是堆栈上的“第一个”函数。它是代码开发人员可编写的第一个函数。但是如果你去调试,你会发现之前和之后发生了很多事情WinMain
。
其中,C++ 全局对象的构造/销毁、使用atexit
C API 注册的函数等,但您可以肯定那里发生了很多特定于 Windows 平台的事情。
然后,如果它是 a WinMain
,那么您很可能在内部某处有一个消息循环。它很可能会干扰您自己的(您的 Java 应用程序是 GUI 应用程序吗?)
你会给什么参数值WinMain
?
第一个 HINSTANCE 参数非常重要,可以由您尝试启动的可执行文件的代码使用。您不能只提供一些随机值并期望它起作用。您可以检索 Java 进程的 HINSTANCE,但我怀疑您不会喜欢这个结果。
假设您成功调用了程序的 WinMain。这个程序会期望一些东西在那里(见WinMain
特殊部分)。其中,GetCommandLine()
API 函数的结果,可以在你的 C++ 程序中使用。
是否可以从 java 调用 WinMain ?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个入口点是这个函数的.dll
您是否试图“启动”一个 DLL,其入口点是 WinMain?我猜是哪里出了问题。WinMain
或者main
是 Windows 上进程的标准入口点,而不是 DLL。DLL 入口点通常DllMain
具有不同的原型。
我不知道为什么您需要在与 Java 启动器相同的进程中启动可执行文件,但我相信您做错了什么。
通过JNA应该可以:
然而,它对我来说仍然像是一种设计气味......为什么要从 Java 程序调用 WinMain(标准 Windows 应用程序入口点)?为什么不只是Runtime.exec()呢?