2

我的问题是我需要获取 FOOBAR2000 的标题,因为其中包括播放文件的信息,所以我通过 Win32 API( GetWindowText(), EnumWindows()) 创建了一个执行文件,它运行良好。

TCHAR SearchText[MAX_LOADSTRING] = _T("foobar2000");

BOOL CALLBACK WorkerProc(HWND hwnd, LPARAM lParam)
{
    TCHAR buffer[MAX_TITLESTRING];

    GetWindowText(hwnd, buffer, MAX_TITLESTRING);
    if(_tcsstr(buffer, SearchText))
    {
        // find it output something
    }

    return TRUE;
}

EnumWindows(WorkerProc, NULL);

输出看起来像“专辑封面标题.... [foobar2000 v1.1.5]

我创建了一个像 test.php 这样的 php 文件,并使用exec()它来执行它。

exec("foobar.exe");

然后在控制台(cmd)中我使用命令来执行它

php test.php

它也很好用,输出和以前一样。

现在我用浏览器(firefox)调用这个php文件(test.php),奇怪的事情发生了。输出只有foobar2000 v1.1.5,其他信息不见了...

我想也许是exec()问题?优先级或某些限制,所以我使用 C# 创建一个 COM 对象并注册它,并重写 php 代码

$mydll = new COM("FOOBAR_COMObject.FOOBAR_Class");
echo $mydll->GetFooBarTitle();

结果仍然相同,命令行正常,但浏览器失败。

我的问题是

  1. 为什么命令行和浏览器之间有 2 个不同的输出。我想不通。
  2. 如何通过浏览器获得正确的输出。
  3. 或者有一种简单的方法来获取 FOOBAR2000 的标题?

有没有人有这个问题的经验?

== 2012/11/28 编辑 ==

按照Enno的意见,我修改http_control插件添加文件名信息,原来的json信息是“曲目标题”。

修改如下

state.cpp 第 380 行添加 1 行

+pb_helper1 = pfc::string_filename(pb_item_ptr->get_path());
 pb_helper1x = xml_friendly_string(pb_helper1);
4

2 回答 2

0

如果您的网络服务器作为服务运行,则在 Windows 中您需要为该服务启用“允许桌面交互”。当通过浏览器请求时,您的 php 脚本作为网络服务器进程的子进程运行。

于 2012-11-25T01:35:33.207 回答
0

@ 1:当firefox打开php并执行时,上下文取决于运行php-container(apache)的用户,这与在您的上下文中执行的命令行调用完全不同

@ 2 和 3:获取标题的方法似乎不止一种:使用 foobar-sdk 并创建一个模块,该模块只需读取每个 api 的当前标题,然后将结果写入 http 内的静态 html 文档-root-folder 或者使用 sdk 中的 http-client,有了它,你不需要 wabserver,最好使用已经实现的模块:例如 foo_upnp 或 foo-httpcontrol

祝你好运!

于 2012-11-25T01:40:13.510 回答