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

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

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

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

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

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


person Roy Tang    schedule 23.10.2008    source источник


Ответы (1)


Хотя у меня нет точного ответа на ваш вопрос (какие аргументы командной строки 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.

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

person rboyd    schedule 23.10.2008