C ++编程打开外部exe(用于处理协议)

时间:2012-05-17 20:22:16

标签: c++ firefox sip

我已经下载了一款名为Express Talk的软电话,这个程序缺少的是能够轻松点击使用sip协议进行拨号的功能。所以我想我会尽我所能创建一个简单的c ++程序,接受点击后的数字,然后将该信息传递给Express Talk以自动拨打该号码,我尝试了一些通常会导致我死亡的事情结束。我对c ++并不太熟悉,所以希望有人可以帮我弄清楚出了什么问题,该文件位于C:/ Program Files / NCHSoftware / Talk / talk.exe。为了使用命令行拨号,我可以输入/talk.exe -dial“5555555555”,这将打开程序并拨打该号码。

此程序有效,名为dial.exe(与talk.exe位于同一文件夹中):

    #include <stdlib.h>
    #include <windows.h>

    int main ()
    {
        system("start talk.exe -dial 5555555555");
    }

现在的问题:如果我指示firefox(12.0)来处理拨打到dial.exe的链接,然后尝试单击一个sip链接我收到错误:“Windows找不到'talk.exe'。确保键入了正确命名,然后再试一次“

此时我甚至不关心将电话号码变量传递给talk.exe,因为我只想确保在点击一个SIP链接时它会打开。我想也许是因为找到talk.exe有困难的原因是因为某些原因mozilla可能会改变程序的目录?我不太确定,所以现在我试图将talk.exe的完整路径放在程序中,所以我试过了

    #include <stdlib.h>
    #include <windows.h>

    int main ()
    {
        system("start \"C:\\Program Files\\NCHSoftware\\Talk\\talk.exe -dial 5555555555\"");
    }

所有这一切都是打开命令提示符窗口而不实际执行程序。当然,如果我能以某种方式在firefox上的应用程序窗口中传递参数,这一切都可以解决,但这是不允许的。任何人都可以协助我调试吗?我只是不知道该怎么做。

以下是当前代码:

    #include <stdlib.h>
    #include <windows.h>
    #include <direct.h>
    #include <string.h>
    #include <string>


    //Written to implement click-to-dial functionality for soft phones (assuming softphones allow arguments to be passed to dial the phone.)
    int main ()
    {
        _chdir("C:\\Program Files\\NCHSoftware\\Talk\\");
    if (argc > 1 && _strnicmp(argv[1], "sip:", 4))
        { // match "sip:" prefix, case insensitive
     std::string cmd = "start talk.exe -dial " + std::string(argv[1]+4);
     system(cmd.c_str());
    }
    }

3 个答案:

答案 0 :(得分:0)

你的引言位置错误:

system("start \"C:\\Program Files\\NCHSoftware\\Talk\\talk.exe\" -dial 5555555555");

答案 1 :(得分:0)

Windows命令处理器start命令有一个怪癖,这使得使用包含空格的命令行变得困难。

如果第一个参数包含在空格中,则将其视为标题,而不是命令。解决方案是提供引用的虚拟标题:

system("start \"caption\" \"C:\\Program Files\\NCHSoftware\\Talk\\talk.exe\" -dial 5555555555");

或者,只需事先更改工作目录:

#include <direct.h>
#include <string.h>
#include <string>

_chdir("C:\\Program Files\\NCHSoftware\\Talk\\");
if (argc > 1 && _strnicmp(argv[1], "sip:", 4)) { // match "sip:" prefix, case insensitive
    std::string cmd = "start talk.exe -dial " + std::string(argv[1]+4);
    system(cmd.c_str());
}

答案 2 :(得分:0)

最好的方法是使用Windows API。

查看MSDN文档中的CreateProcess()示例:

http://msdn.microsoft.com/en-us/library/ms682512.aspx