为什么ShellExecute不能与包含文件路径的LPCSTR变量一起使用?

时间:2016-06-06 18:07:31

标签: c++ shellexecute

每天研究整周后(自上周一,2016-05-30),测试了各种“解决方案”并已经建立了数百次程序,我终于设法编写了这个代码,不会抛出任何错误或警告和在main.cpp文件夹中找到.txt文件路径,使用正斜杠成功替换反斜杠并打开准备编辑的文本文件。

在使用LPCSTR编写部分之前,当我尝试在path中使用字符串变量ShellExecute()而不是手动编写路径时,错误就丢失了:

cannot convert 'std::string {aka std::basic_string<char>}' to 'LPCSTR {aka const char*}' for argument '3' to 'HISTANCE__* ShellExecuteA(HWND, LPCSTR, LPCSTR... [文档]

现在找到路径并完全替换斜线,但不打开.txt文件。

另外,我测试了函数CreateProcess(),但我设法打开(在代码中手动编写的路径)只有.exe文件,而不是.txt。当我尝试使用字符串变量调用函数时(在第一个参数,应该是LPCSTR),我得到了相同的错误,然后做了相同的解决方案(对于错误),如此处所示,CreateProcess()没有打开.exe文件(例如,notepad.exe)。

我使用GNU GCC编译器,计算机操作系统是32位,Windows。

编辑:在.txt中向"Text"添加GetFullPathName(),问题已解决(感谢Andy):

GetFullPathName("Text.txt", 256, szDir, &fileExt);

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <shellapi.h>
#include <stdio.h>
#include <cstring>

using namespace std;

string path; //global variable

void FindFilePath()
{
    char szDir[256], buffer[256];
    char* fileExt;
    GetFullPathName("Text", 256, szDir, &fileExt);
    snprintf(buffer, 256, "\"%s\"", szDir); //EDIT: quotes aren't necessary
    path = buffer;
    string find("\\"), insert("/");
    int found = path.find(find);
    while (found >= 0) {
        if (found >= 0)
            path.replace(found, find.size(), insert);
        found = path.find(find);
    }
    /*
    If path.find(find) didn't find required symbol, for example,
    when string ends, it returns -1 and consequently terminates with
    an error 'std::length_error'.
    EDIT: replacing isn't necessary.
    */
    LPCSTR path2;
    {
        path2 = path.c_str();
        ShellExecute(GetDesktopWindow(), "edit", path2, NULL, NULL, SW_SHOW);
        cout << "TEST path2:\n" << path2 << endl;
    }
}

int main()
{
    ofstream REtext("Text.txt");
    REtext.close();
    //Created (so that program could find path) or
    //restarted text file (so that user had an empty file) in main.cpp folder.
    FindFilePath();
    cout << "\nPath is: " << path;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题是GetFullPathName()没有返回文件的完整路径,因为只提供了文件名,而不是扩展名。添加扩展程序后,它将返回文件的绝对路径,ShellExecute()将能够打开它。