Как получить аргументы командной строки для запущенного процесса - PullRequest
2 голосов
/ 23 октября 2008

В моей программе я получаю сообщение об ошибке при использовании команда компиляции командной строки для mxmlc. Ошибка связана с имя встроенного шрифта неправильно идентифицируется с помощью flex в список системных шрифтов.

Однако по прихоти я решил скопировать код в Flex Builder и скомпилируйте это там. К моему удивлению, это сработало и нашло шрифт с использованием того же имени системы, которое я дал (PMingLiU).

Я подозревал, что моя проблема может быть языковой, и что моя система не может правильно определить имя шрифта из соображений локали.

Я попытался установить локаль кода компиляции в en_US, в нет помогло. Поэтому я хотел бы спросить, знает ли кто-нибудь здесь, как именно Flex Builder вызывает компилятор MXML и какие различия по сравнению с прямым запуском mxmlc? Мы знаем, что он не использует mxmlc.exe напрямую, так как мы попытались заменить mxmlc на наш собственный исполняемый файл для захвата параметров командной строки.

Если это имеет значение, используется ОС Windows XP.

1 Ответ

1 голос
/ 23 октября 2008

Хотя у меня нет точного ответа на ваш вопрос (какие аргументы командной строки 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, что можно легко сделать с помощью установщика Ruby One-Click для Windows 1009 *.

.

После установки просто запустите этот скрипт, как только 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.

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

...