Как получить аргументы командной строки для запущенного процесса

StackOverflow https://stackoverflow.com/questions/228386

  •  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.

Это лучшее, что я мог сделать, учитывая природу вашего вопроса и без дополнительной информации о вашей операционной системе. Если это решит вашу проблему, я могу предложить вам отредактировать ваш пост, чтобы люди, сталкивающиеся с похожими проблемами, могли найти это решение. Заголовок, подобный " Как получить аргументы командной строки для запущенного процесса " может быть более подходящим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top