如何从java调用此方法:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
是否可以从java调用WinMain?我希望该函数中的参数值与直接运行c ++程序时的值相同。我想链接一个.dll
,其入口点是此函数。
答案 0 :(得分:3)
出于多种原因,这是一个坏主意。
WinMain
很特别与main
或DllMain
一样,这些功能可以说比看上去更多。
与天真的方法相反,WinMain
不是堆栈上的“第一”函数。它是代码开发人员可编写的第一个函数。但如果你进行调试,你会发现WinMain
之前和之后有很多事情发生。
其中包括构建/销毁C ++全局对象,使用atexit
C API注册的函数等,但您可以确定那里有很多特定于Windows平台的事件。
然后,如果它是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启动器相同的进程中启动可执行文件,但我相信你做错了什么。
答案 1 :(得分:2)
应该可以通过JNA:
然而,它似乎仍然是一种设计气味......为什么你要从Java程序中调用WinMain(标准的Windows应用程序入口点)?为什么不只是Runtime.exec()呢?