如何获取正在运行的进程的命令行参数

时间:2008-10-23 02:57:06

标签: flex flexbuilder

在我的程序中,我使用时遇到错误 mxmlc的命令行编译命令。该错误与a有关 嵌入式字体名称未被flex正确识别 系统字体列表。

然而,一时兴起,我决定将代码复制到Flex Builder和 在那里编译。令我惊讶的是,它起作用了,它找到了正确的 字体使用我给出的相同系统名称(PMingLiU)。

我怀疑我的问题可能是一个语言环境,我的系统不能 由于区域设置考虑,请正确识别字体名称。

我已经尝试将编译代码的语言环境设置为en_US,为no 无济于事。所以我想问一下,如果有人知道Flex Builder如何调用MXML编译器,以及与直接运行mxmlc相比有什么不同?我们知道它没有直接使用mxmlc.exe,因为我们尝试用我们自己的可执行文件替换mxmlc来捕获命令行参数。

如果重要,使用的操作系统是Windows XP。

1 个答案:

答案 0 :(得分: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是我的首选语言,这需要你安装适用于Windows的Ruby解释器,你可以使用One-Click Ruby Installer for 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结构中导航。

考虑到问题的性质以及没有关于开发操作系统的更多信息,这是我能做的最好的事情。如果这解决了您的问题,我可能会建议您编辑您的帖子,以便面临类似问题的人可以找到此解决方案。像“如何获取正在运行的进程的命令行参数”之类的标题可能更合适。