Как получить аргументы командной строки для запущенного процесса
-
04-07-2019 - |
Вопрос
В моей программе я получаю сообщение об ошибке при использовании команда компиляции командной строки для mxmlc. Ошибка связана с имя встроенного шрифта неправильно идентифицируется с помощью flex в список системных шрифтов.
Однако по прихоти я решил скопировать код в Flex Builder и скомпилируйте это там. К моему удивлению, это сработало и нашло шрифт с использованием того же имени системы, которое я дал (PMingLiU).
Я подозревал, что моя проблема может быть языковой, и что моя система не может правильно определить имя шрифта из соображений локали.
Я попытался установить локаль кода компиляции в en_US, в нет помогло. Поэтому я хотел бы спросить, знает ли кто-нибудь здесь, как именно Flex Builder вызывает компилятор MXML и какие различия по сравнению с прямым запуском mxmlc? Мы знаем, что он не использует mxmlc.exe напрямую, так как мы попытались заменить mxmlc на наш собственный исполняемый файл для захвата параметров командной строки. Р>
Если это имеет значение, используется ОС Windows XP.
Решение
Хотя у меня нет точного ответа на ваш вопрос (какие аргументы командной строки Flex Builder передает в mxmlc.exe), у меня есть мета-ответ для вас. Вы можете найти командную строку одним из двух способов.
Первый не зависит от платформы, но потребует от вас компиляции небольшой программы на C ++. Я использовал этот подход раньше, когда решал подобные проблемы. Что вы можете сделать, это создать приложение-оболочку, которое просто выводит командную строку в файл. Создайте это приложение и поместите его в качестве временной замены для вашего mxmlc.exe, и когда Flex Builder выполнит его, вы сможете получить доступ к полученному файлу " cmdline.txt " чтобы получить полную командную строку, с которой она была вызвана:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream cmdLine;
cmdLine.open("cmdline.txt");
for (int i = 0; i < argc; i++) {
cmdLine << argv[i];
if (i < argc)
cmdLine << " ";
}
cmdLine.close();
return 0;
}
Если вы не уверены, что можете использовать этот подвох во Flex Builder, есть альтернатива, если вы работаете в Windows. Вы можете использовать WMI , чтобы перебрать все запущенные процессы и получить информацию об их командной строке. Ruby - мой любимый язык, для этого потребуется установить интерпретатор Ruby для Windows, что можно легко сделать с помощью One- Нажмите Установщик Ruby для Windows .
После установки просто запустите этот скрипт, как только Flex Builder запустит вашу сборку:
require 'win32ole'
wmi = WIN32OLE.connect("winmgmts://")
processes = wmi.ExecQuery("select * from win32_process")
for process in processes do
cmdLine = process.CommandLine
puts "Command line: #{cmdLine}" if cmdLine =~ /mxmlc/
end
Я добавил регулярное выражение, чтобы выводить командную строку только для процессов, которые были запущены с " mxmlc " в командной строке (которая должна работать для ваших нужд). Для более общего решения итерации по каждому процессу просто удалите предложение if в конце строки, содержащей:
puts "Command line: #{cmdLine}" if cmdLine =~ /mxmlc/
Это избавит вас от головной боли при выполнении низкоуровневой магии с StartRemoteThread и навигации по структурам PEB.
Это лучшее, что я мог сделать, учитывая природу вашего вопроса и без дополнительной информации о вашей операционной системе. Если это решит вашу проблему, я могу предложить вам отредактировать ваш пост, чтобы люди, сталкивающиеся с похожими проблемами, могли найти это решение. Заголовок, подобный " Как получить аргументы командной строки для запущенного процесса " может быть более подходящим.