2

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

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

我怀疑我的问题可能是语言环境问题,并且由于语言环境的考虑,我的系统无法正确识别字体名称。

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

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

4

1 回答 1

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 结构中导航的麻烦。

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

于 2008-10-23T06:05:11.640 回答