从Java调用WinMain:可能吗?任何其他方式
Calling WinMain from Java : Possible ? Any other way?
我如何从java调用此方法:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
是否可以从java调用WinMain?我希望该函数中参数的值与直接运行 c++ 程序时的值相同。我想链接一个入口点是此功能的.dll
。
出于多种原因,这是一个坏主意。
WinMain
很特别
像main
或DllMain
一样,这些功能要说的比看起来的要多。
与幼稚的方法相反,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
您是否正在尝试"启动"一个入口点为 WinMain 的 DLL?我想某处有问题。 WinMain
或main
是 Windows 上进程的标准入口点,而不是 DLL。DLL 入口点通常是具有不同原型的DllMain
。
结论
我不知道为什么你需要在与Java启动器相同的进程中启动可执行文件,但我相信你做错了什么。
就像mikera在他的回答中写的那样,你最好使用Java API来启动一个进程。
应该可以通过 JNA 实现:
- http://en.wikipedia.org/wiki/Java_Native_Access
然而,对我来说,它仍然像是一种设计气味.....为什么要从Java程序调用WinMain(标准的Windows应用程序入口点)?为什么不只用 Runtime.exec() 代替呢?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 如何在不进行任何其他修改的情况下"pretty print" C++的XML字符串?
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- 如何使用"std::multimap"或任何其他容器对多个值进行排序?
- 如何在任何其他全局变量或静态变量之前创建/构造类实例
- SSO在STD :: String以外的任何其他标准库容器中使用
- OpenCV将一种颜色转换为任何其他颜色
- 如何使用QT或Linux上的任何其他CPP框架播放WMA音频文件
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- "size_t"是否始终是"vector<int>::size_type"或任何其他容器类型的别名?
- 来自没有默认构造函数的超级类的子类,而无需调用任何其他构造函数
- 我们还能使用任何其他方法来访问Android中的C 代码,而不是使用JNI访问C 代码
- 如何在 ubuntu 中单击任何其他歌曲后停止当前播放的歌曲
- 如何检查数组是否等于任何其他数组C++
- 我如何使用OCI或任何其他LIB登录Oracle作为SYS帐户
- 默认的Qt控制台应用程序不会"Hello World"...或做任何其他事情
- -fno elide构造函数是否包含在-O0或任何其他优化级别中