Вызов WinMain из Java: возможно? Любым другим путем?
Как мне вызвать этот метод из Java:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
Можно ли вызвать WinMain из Java? Я хочу, чтобы значение аргументов в этой функции было таким же, как при непосредственном запуске программы на С ++. Я хочу связать .dll
чья точка входа будет этой функцией.
2 ответа
Это плохая идея по нескольким причинам.
WinMain
особенный
подобно main
или же DllMain
эти функции могут сказать больше, чем кажется.
Вопреки наивному подходу, WinMain
не является "первой" функцией в стеке. Это первая функция, доступная для записи разработчиком кода. Но если вы перейдете к отладке, вы увидите, что многое происходит до и после WinMain
,
Среди них создание / уничтожение глобальных объектов C++, функции, зарегистрированные в atexit
C API и т. Д., Но вы можете быть уверены, что там много чего происходит, специфично для платформы Windows.
Тогда, если это WinMain
Скорее всего, у вас есть цикл сообщений где-то внутри. Это может помешать вашему собственному (ваше приложение Java - приложение с графическим интерфейсом?)
HINSTANCE не является обязательным
Какие значения параметров вы дадите WinMain
?
Первый параметр HINSTANCE очень важен и может использоваться кодом исполняемого файла, который вы пытаетесь запустить. Вы не можете просто указать какое-то случайное значение и ожидать, что оно сработает. Вы можете получить HINSTANCE вашего Java-процесса, но я подозреваю, что вам не понравится результат.
Скрытые переменные не являются обязательными
Допустим, вам удалось вызвать WinMain программы. Эта программа ожидает, что некоторые вещи будут там (см. WinMain
это специальный раздел). Среди них результат GetCommandLine()
API-функция, которая может быть использована в вашей программе на C++.
WinMain для процессов, а не DLL
Можно ли вызвать WinMain из Java? Я хочу, чтобы значение аргументов в этой функции было таким же, как при непосредственном запуске программы на С ++. Я хочу связать.dll, точка входа которой будет этой функцией
Вы пытаетесь "запустить" DLL, чья точка входа WinMain? Я думаю, что-то где-то не так. WinMain
или же main
являются стандартными точками входа в Windows для процессов, а не DLL. Точка входа DLL обычно DllMain
которые имеют другой прототип.
Заключение
Я не знаю, почему вам нужно запускать свой исполняемый файл в том же процессе, что и Java Launcher, но я считаю, что вы делаете что-то не так.
Как mikera написал в своем ответе, вам лучше использовать Java API для запуска процесса.
Это должно быть возможно через JNA:
Однако это все еще кажется мне запахом дизайна... зачем вам вызывать WinMain (стандартную точку входа в приложение Windows) из Java-программы? Почему бы просто не запустить Runtime.exec()?