每天研究整周后(自上周一,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;
}
答案 0 :(得分:1)
问题是GetFullPathName()
没有返回文件的完整路径,因为只提供了文件名,而不是扩展名。添加扩展程序后,它将返回文件的绝对路径,ShellExecute()
将能够打开它。