【问题标题】:Initialise wchar_t with dynamic length用动态长度初始化 wchar_t
【发布时间】:2012-06-06 16:58:32
【问题描述】:

首先我必须提到,我是一个绝对的 C++ 初学者,所以不要扔石头。我想在 ShellExecute 的帮助下杀死一个外部程序并尽可能简单地删除一个日志文件。在 linux 上我可以使用系统(并且它运行良好),但在 windows 上会弹出一个烦人的 dosbox。在很多谷歌的帮助下,我设法编写了这段代码:

wchar_t command[1024] = L"b";
swprintf_s(command, _countof(command), L"/C TASKKILL /IM ExternalProgram.exe /F & del \"%S\"", logFilePath);
ShellExecute( NULL, L"open", L"cmd.exe", command, NULL, SW_HIDE );

logFilePath 是字符。只要我使用短路径 e,此代码就可以工作。 G。 c:\MyProgram\logfile.txt。如果日志文件的路径较长 e. G。 c:\program files\My Program\anything\more\xxx\...\logfile.txt 程序崩溃。我知道,1024 是变量的最大长度,但是我如何告诉 C 我不知道长度?

我试图通过使用strlen(logFilePath)+50 来解决它,但这只会给我编译错误。正确的方法是什么?

【问题讨论】:

    标签: c++ windows visual-c++ shellexecute wchar-t


    【解决方案1】:

    有很多方法可以做到这一点。我只是告诉你我会做什么,而不是给你 15 个选项:

    #include <sstream>
    
    std::wstringstream strStream;
    strStream << L"/C TASKKILL /IM ExternalProgram.exe /F & del \"" << logFilePath << L"\"";
    std::wstring command = strStream.str();
    ShellExecute( NULL, L"open", L"cmd.exe", command.c_str(), NULL, SW_HIDE );
    

    这种方式多一点 C++ 一点,少一点 Cish。

    哦,并且要解决您的尝试不起作用的原因:如果它们是在堆中分配的,则只能拥有动态大小的数组(大小在运行时确定的数组)。你必须这样做......

    wchar_t* command = new wchar_t[strlen(logFilePath)+50];
    //...
    delete [] command;
    

    【讨论】:

    • 我使用了您的第二个解决方案。我想,在进入 c++ish 魔法之前,我会先从 cish 开始。谢谢!
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多